You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@ResponseBody가 없으면 response/hello로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다
@ResponseBody가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에서 직접 response/hello라는 문자가 입력된다
Void를 반환하는 경우
@Controller를 사용하고 HttpServletResponse , OutputStream(Writer) 같은 HTTP 메시지 바디를 처리한느 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용한다
요청 URL: /response/hello
실행 : templates/response/hello.html
명시성이 너무 떨어지고, 이렇게 요청 URL과 실행 경로가 맞는 경우가 많이 없으니 권장하지 않음
3. HTTP 메시지 @ResponseBody, HttpEntity를 사용하면 뷰 템플릿을 사용하지 않고 HTTP 메시지 바디에 직접 응답 데이터를 출력함
Thymeleaf 스프링 부트 설정
build.gradle에 라이브러리가 추가되어 있음 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf
스프링부트가 자동으로 ThymeleafViewResolver 와 필요한 스프링 빈을 등록함
12. HTTP 응답 - HTTP API, 메시지 바디에 직접 입력
HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
여기서 설명하는 내용은 정적 리소스나 뷰 템플릿을 거치지 않고, 직접 HTTP 응답 메시지를 전달하는 경우이다
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
섹션 6. 스프링 MVC - 기본 기능 (3)
11. 응답 - 정적 리소스, 뷰 템플릿
스프링 서버에서 응답 데이터를 만드는 방법은 크게 3가지 이다.
1. 정적 리소스
ex) 웹 브라우저에 정적인 HTML, CSS, JS
스프링 부트는 클래스패스의 다음 디렉토리에 있는 정적 리소스를 변경 없이 그대로 제공한다
/static,/public,/resources,/META-INF/resources2. 뷰 템플릿
뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 프론트로 전달한다
HTML을 동적으로 생성하는 용도로 사용 + 뷰 템플릿이 만들 수 있는 모든 기능
뷰 템플릿 경로
src/main/resources/templates뷰 템플릿 생성
ResponseViewController - 뷰 템플릿을 호출하는 컨트롤러
@ResponseBody- String을 반환하는 경우@ResponseBody가 없으면response/hello로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다@ResponseBody가 있으면 뷰 리졸버를 실행하지 않고, HTTP 메시지 바디에서 직접response/hello라는 문자가 입력된다Void를 반환하는 경우
@Controller를 사용하고HttpServletResponse,OutputStream(Writer)같은 HTTP 메시지 바디를 처리한느 파라미터가 없으면 요청 URL을 참고해서 논리 뷰 이름으로 사용한다/response/hellotemplates/response/hello.html명시성이 너무 떨어지고, 이렇게 요청 URL과 실행 경로가 맞는 경우가 많이 없으니 권장하지 않음
3. HTTP 메시지
@ResponseBody,HttpEntity를 사용하면 뷰 템플릿을 사용하지 않고 HTTP 메시지 바디에 직접 응답 데이터를 출력함12. HTTP 응답 - HTTP API, 메시지 바디에 직접 입력
HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
ResponseBodyController
responseBodyV1
response.getWriter().write("ok")responseBodyV2
ResponseEntity는HttpEntity를 상속 받았다HttpStatus.CREATED로 설정하면 201 응답이 나간다responseBodyV3
@ResponseBody를 사용하면 view를 사용하지 않고, HTTP 메시지 컨버터를 통해 HTTP 메시지를 직접 입력할 수 있다ResponseEntity와 동작 방식이 같다responseBodyJsonV1
ResponseEntity를 반환한다responseBodyJsonV2
@ResponseStatus(HttpStatus.OK)애노테이션을 사용해서@ResponseBody에서 어려운 응답 코드 설정 가능@RestController
@Controller+@ResponseBody13. HTTP 메시지 컨버터
뷰 템플릿으로 HTML 을 생성해서 응답하는 것이 아닌, HTTP API처럼 JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터 사용
스프링 입문 강의에서 설명했던 내용
스프링 MVC가 HTTP 메시지 컨버터를 적용하는 경우
@RequestBody,HttpEntity(RequestEntity)@ResponseBody,HttpEntity(ResponseEntity)canRead(),canWrite(): 메시지 컨버터가 해당 클래스, 미디어타입을 지원하는지 체크read(),write(): 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능스프링 부트 기본 메시지 컨버터

주요 메시지 컨버터 알아보기
ByteArrayHttpMessageConverter: byte[ ] 데이터 처리StringHttpMessageConverter: String 문자로 데이터 처리MappingJackson2HttpMessageConverter: application/json 처리HTTP 요청 데이터 읽기
@RequestBody,HttpEntity파라미터 사용canRead()호출@RequestBody의 대상 클래스 : byte[ ], String, HelloDatacanRead()조건을 만족하면read()호출해서 객체 생성, 반환HTTP 응답 데이터 생성
@ResponseBody,HttpEntity로 값이 반환된다canWrite()호출canWrite()조건을 만족하면write()호출해서 HTTP 응답 메시지 바디에 데이터 생성14. 요청 매핑 핸들러 어댑터 구조
HTTP 메시지 컨버터는 스프링 MVC 어디에서 사용되는 것일까?

아래 그림에서는 보이지 않는다
RequestMappingHandlerAdapter(요청 매핑 헨들러 어뎁터) 에 모든 비밀이 있다

ArgumentResolver
RequestMappingHandlerAdapter는ArgumentResolver를 호출해서 컨트롤러가 필요로 하는 다양한 파라미터(객체) 값을 생성한다. 그리고 파라미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다ArgumentResolver를 기본 제공한다ArgumentResolver 동작 방식
ArgumentResolver의supportsParameter()를 호출해서 해당 파라미터를 지원하는지 체크하고, 지원하면resolveArgument()를 호출해서 실제 객체 생성ArgumentResolver를 만들 수 있다ReturnValueHandler
HandlerMethodReturnValueHandler를 줄여서ReturnValueHandler라 부른다HTTP 메시지 컨버터 위치
HTTP 메시지 컨버터를 사용하는
@RequestBody도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다.@ResponseBody의 경우도 컨트롤러의 반환 값을 이용한다.요청
@RequestBody,HttpEntity를 처리하는ArgumentResolver가 각각 존재한다ArgumentResolver들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성한다응답
@ResponseBody와HttpEntity를 처리하는ReturnValueHandler가 있다확장
HandlerMethodArgumentResolverHandlerMethodReturnValueHandlerHttpMessageConverter스프링이 이미 필요한 기능 대부분을 제공하기에 실제로 기능을 확장할 일은 거의 없다
All reactions