♪ 학습 내용
HTTP 응답 / HTTP 메시지 컨버터
* HTTP 응답
스프링에서 응답 데이터를 만드는 방식은 총 3가지이다.
( 정적 리소스 / 뷰 템플릿 사용 / HTTP 메시지 )
정적 리소스
정적 리소스는 말 그대로 웹 브라우저에 정적 HTML CSS JS를 제공할 때 사용되는 것이다.
파일을 변경하지 않고 그대로 서비스하기 때문에 웹 브라우저 url 경로 입력하고 바로 실행하면 된다.
마치 src/main/resources/static/index.html 처럼.
뷰 템플릿
스프링이 제공하는 뷰 템플릿의 기본 경로는 다음과 같다.
src/main/resources/templates
ModelAndView를 생성하며 논리 이름을 넘겨 뷰 템플릿을 호출하거나 ,
Model에 데이터를 담고 논리 이름을 바로 반환해서 뷰 템플릿을 호출!
이때는 당연히 @ResponseBody를 사용하면 안된다.
사용하면 뷰 리졸버 실행하지 않고, 반환값이 바로 HTTP 메시지 바디에 입력되기 때문 !!
이처럼 void로 반환하고 / @Controller가 있고 / HTTP 메시지 바디 처리 파라미터가 없으면
매핑되는 요청 URL을 논리 뷰 이름으로 사용한다. ( templates/response/hello.html )
이 방식은 권장하지는 않는다!
HTTP 메시지 바디에 직접 입력
return new ResponseEntity<>("ok",HttpStatus.OK);
HttpEntity를 상속받은 ResponseEntity.
Http 응답 메시지 바디를 설정할 뿐만 아니라 응답 코드도 설정 가능!!
@ResponseBody 를 이용하면 HTTP 응답 코드를 설정하기 까다롭기 때문에
@ResponseStatus 애노테이션을 사용하여 응답 코드 설정을 해주었다.
* HTTP 메시지 컨버터
HTTP 메시지의 바디를 읽거나 쓰는 경우에 HTTP 메시지 컨버터가 동작한다는 것을 학습했다.
@RequestBody , HttpEntity(RequestEntity) / @ResponseBody , HttpEntity(ResponseEntity) 시에.
컨버터 동작원리
Http 요청 데이터를 읽을 때 컨트롤러가 RequestBody 나 HttpEntity 파라미터를 사용하면
우선순위 순으로 컨버터들이 돌아가며 다음 두가지 조건을 확인 . canRead()
1. 대상 클래스 타입을 지원하는가 ?
2. HTTP 요청 헤더의 Content-Type 미디어 타입을 지원하는 가?
만족하는 컨버터는 read()를 호출하며 동작. -> 객체를 생성, 반환
Http 응답 데이터를 생성할 때는 컨트롤러가 @ResponseBody 나 HttpEntity 사용.
canWrite() 호출 --> 두가지 확인
1. 대상 클래스 타입 지원?
2. HTTP 요청의 Accept 미디어 타입 지원?
만족하는 컨버터 write() 호출. -> 메시지 바디에 데이터 생성
HTTP 메시지 컨버터는 스프링 MVC의 RequestMappingHandlerAdapter가 동작할때 사용된다.
ArgumentResolver 는 핸들러 어댑터가 호출하면 핸들러에 맞는 파라미터를 생성하고 반환한다.
이 생성객체를 파라미터로 어댑터가 핸들러를 호출.
( HttpServletRequtest , Model , @RequestParam , @RequestBody ,,, 등을 기반으로)
ReturnValueHandler도 비슷하게 응답 값을 변환하고 처리한다.
( ModelAndView , @ResponseBody , @HttpEntity를 기반으로)
컨버터는 언제 사용?
요청의 경우에는 ArgumentResolver 로 일반적으로 쓰고 처리하는데,
Http 컨버터를 필요로 하는 @RequestBody나 HttpEntity가 있으면 (메시지 바디의 내용을 변환 시)
ArgumentResolver가 Http 컨버터로 반환된 것을 어댑터에게 반환, 핸들러에게 파라미터로 넘긴다.
응답의 경우도 ReturnValueHandler가 컨버터를 호출.
♪ 다음 학습 내용
스프링 MVC 예제 - 웹 페이지 만들기
'Dev > Spring' 카테고리의 다른 글
[Spring] Spring 프로젝트 생성 및 설정 (0) | 2023.03.05 |
---|---|
[Spring MVC 1] 스프링 MVC 웹 페이지 만들기 (1) | 2023.02.17 |
[Spring MVC 1] 스프링 MVC-기능 (3) (0) | 2023.02.07 |
[Spring MVC 1] 스프링 MVC-기능 (2) (0) | 2023.02.02 |
[Spring MVC 1] 스프링 MVC-기능 (1) (0) | 2023.02.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!