녕의 학습 기록

[Spring MVC 1] 스프링 MVC-기능 (4) 본문

Dev/Spring

[Spring MVC 1] 스프링 MVC-기능 (4)

kjyyjk 2023. 2. 8. 21:40

 학습 내용 

HTTP 응답 / HTTP 메시지 컨버터


* HTTP 응답

 

스프링에서 응답 데이터를 만드는 방식은 총 3가지이다.

( 정적 리소스 / 뷰 템플릿 사용 / HTTP 메시지 )

 

정적 리소스

정적 리소스는 말 그대로 웹 브라우저에 정적 HTML CSS JS를 제공할 때 사용되는 것이다.

파일을 변경하지 않고 그대로 서비스하기 때문에 웹 브라우저 url 경로 입력하고 바로 실행하면 된다.

마치 src/main/resources/static/index.html 처럼.

 

뷰 템플릿

스프링이 제공하는 뷰 템플릿의 기본 경로는 다음과 같다.

src/main/resources/templates

 

${data} data를 키로 값을 꺼내 empty 부분 치환

 

 

뷰 템플릿을 호출

 

ModelAndView를 생성하며 논리 이름을 넘겨 뷰 템플릿을 호출하거나 ,

 

Model에 데이터를 담고 논리 이름을 바로 반환해서 뷰 템플릿을 호출!

이때는 당연히 @ResponseBody를 사용하면 안된다.

사용하면 뷰 리졸버 실행하지 않고, 반환값이 바로 HTTP 메시지 바디에 입력되기 때문 !!

 

void로 반환

이처럼 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) 시에.

 

@ResponseBody를 사용하면. 뷰 리졸버가 실행되지 않고 컨버터가 동작한다.

컨버터 동작원리

 

 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 예제 - 웹 페이지 만들기

 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com