Java/Spring

스프링에서 잭슨 라이브러리의 직렬화/역직렬화

파란배개 2025. 1. 18. 20:27

직렬화와 역직렬화란?

직렬화

  • 객체 데이터를 특정 형식(예: JSON, 바이너리 등)으로 변환해 전송하거나 저장할 수 있게 만드는 과정이다.

역직렬화

  • 직렬화된 데이터를 다시 객체로 변환하는 과정이다.
  • JSON이나 바이너리 데이터를 애플리케이션에서 사용할 수 있는 객체 형태로 복원하는 작업이다.

스프링의 잭슨(Jackson) 을 이용한 직렬화/역직렬화

잭슨은 Java Reflection API를 활용해 클래스 정보를 동적으로 읽어들여 분석해서 직렬화/역직렬화를 수행한다.


참고 - Java Reflection API란?

  • Reflection API는 실행 중에 클래스, 메서드, 필드 등의 정보를 동적으로 가져오거나 수정할 수 있는 Java의 기능이다.
  • 이를 통해 컴파일 시점에 알 수 없는 클래스의 구조를 런타임에 파악하고 조작할 수 있다.
  • 잭슨은 Reflection API를 사용해 클래스의 필드, Getter/Setter 메서드 등을 동적으로 분석해 직렬화와 역직렬화를 수행한다.

예시

Class<?> clazz = MyClass.class; // 클래스 정보 가져오기  
Field field = clazz.getDeclaredField("name"); // 클래스의 필드 정보 가져오기  
field.setAccessible(true); // private 필드 접근 허용  
Object value = field.get(myObject); // 필드 값 읽기  

직렬화

  • 공개된 필드: public 접근 제어자를 가진 필드는 직렬화된다.
  • Private 필드:
    • 표준 Getter 메서드(getXxx())가 있으면 직렬화된다.
    • Getter 메서드가 Java Beans 표준(getXxx())을 따르지 않으면 직렬화되지 않는다.
    • 표준이 아닌 Getter를 사용하는 경우 잭슨이 이를 인식하지 못하기 때문이다.

역직렬화

  • 표준 Getter/Setter:
    • 표준 Getter/Setter가 있으면 역직렬화가 가능하다.
  • 생성자:
    • 생성자가 하나만 있으면 역직렬화가 가능하다.
    • 생성자가 여러 개일 경우 기본 생성자가 있어야 오류가 발생하지 않는다.
    • 기본 생성자가 없으면 잭슨이 어떤 생성자를 사용할지 판단하지 못하기 때문이다.

참고: 잭슨의 직렬화/역직렬화 동작은 사용하는 잭슨 버전 및 빌드 환경에 따라 다를 수 있다.
따라서, 직렬화 시에는 표준 게터 메서드를 반드시 작성하고, 역직렬화 시에는 기본 생성자를 정의해 놓는 편이 좋다.


어노테이션으로 커스터마이징 가능

잭슨은 어노테이션을 통해 직렬화/역직렬화 규칙을 커스터마이징할 수 있다.
표준 Getter/Setter를 따르지 않는 필드나, 특정 필드를 직렬화/역직렬화에서 제외하고 싶을 때 유용하다.

주요 어노테이션

1. @JsonProperty

  • JSON 필드 이름을 명시적으로 지정하거나, Getter/Setter 없이 필드를 직접 매핑할 때 사용한다.
  • 예시JSON에서 user_name이라는 키를 username 필드와 매핑한다.
  • @JsonProperty("user_name") private String username;

2. @JsonIgnore

  • 특정 필드를 직렬화/역직렬화에서 제외한다.
  • 예시password 필드는 JSON 변환에서 무시된다.
  • @JsonIgnore private String password;

3. @JsonCreator

  • 역직렬화 시 사용하는 생성자를 지정한다. 기본 생성자가 없거나, 다수의 생성자가 있을 때 명시적으로 사용할 생성자를 정의할 수 있다.
  • 예시JSON 필드 idname을 생성자의 파라미터와 매핑한다.
  • @JsonCreator public User(@JsonProperty("id") Long id, @JsonProperty("name") String name) { this.id = id; this.name = name; }

'Java > Spring' 카테고리의 다른 글

Web Server와 WAS  (1) 2025.02.16
어노테이션(Annotation)  (2) 2025.02.09
Spring Security  (0) 2025.02.06
OSIV  (0) 2025.02.06
Servlet, Dispatcher Servlet, Servlet Container  (0) 2025.02.02