직렬화와 역직렬화란?
직렬화
- 객체 데이터를 특정 형식(예: 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 필드 id와 name을 생성자의 파라미터와 매핑한다.
- @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 |