-
스프링 부트 정적 리소스
- src/main/resources 경로 아래에 있는 정적 리소스를 제공한다.
- /static, /public, /resources, /META-INF/resources
- 리소스를 보관하는 곳이고, 또 클래스패스의 시작 경로이다.
- 따라서, 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다.
뷰 템플릿
- 동적인 HTML을 만들때 사용한다.(thymeleaf)
- 컨트롤러를 통해 호출한다.
- th:text="${data}" 와 같은 태그를 이용해서 동적으로 변하는 html을 생성할 수 있다.
@Controller
- @Controller이면서 String으로 반환하는 메서드는 return 값이 논리뷰로 반환된다.
void를 반환하는 경우
- @Controller를 사용하고, HttpServletResponse, OutputStream(Writer)와 같은 HTTP 메시지 바디를 처리하는 파라미터가 없으면 요청 URL을 참고해서 논리뷰 이름으로 사용
- @RequestMapping("/response/hello")
- 참고) 이 방식은 명시성이 떨어지므로 권장하지 않는다.
thymeleaf
- 스프링 부트가 자동으로 ThymeleafViewResolver와 필요한 스프링 빈들을 등록한다.
- default값 들을 미리 지정해놓는다(prefix, suffix)
@ResponseStatus
- 상태 코드를 정적으로 설정해주는 어노테이션
- 만약 동적인 상태코드를 만들고 싶다면 ResponseEntity를 사용하면 된다.
@RestController
- @Controller + @ResponseBody + ...
- 클래스 위에 선언 시 해당 클래스 모든 컨트롤러에 적용
HTTP API
- HTTP API를 제공하는 경우 HTML이 아닌 데이터를 보내야하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.
HTTP 메시지 컨버터
- 인터페이스이다.
- 기본 문자 처리 : StringHttpMessageConverter : 객체와 같은 것을 문자로 바꿔주는것
- 기본 객체 처리 : MappingJackson2HttpMessageConverter : JSON -> 객체 or 객체 -> JSON(양방향)
- byte 처리 등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다.(ByteHttpMessageConverter)
- 뷰 템플릿으로 HTML을 생성해서 응답하는 것이 아니라, HTTP API처럼 JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다.
- @ResponseBody 사용
- ViewResolerver 대신 HttpMessageConverter가 동작
- HttpMessageConverter
- JsonConverter, StringConverter 등이 있음
- 응답의 경우 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택된다.
- HTTP 요청, HTTP 응답 둘 다 사용된다.
- canRead(), canWrite() : 메시지 컨버터가 해당 클래스, 미디어타입(content-type)을 지원하는지 체크
- read(), write() : 메시지 컨버터를 통해서 메시지를 읽고 쓰는 기능
- 요청일 때는 contetn-type의 미디어 타입을 조회하고, 응답일 때는 Accept 미디어 타입을 지원하는지 확인한다.
RequestMappingHandlerAdapter
- 요청 매핑 핸들러 어댑터
- HTTP 메시지 컨버터를 사용하는 구간
- DispatcherServlet -> 핸들러 어댑터
- ArgumentResolver를 호출한다.
- 컨트롤러에 필요한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파라미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.
- ex) HttpServletRequest request, Model model, @RequestBody.. etc
ArgumentResolver
- 컨트롤러 파라미터(매개변수)를 처리해준다.
- supportsParameter()를 호출해서 해당 파라미터를 지원하는지 체크
- 지원하면 resolveArgument()를 호출해서 실제 객체를 생성하고 컨트롤러 호출시 넘어간다.
- Http 메시지 컨버터 호출(@RequestBody, HttpEntity)
supportsParameter()
- 현재 파라미터를 resolver가 지원하는지에 대한 boolean 값을 리턴한다.
ReturnValueHandler
- 응답 데이터를 HTTP 메시지에 입력
- HTTP 메시지 컨버터 호출(@ResponseBody, HttpEntity)
확장
- HandleMethodArgumentResolver
- HandleMethodReturnValueHandler
- HttpMessageConverter
- 위 세 클래스 모두 인터페이스이기 때문에 사용자가 언제든지 확장하능하다.
- but) 확장할 일은 거의 없다.