ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 45th day
    TIL(Today I Learned) 2021. 12. 6. 18:19

    스프링 부트 정적 리소스

    • 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) 확장할 일은 거의 없다.

    'TIL(Today I Learned)' 카테고리의 다른 글

    TIL 47th day  (0) 2021.12.08
    TIL 46th day  (0) 2021.12.07
    TIL 44th day  (0) 2021.12.05
    TIL 43th day  (0) 2021.12.05
    TIL 41th day  (0) 2021.12.01
Designed by Tistory.