ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - HTTP 메시지 컨버터
    Spring/Spring MVC 2022. 1. 30. 14:05
    반응형

     

     

     

     

     

     

    HTTP 메시지 컨버터

     HTTP 메시지 컨버터는 메시지 바디의 데이터 타입에 따라 데이터를 조회하거나 반환할 수 있다.  인터페이스로 구현되어 있으며 Byte, String, JSON 등 여러 타입의 데이터들을 HTTP 메시지 컨버터를 통해 요청 메시지 바디에 있는 데이터들을 조회하여 로직을 처리한 후 클라이언트가 필요한 데이터 타입으로 HTTP 메시지 컨버터를 통해 변환 후 변환된 타입으로 컨트롤러에 전송한다.

     

    • HTTP 요청 메시지 읽기

      요청 메시지가 오면 메시지 컨버터가 메시지를 읽을 수 있는지 확인하기 위해 canRead() 호출
            - canRead : 대상 클래스 타입, content-type을 확인하여 해당 메시지 컨버터 실행
      canRead() 조건을 만족하면 read()를 호출하여 객체 생성 및 반환이 된다.

    •  HTTP 응답 메시지 생성

      메시지 컨버터가 메시지를 쓸 수 있는지 확인하기 위해 canWrite() 호출
            - canWrite : 대상 클래스 타입, HTTP 요청의 Accept content-type 확인하여 해당 메시지 컨버터 실행
      canWrite() 조건을 만족하면 write()를 호출하여 HTTP 응답 메시지 바디에 데이터 반환

     

     


     

     

     

    스프링 부트 기본 메시지 컨버터

     데이터 타입을 변환해주는 메시지 컨버터들은 우선 순위가 지정되어있다. 다음은 우선순위 순서로 나열한 메시지 컨버터이다. 스프링 부트는 대상 클래스 타입과 미디어 타입 등을 체크해서 사용 여부를 결정하는데 만약 처음 메시지 컨버터의 조건을 만족하지 않으면 다음 메시지 컨버터로 우선순위가 넘어간다.

     

    1. ByteArrayHttpHttpMessageConverter
    2. StringHttpMessageConverter
    3. MappingJackson2HttpMessageConverter
    4. ....

     

    ByteArrayHttpHttpMessageConverter

     

    • byte[] 데이터를 처리한다.
    • 클래스 타입: byte[], content-type: */*
    • 요청 예) @RequestBody byte[] data
    • 응답 예) @ResponseBody return byte[], Accept: application/octet-stream

     

    StringHttpMessageConverter

     

    • String 데이터를 처리한다
    • 클래스 타입: String, content-type: */*
    • 요청 예) @RequestBody String data
    • 응답 예) @ResponseBody return "ok", Accept: text/plain

     

    예시

    /**
    *	content-type: application/json
    */
    
    @RequestMapping
    void hello(@RequetsBody String data) {}

     

    메시지 컨버터 동작 순서

    1. 우선순위가 가장 높은 ByteArrayHttpHttpMessageConverter 메시지 컨버터가 조건 확인
    2. ByteArrayHttpHttpMessageConverter는 byte 데이터를 처리하므로 다음 우선 순위 메시지 컨버터로 넘어감
    3. StringHttpMessageConverter가 조건 확인
    4. 클래스 타입, content-type 모두 일치하므로 StringHttpMessageConverter을 통해 메시지 컨버터 실행

     

    MappingJackson2HttpMessageConverter

     

    • JSON 데이터를 처리한다
    • 클래스 타입: 객체 또는 HashMap, content-type: application/json 관련
    • 요청 예) @RequestBody UserData data
    • 응답 예) @ResponseBody return userData, write content-type: application/json

     

    예시

    /**
    *	content-type: application/json
    */
    
    @RequestMapping
    void hello(@RequetsBody HelloData data) {}

     

    메시지 컨버터 동작 순서

    1. ByteArrayHttpHttpMessageConverter 조건 확인, 클래스 타입이 안 맞음, 다음 메시지 컨버터
    2. StringHttpMessageConverter 조건 확인, 클래스 타입이 안맞음, 다음 메시지 컨버터
    3. MappingJackson2HttpMessageConverter 조건 확인, 클래스 타입과 content-type 모두 일치
    4. MappingJackson2HttpMessageConverter로 메시지 컨버터 실행

     

    반응형

    댓글

Designed by Tistory.