Backend/Spring
Spring REST API 요청 및 응답시 직렬화, 역직렬화의 원리
seung_soos
2024. 4. 23. 16:22
먼저 직렬화와 역직렬화란 무엇인가?
직렬화 : 메모리를 바이트 스트림으로 변환하는 과정으로 이를통해 네트워크 통신이 가능해진다.
역직렬화 : 네트워크 통신으로 받은 데이터를 메모리에 쓸수 있는 형태로 변환하는것이다.
Spring의 직렬화 및 역직렬화
일반적으로 Spring에서는 직렬화 및 역직렬화시 Java 객체 ↔ JSON 형태로 변환한다.
Spring-web 라이브러리에는 HttpMessageConverter를 상속받는 다양한 Converter가 존재한다.
유형에 따라 Converter가 사용되며, RestApi 유형의 경우에는 MappingJackson2HttpMessageConverter 가 사용된다.
여러 Converter 중 적합한 Convert를 판단하는 방법은?
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
default List<MediaType> getSupportedMediaTypes(Class<?> clazz) {
return !this.canRead(clazz, (MediaType)null) && !this.canWrite(clazz, (MediaType)null) ? Collections.emptyList() : this.getSupportedMediaTypes();
}
T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}
HttpMessageConverter 의 구현체중 여러 List를 순회하며,canRead(), canWrite() 메서드의 true값이 반환될경우
해당 Convert를 적합하다 판단하여 사용한다.
Controller의 @ResponseBody, @RequestBody의 경우에는 MappingJackson2HttpMessageConverte가 실행되고, 내부적으로 ObjectMapper를 사용하여 타입에 맞게 직렬화 및 역직렬화가 실행된다.