직렬화, 역직렬화 in Spring
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Java/Spring 개발자, REST API 구현자 (중급 이상)
핵심 요약
- 직렬화는 Java 객체를 JSON/XML 등으로 변환하고, 역직렬화는 그 반대 과정이다.
- Spring은
@RequestBody
/@ResponseBody
를 통해HttpMessageConverter
를 통해 자동 처리하며,MappingJackson2HttpMessageConverter
가 기본 구현체이다. ObjectMapper
가 JSON ↔ Java 객체 변환을 수행하며, @JsonIgnore, @JsonCreator, @JsonProperty 등 Jackson 어노테이션으로 세부 제어 가능.
섹션별 세부 요약
1. 직렬화/역직렬화 정의
- 직렬화: Java 객체 → JSON/XML/바이트 배열로 변환 (예:
@ResponseBody
사용 시). - 역직렬화: JSON/XML 요청 본문 → Java 객체 (예:
@RequestBody
사용 시). - JVM 힙 메모리의 객체는 외부 시스템이 직접 이해하지 못하므로, 직렬화/역직렬화로 데이터 전달 가능.
2. HttpMessageConverter 역할
- 요청/응답 데이터와 Java 객체 간 변환을 처리하는 핵심 인터페이스.
- 주요 메서드:
canRead()
/canWrite()
(타입/미디어 타입 체크),read()
/write()
(실제 변환). - Spring은
MappingJackson2HttpMessageConverter
를 기본으로 사용 (JSON 처리).
3. 역직렬화 조건
- 필드가
public
→ 직접 주입. private
필드 → 기본 생성자 +setter
메서드 사용.setter
없이도 리플렉션을 통해private
필드에 값 주입 가능.
4. 직렬화 조건
- 필드가
public
→ JSON 변환. private
필드 →getter
메서드를 통해 직렬화.get
메서드 이름에 따라 프로퍼티 이름 생성 (예:getUserName
→userName
).get
메서드가 없어도return
값이 직렬화될 수 있음 (주의 요망).
5. Jackson 어노테이션 활용
- @JsonIgnore: 특정 메서드/필드를 직렬화에서 제외.
- @JsonCreator + @JsonProperty: 기본 생성자 없이 역직렬화 가능 (인자 매핑 필요).
- @JsonProperty: 필드에 직접 설정 가능 (getter 생략 가능).
6. 보안 및 고려사항
- 직렬화는 무결성 보장이 필수적 (클라이언트 오류 방지).
- 역직렬화는 서버 장애 가능성 있으나, Spring은 유연하게 처리.
byte[]
직렬화 시 보안 검증 필수 (예: 역직렬화 시 데이터 손상 방지).
결론
- Spring의 직렬화/역직렬화 메커니즘 이해는 REST API 개발에 필수.
@JsonIgnore
,@JsonCreator
,@JsonProperty
등 Jackson 어노테이션을 통해 데이터 제어 가능.ObjectMapper
설정 및HttpMessageConverter
우선순위 조정으로 커스터마이징 가능.- 보안/무결성 고려하여 직렬화 과정을 철저히 검증해야 함.