MVC 기능 2

강한친구·2022년 4월 27일
0

Spring

목록 보기
14/27
post-thumbnail

HTTP 응답데이터

응답 데이터를 만드는 3가지 방법

정적 리소스

예) 웹 브라우저에 정적인 HTML, css, js을 제공할 때는, 정적 리소스를 사용한다.

뷰 템플릿 사용

예) 웹 브라우저에 동적인 HTML을 제공할 때는 뷰 템플릿을 사용한다.

HTTP 메시지 사용

HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.

정적 리소스

정적 리소스는 디렉토리에 있는 정적 리소스를 그대로 공급한다.

localhost:8080/basic/hello-form

뷰 템플릿

일반적으로 HTML 동적 생성에 사용된다. 스프링에서는 기본적으로 template 폴더안에 뷰 템플릿을 제공한다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p th:text="${data}">empty</p>
</body>
</html>

이제 컨트롤러를 통해 이 view data에 모델을 넣고 보여줄것이다.

V1

ModelAndView를 이용하는 기본적인 방식이다.

@RequestMapping("/response-view-v1")
    public ModelAndView responseViewV1() {
        ModelAndView mav = new ModelAndView("response/hello").addObject("data", "hello!");
        return mav;
    }

V2

Model만 사용하는 방식이다.

@RequestMapping("/response-view-v2")
    public String responseViewV2(Model model) {
        model.addAttribute("data", "hello!");
        return "response/hello";
    }

V3

@RequestMapping 에 response/hello를 바로 넣어서 따로 반환하지 않아도 작동하게 할 수 있다.
하지만 권장되지 않는 방법이다.

HTTP 응답 - HTTP API 메시지 바디에 직접 입력

HTML이나 뷰 템플릿을 사용하더라도 결국 바디에 데이터가 담겨서 나간다. 이 항목은 직접 HTTP 응답 메시지를 전달하는 경우를 말한다.

HTTP Message Convertor

뷰 템플릿으로 HTMl 생성해서 응답하는것이 아니라, HTTP API처럼 JSON을 HTTP 바디에서 직접 읽고 쓰거나 할 때 사용되는 기능이다.

스프링 부트는 다양한 메시지 컨버터를 제공한다. 대상 클래스 타입과 미디어 타입을 체크해서 사용여부를 확인하는 방식이다.

0 = ByteArrayHttpMessageConverter
1 = StringHttpMessageConverter 
2 = MappingJackson2HttpMessageConverter

ResponseBody에서의 반환

@ResponseBody가 붙은 Controller가 호출이 되고, Convertor에서 String으로 보낼지, Json으로 보낼지 결정을 해서 보내는 방식이다.

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter

스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.

HTTP 요청: @RequestBody ,HttpEntity(RequestEntity)
HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)

그래서 어디에서 동작하는가?

핸들러 어뎁터인 RequestMappingHandlerAdapter에서 작동하게 된다.

ArgumentResolver

다양한 Argument(매게변수)를 처리해주는 기능이다.
RequestMappingHandlerAdapter에서 ArgumentResolver에게 필요한 파라미터타입을 문의를 한다. 그러면 ArgumentResolver에서 생성을 해주고, RequestMappingHandlerAdapter가 이를 컨트롤러 호출 시 사용하는 것이다.

요청의 경우
@RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver 가 있다.
이 ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.

응답의 경우
@ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다. 그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.

0개의 댓글