[SPRING] 직렬화 역직렬화
직렬화
- 객체를 저장하거나 전송할 수 있는 상태로 변환하는 과정
역직렬화
- 직렬화된 데이터를 다시 객체로 복원하는 과정
만약 Hello hi = new Hello("Park", 20);
이러한 객체가 존재하게 된다면 hi 라는 변수에는 해당 객체의 실제 데이터가 있는 힙메모리의 주소를 가지게 된다.
이 객체를 다른 네트워크에게 알릴때 다른 네트워크가 인식할 수 있도록 바이트나 문자열 형태로 변환해주는 작업을
해야한다.
Spring에서의 직렬화와 역직렬화
@RequestBody (역직렬화)
HTTP 요청 본문(Body)에 담긴 JSON, XML, Form 데이터 등을 Java 객체로 변환 해주는 어노테이션
@ResponseBody (직렬화)
Java객체를 HTTP 응답의 본문에 JSON 등으로 변환해주는 어노테이션
이러한 직렬화, 역직렬화에서 사용하는 컴포넌트가 바로 'HttpMessageConverter' 이다.
HttpMessageConverter란?
Spring MVC에서 HTTP 요청/응답의 본문(Body) 을 Java 객체 ↔ HTTP 메시지(JSON, XML, 텍스트 등) 로 변환하는 전략 인터페이스
Spring MVC의 DispatcherServlet과 컨트롤러 사이에서 동작.
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType); //역직렬화 가능여부
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType); //직렬화 가능여부
T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException; //역직렬화
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException; //직렬화
등록되어 있는 HttpMessageConterver 구현체
- ByteArrayHttpMessageConverter
byte[] 와 Binary 데이터
- StringHttpMessageConverter
문자열과 String 객체간 변환 : MediaType => text/plain , text/html
- MappingJackson2HttpMessageConverter
JSON과 Java 객체간 변환 : MediaType => application/json
해당 클래스의 기능은
역직렬화할때는 기본 생성자로 객체를 만들고 JSON의 각 필드를 필드명/Setter 메서드를 매칭해서 값을 채운다.
직렬화할때는 Java객체의 필드값을 getter 기준으로 읽어서 json의 키-값으로 만든다.
@JsonIgnore => 직렬화와 역직렬화를 원하지 않는 getter 혹은 setter에 명시해준다. (필드 명시도 가능)
@JsonCreator => 특정 생성자를 json 역직렬화 시 사용할 생성자를 지정해준다.
@JsonProperty => JSON의 key를 생성자의 매개변수와 연결해준다.
@JsonCreator
public Student(@JsonProperty String name , @JsonProperty Integer age) {
this.name = name;
this.age = age;
}
@JsonProperty("StudentName")
private String name //해당 필드는 json으로 "StudentName" : "홍길동" 으로 변환된다.