Continuous Challenge

12. 스프링 MVC 기본 기능 (2) - HTTP 요청 본문

Spring/Spring MVC

12. 스프링 MVC 기본 기능 (2) - HTTP 요청

응굥 2022. 5. 11. 21:56
728x90
728x90

HTTP 요청 - 기본, 헤더 조회

MultiValueMap

  • Map과 유사한데 하나의 키에 여러 값을 받을 수 있다.
  • Http header, HTTP 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용한다.
    - keyA=value1&keyA=value2
참고
@Controller 의 사용 가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

@Controller 의 사용 가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types

 

HTTP 요청 파라미터

  1. 쿼리 파라미터(GET), HTML Form(POST)
  2. @RequestParam
    - HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
    - String, int, Integer 등의 단순 타입이면 @RequestParam도 생략 가능
       * 그래도 애노테이션 사용을 권장
  3. @ModelAttribute
    - 요청 파라미터의 이름으로 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
    - @ModelAttribute는 생략할 수 있다.
       * 스프링은 해당 부분 생략 시 다음과 같은 규칙을 적용한다.
         . String, int, Integer 같은 단순 타입 = @RequestParam
         . 나머지 = @ModelAttribute (argument resolver로 지정해둔 타입 외)
  4. 단순 텍스트
    - 요청 파라미터와 다르게 HTTP 메시지 바디를 통해 직접 데이터가 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없다. (물론 HTML Form 형식으로 전달되는 경우는 요청 파라미터로 인정된다.)
    - HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
    - @RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
      참고로 헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용하면 된다.
    이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam, @ModelAttribute와는 전혀 관계가 없다.
  5. JSON
    - HttpEntity, @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다. 
    - @RequestBody는 생략 불가능 (생략하면 @ModelAttribute 로 인식)
    - 응답의 경우에도 @ResponseBody 를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.
       물론 이 경우에도 HttpEntity를 사용해도 된다.

HTTP 응답 - 정적 리소스, 뷰 템플릿

String을 반환하는 경우 - View or HTTP 메시지

  • @ResponseBody가 없으면 response/hello 로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다.
  • @ResponseBody가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에 직접 response/hello 라는 문자가 입력된다.

Void를 반환하는 경우

  • @Controller를 사용하고, HttpServletResponse, OutputStream(Writer)같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용
  • 이 방식은 명시성이 떨어지는 등의 이유로 권장하지 않음

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

@RestController

@Controller 대신에 @RestController 애노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody가 적용되는 효과가 있다.

따라서 뷰 템플릿을 사용하는 것이 아니라 HTTP 메시지 바디에 직접 데이터를 입력한다. 이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다.

(참고로 @ResponseBody는 클래스 레벨에 두면 전체 메서드에 적용되는데 @RestController 애노테이션 안에 @ResponseBody가 적용되어 있다.)

 

HTTP 메시지 컨버터

@ResponseBody 사용 시

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리 : StringHttpMessageConverter
  • 기본 객체처리 : MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

스프링 MVC가 HTTP 메시지 컨버터를 적용하는 경우

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

 

요청 매핑 핸들러 어댑터 구조

ArgumentResolver

정확히는 HandlerMethodArgumentResolver 이다.

동작 방식

ArgumentResolver의 supportsParameter()를 호출해서 해당 파라미터를 지원하는지 체크하고, 지원하면 resolveArgument()를 호출해서 실제 객체를 생성한다. 그리고 이렇게 생성된 객체가 컨트롤러 호출 시 넘어간다.

 

ReturnValueHandler

정확히는 HandlerMethodReturnValueHandler 이다.

 

728x90
728x90

'Spring > Spring MVC' 카테고리의 다른 글

11. 스프링 MVC 기본 기능 (1) - 로깅, 요청 매핑  (0) 2022.05.06
10. 스프링 MVC 구조 이해  (0) 2022.05.03
9. MVC 프레임워크 만들기  (0) 2022.05.01
8. MVC 패턴  (0) 2022.04.27
7. 서블릿  (0) 2022.04.25
Comments