개요: Model, View, Controller 약자로, 웹 어플리케이션을 비즈니스 로직, 프레젠테이션 로직, 데이터로 분리하는 디자인 패턴

+&: 프론트 컨트롤러 패턴

  • 모든 요청을 단일 handler(처리기)에서 처리하도록 하는 패턴
  • 스프링 웹 MVC 프레임워크의 DispatcherServlet(프런트 컨트롤러 역활)이 해당 역활로 구현 됨

  • 비즈니스 로직: 데이터, 즉 고객, 제품, 주문 정보 조작 사용
  • 프로젠테이션: 사용자에게 어떻게 표현되는지
  • 요청 처리 데이터는 비즈니스 로직과 프레젠테이션 파트를 함께 묶음

구성요소

  • 모델: 어플리케이션의 데이터와 비즈니스 로직을 담는 객체
  • 뷰: 사용자에게 모델의 정보(데이터)를 보여주는 역활, 비즈니스 로직을 포함하지 않으면 하나의 모델을 다양한 뷰에서 아용
  • 컨트롤러: 모델과 뷰 사이에 어떤 동작이 있을 때 조정하는 역활, 웹으로부터 받은 요청에 가장 적합한 모델을 생성하는 것을 처리하는 역활과 사용자에게 응답하는 적절한 뷰를 선택하여 해당 모델을 전달하는 역

'Development > JSP' 카테고리의 다른 글

예외 처리, 필터  (0) 2023.05.21
다국어 처리& 시큐리티  (0) 2023.05.18
세션 & 쿠키  (0) 2023.05.10
유효성 검사  (0) 2023.05.10
파일 업로드  (0) 2023.05.09
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    // 정적 컨텐츠
    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        String tmp = "hello";
        return "hello";
    }
    // MVC와 템플릿 엔진
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name")String name,Model model){
        model.addAttribute("name",name);
        return "hello-template";
    }

    // api 방식 문자열 반환
    @GetMapping("hello-string")
    @ResponseBody // http 응답 바디부에 해당 내용을 직접 넣겠다는 어노테이션
    public String helloString(@RequestParam("name") String name){
        return "hello "+name; //"hello spring"
    }
    // api JSON 반환
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name")String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }

    static class Hello{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

정적 컨텐츠

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 매핑되어 있는 컨트롤러가 있는지 탐색
  4. 관련된 컨트롤러가 없다면 resources 디렉토리에서 관련된 항목을 찾아 전달

MVC와 템플릿 엔진

<관심사의 분리 + 타임리프 엔진을 통한 html 변환>

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 매핑되어 있는 컨트롤러 발견
  4. 해당 컨트롤러에서 model에 필요한 데이터를 넣고 return 해야 하는 view의 이름과 model을 viewResolver에게 전달
  5. Thymeleaf 템플릿 엔진이 처리하여 변환한 html을 웹 브라우저에게 반환 

API

@ResponseBody 어노테이션을 활용해 http 응답 바디부에 해당 내용을 직접 넣어 전달

String을 전달해 주어도 좋으나 객체(Class)를 반환하여 JSON 형식으로 전달하는 것이 기본

  1. 웹(클라이언트 요청) url 입력
  2. 톰캣(서버) 
  3. 스프링 컨테이너에서 @ResponseBody 의 매핑되어 있는 컨트롤러 발견 
  4. HttpMessageConverter가 객체(JSON) 혹은 문자열을 웹 브라우저에게 그래도 반환
    1. 문자처리 StringHttpMesaageConverter
    2. 객체처리: MappingJackson2HttpMessageConverter

+ 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 반환 데이터의 타입을 결정

 

 

+ Recent posts