Spring 직렬화 역직렬화: JSON 처리 방법

직렬화, 역직렬화 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 메서드 이름에 따라 프로퍼티 이름 생성 (예: getUserNameuserName).
  • get 메서드가 없어도 return 값이 직렬화될 수 있음 (주의 요망).

5. Jackson 어노테이션 활용

  • @JsonIgnore: 특정 메서드/필드를 직렬화에서 제외.
  • @JsonCreator + @JsonProperty: 기본 생성자 없이 역직렬화 가능 (인자 매핑 필요).
  • @JsonProperty: 필드에 직접 설정 가능 (getter 생략 가능).

6. 보안 및 고려사항

  • 직렬화는 무결성 보장이 필수적 (클라이언트 오류 방지).
  • 역직렬화는 서버 장애 가능성 있으나, Spring은 유연하게 처리.
  • byte[] 직렬화 시 보안 검증 필수 (예: 역직렬화 시 데이터 손상 방지).

결론

  • Spring의 직렬화/역직렬화 메커니즘 이해는 REST API 개발에 필수.
  • @JsonIgnore, @JsonCreator, @JsonProperty 등 Jackson 어노테이션을 통해 데이터 제어 가능.
  • ObjectMapper 설정 및 HttpMessageConverter 우선순위 조정으로 커스터마이징 가능.
  • 보안/무결성 고려하여 직렬화 과정을 철저히 검증해야 함.