본문 바로가기
개발

[Spring] enum, class에서 @JsonValue 사용법과 자바의 직렬화

by Mong-_- 2024. 6. 4.

우선 @JsonValue 사용법을 알아보기 전에 자바 직렬화를 알아야 더욱 깊이 있는 이해를 할 수 있어, 간단하게 자바 직렬화를 설명하고 넘어가겠습니다.

 

자바 직렬화란?

직렬화(Serialize)

- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있는 바이트(byte) 형태로 데이터를 변환하는 기술

- JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

역직렬화(Deserialize)

- 바이트로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술

- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 기술

자바 직렬화의 장점

자바 직렬화는 자바 시스템 개발에 최적화되어 있다.

복잡한 데이터 구조의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화가 가능하다.

특히 데이터 타입이 자동으로 맞춰지기 때문에 관련 부분에 큰 신경을 쓰지 않아도 된다.

자바 직렬화의 단점

역직렬화 대상 클래스의 멤버 변수 타입 변경을 지양해야 한다

클래스의 멤버 변수가 변경될 시, 언제 예외가 생길지 모르는 위험한 시스템이 되기 때문이다.

따라서, 버전의 호환성을 유지하기 위해 SUID(serialVersionUID)를 정의해야 한다.

 

@JsonValue란?

@JsonValue는 전체 인스턴스를 직렬화할 때 사용하는 단일 메서드입니다. 예를 들어, enum에서 getName 메서드에 @ JsonValue를 넣어주어 이름을 통해 직렬화를 하게 합니다..

 

말이 어려우니 예시를 봅시다.

 

Java 객체를 JSON으로 serialization 하기 위해서는 ObjectMapper의 writeValue() 메서드를 이용하며, ObjectMapper를 사용하기 위해 Gradle 기준 아래 코드로 dependency를 추가합니다.

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.3'

 

우선, Season이라는 enum 클래스를 만들어줍니다.

@JsonValue 어노테이션을 사용하지 않고 season 객체를 직렬화하면 기본 열거형 상수값으로 직렬화가 되어 "SPRING"이 나오게 됩니다.

만약, Season 타입의 변수를 직렬화할 때 name 변수인 "Spring"로 직렬화를 하고 싶다면, @JsonValue 어노테이션을 사용하면 됩니다.

직렬화하고 싶은 필드를 리턴하는 메서드에 @JsonValue 어노테이션을 붙여주면 직렬화 시 나오는 필드의 이름을 결정할 수 있습니다.

테스트 결과를 보면 직렬화 시  기본 열거형 상수값이 아닌 name 필드가 반환된 것을 알 수 있습니다.

 

만약 Season을 예로 @JsonValue를 사용하지 않고, name 필드 값을 반환 값으로 사용하고 싶다면, ResponseDto에 String 타입의 변수를 선언한 후 바인딩하는 등 직접 반환 값을 설정해야 하는 단점이 있지만,

어노테이션을 사용하면 직접 바인딩하지 않아도 Enum 타입 자체를 반환하면 자동으로 name 필드 값이 직렬화되는 장점이 있습니다.

 

 

고생하셨습니다!