Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Python
- Secure Coding
- inflearn
- 자바공부
- 스프링 부트와 JPA
- 김영한
- java
- 불친절한SQL프로그래밍
- 스프링 핵심원리
- 스프링
- 자바의정석 연습문제
- docker
- 시큐어코딩
- 불친절한 SQL 프로그래밍
- Java의정석
- 인프런
- 자바의정석
- 이것이자바다
- DispatcherServlet
- REGEXP_SUBSTR
- Numpy
- 제네릭
- 계층 쿼리
- 서블릿
- Spring
- 분석함수
- 자바연습문제
- 스프링MVC
- 스프링입문
- JPA
Archives
- Today
- Total
Continuous Challenge
12. 스프링 MVC 기본 기능 (2) - HTTP 요청 본문
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 요청 파라미터
- 쿼리 파라미터(GET), HTML Form(POST)
- @RequestParam
- HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
- String, int, Integer 등의 단순 타입이면 @RequestParam도 생략 가능
* 그래도 애노테이션 사용을 권장 - @ModelAttribute
- 요청 파라미터의 이름으로 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
- @ModelAttribute는 생략할 수 있다.
* 스프링은 해당 부분 생략 시 다음과 같은 규칙을 적용한다.
. String, int, Integer 같은 단순 타입 = @RequestParam
. 나머지 = @ModelAttribute (argument resolver로 지정해둔 타입 외) - 단순 텍스트
- 요청 파라미터와 다르게 HTTP 메시지 바디를 통해 직접 데이터가 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없다. (물론 HTML Form 형식으로 전달되는 경우는 요청 파라미터로 인정된다.)
- HTTP 메시지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
- @RequestBody를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.
참고로 헤더 정보가 필요하다면 HttpEntity를 사용하거나 @RequestHeader를 사용하면 된다.
이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam, @ModelAttribute와는 전혀 관계가 없다. - 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