
우리는 보통 Java에서 JSON으로 직렬화를 많이하고, 이 때 사용하는 대표적인 라이브러리가 Jackson과 Gson입니다.
Gson의 경우 사용법이 간단하지만, 개인적으로 커스텀하게 사용할 수 있는 부분이 적어 아쉬운 관계로 Jackson을 애용하는데요, Jackson에서 제공하는 다양한 직렬화 방법을 소개하고자 합니다.
직렬화란?
우리가 만든 자바 코드는 내부적으로 동작할 때는 문제가 없지만, 서버 외부와 통신하거나 엑셀 등의 출력을 위해 자바 코드를 외부와 소통할 수 있게 만드는 작업을 직렬화라고 합니다.
자바 진영에서의 직렬화는 보통 자바의 직렬화 방법과 JSON 직렬화가 대표적인데, 오늘 소개할 방법은 자바 직렬화보다 비교적 간단한 JSON 직렬화 방법입니다.
JSON 직렬화는 자바 코드에 매핑된 값을 텍스트 형식으로 제공해주기 때문에 바이너리 형식으로 제공하는 자바 직렬화보다 간단하다는 특장점이 있습니다. 또한, HTTP/Rest 형식에 최적화 된 방법이죠
Jackson 라이브러리의 직렬화 방법
Jackson에서는 ObjectMapper라는 클래스를 통해서 비교적 간단하게 직렬화를 제공해주는데요, 또한 사용자의 입맛에 맞게 직렬화 방식을 요리할 수 있는 장점을 가지고 있습니다.
기본적인 직렬화 방법
보통 가장 많이 사용하는 방법으로 다음과 같이 텍스트 형식으로 직렬화 하는 방법입니다.
public class JacksonTest {
public void serialize() {
Foo foo = new Foo();
String jsonStr = ObjectMapper().writeValueAsString(foo);
}
}
어노테이션을 통한 직렬화
Spring 등과 같은 프레임워크를 사용하게 되면, 어노테이션을 활용하여 다음과 같이 직렬화할 대상을 제어할 수 있습니다.
public class Foo {
@JsonIgnore
String ignoreField; // 직렬화 시에 무시 됨
@JsonProperty("property_name")
String propertyName; // 직렬화 시에 snake_case로 직렬화 됨
@JsonInclude(JsonInclude.Include.NON_NULL)
String nonNull; // 직렬화 시에 non-null 체크를 수행
}
또한, 다음과 같이 @JsonValue를 toJson()이라는 메서드를 통해 직렬화할 수 있게 하여, 직렬화 값을 직접 제어할 수도 있습니다.
public class Foo {
String name;
@JsonValue
public String toJson() {
return "{\n\"\n${name}\"\n}";
}
}
ObjectMapper에 대한 상세 설정
앞서 얘기한대로, ObjectMapper는 사용자의 입맛대로 다양하게 설정이 가능하다고 했습니다. ObjectMapper는 다음과 같이 직렬화를 수행하기 전에 직렬화 대상을 어떻게 직렬화할지에 대해 다음과 같은 설정이 가능한 필드를 제공하고 있습니다.
JavaTimeModule을 통한 java의 날짜 관련 객체 직렬화
- Java의 LocalDate, LocalDateTIme과 같은 날짜 관련 객체를 직렬화하는 수단으로 사용됩니다.
public void objectMapperTest() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
}
커스텀 직렬화 구현
- 다음과 같이 JsonSerializer를 상속하여 커스텀 직렬화를 구현하고, 이를 통해 직렬화하는 방법도 제공합니다.
// 직렬화 대상
public class CustomModule {
long id;
String desc;
public CustomModule(long id, String desc) {
this.id = id;
this.desc = desc;
}
}
// 커스텀 직렬화 객체
public class CustomSerializer extends JsonSerializer<CustomModule> {
@Override
public void serialize(CustomModule value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("Order#" + value.id + ": " + value.desc);
}
}
public void objectMapperTest() {
ObjectMapper objectMapper = new ObjectMapper();
JsonSerializer<CustomModule> serializer = new CustomSerializer();
SimpleModule customModule = new SimpleModule().addSerializer(CustomModule.class, serializer);
objectMapper.registerModule(customModule);
}
JSON 필드 직렬화 전략
- 직렬화 필드에 대해 상황에 따라 다른 네이밍 방식을 지정할 수도 있습니다.
public void test() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper
.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) // snake_case
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE) // lowerCamelCase
.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE) // UpperCamelCase
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CASE) // lowercase
.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE) // kebab-case
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_DOT_CASE); // lower.dot.case
}
정리
ObjectMapper는 이외에도 다양한 설정이 존재하는데요, 실무를 진행하면서 알아두면 좋은 부분을 간단하게 정리해봤습니다.
'언어 > java' 카테고리의 다른 글
[Java] Java의 가시성 키워드 Volatile (0) | 2025.03.25 |
---|---|
[시스템 프로그래밍] JVM 실행 흐름에 대한 코드 분석 (0) | 2024.07.17 |
JDK 동적 프록시 (2) | 2023.12.05 |
JDK21 Update 정리 (2) | 2023.11.22 |
[Java] 자바의 컬렉션(Collection) (0) | 2020.05.10 |

우리는 보통 Java에서 JSON으로 직렬화를 많이하고, 이 때 사용하는 대표적인 라이브러리가 Jackson과 Gson입니다.
Gson의 경우 사용법이 간단하지만, 개인적으로 커스텀하게 사용할 수 있는 부분이 적어 아쉬운 관계로 Jackson을 애용하는데요, Jackson에서 제공하는 다양한 직렬화 방법을 소개하고자 합니다.
직렬화란?
우리가 만든 자바 코드는 내부적으로 동작할 때는 문제가 없지만, 서버 외부와 통신하거나 엑셀 등의 출력을 위해 자바 코드를 외부와 소통할 수 있게 만드는 작업을 직렬화라고 합니다.
자바 진영에서의 직렬화는 보통 자바의 직렬화 방법과 JSON 직렬화가 대표적인데, 오늘 소개할 방법은 자바 직렬화보다 비교적 간단한 JSON 직렬화 방법입니다.
JSON 직렬화는 자바 코드에 매핑된 값을 텍스트 형식으로 제공해주기 때문에 바이너리 형식으로 제공하는 자바 직렬화보다 간단하다는 특장점이 있습니다. 또한, HTTP/Rest 형식에 최적화 된 방법이죠
Jackson 라이브러리의 직렬화 방법
Jackson에서는 ObjectMapper라는 클래스를 통해서 비교적 간단하게 직렬화를 제공해주는데요, 또한 사용자의 입맛에 맞게 직렬화 방식을 요리할 수 있는 장점을 가지고 있습니다.
기본적인 직렬화 방법
보통 가장 많이 사용하는 방법으로 다음과 같이 텍스트 형식으로 직렬화 하는 방법입니다.
public class JacksonTest {
public void serialize() {
Foo foo = new Foo();
String jsonStr = ObjectMapper().writeValueAsString(foo);
}
}
어노테이션을 통한 직렬화
Spring 등과 같은 프레임워크를 사용하게 되면, 어노테이션을 활용하여 다음과 같이 직렬화할 대상을 제어할 수 있습니다.
public class Foo {
@JsonIgnore
String ignoreField; // 직렬화 시에 무시 됨
@JsonProperty("property_name")
String propertyName; // 직렬화 시에 snake_case로 직렬화 됨
@JsonInclude(JsonInclude.Include.NON_NULL)
String nonNull; // 직렬화 시에 non-null 체크를 수행
}
또한, 다음과 같이 @JsonValue를 toJson()이라는 메서드를 통해 직렬화할 수 있게 하여, 직렬화 값을 직접 제어할 수도 있습니다.
public class Foo {
String name;
@JsonValue
public String toJson() {
return "{\n\"\n${name}\"\n}";
}
}
ObjectMapper에 대한 상세 설정
앞서 얘기한대로, ObjectMapper는 사용자의 입맛대로 다양하게 설정이 가능하다고 했습니다. ObjectMapper는 다음과 같이 직렬화를 수행하기 전에 직렬화 대상을 어떻게 직렬화할지에 대해 다음과 같은 설정이 가능한 필드를 제공하고 있습니다.
JavaTimeModule을 통한 java의 날짜 관련 객체 직렬화
- Java의 LocalDate, LocalDateTIme과 같은 날짜 관련 객체를 직렬화하는 수단으로 사용됩니다.
public void objectMapperTest() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
}
커스텀 직렬화 구현
- 다음과 같이 JsonSerializer를 상속하여 커스텀 직렬화를 구현하고, 이를 통해 직렬화하는 방법도 제공합니다.
// 직렬화 대상
public class CustomModule {
long id;
String desc;
public CustomModule(long id, String desc) {
this.id = id;
this.desc = desc;
}
}
// 커스텀 직렬화 객체
public class CustomSerializer extends JsonSerializer<CustomModule> {
@Override
public void serialize(CustomModule value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("Order#" + value.id + ": " + value.desc);
}
}
public void objectMapperTest() {
ObjectMapper objectMapper = new ObjectMapper();
JsonSerializer<CustomModule> serializer = new CustomSerializer();
SimpleModule customModule = new SimpleModule().addSerializer(CustomModule.class, serializer);
objectMapper.registerModule(customModule);
}
JSON 필드 직렬화 전략
- 직렬화 필드에 대해 상황에 따라 다른 네이밍 방식을 지정할 수도 있습니다.
public void test() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper
.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) // snake_case
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE) // lowerCamelCase
.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE) // UpperCamelCase
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CASE) // lowercase
.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE) // kebab-case
.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_DOT_CASE); // lower.dot.case
}
정리
ObjectMapper는 이외에도 다양한 설정이 존재하는데요, 실무를 진행하면서 알아두면 좋은 부분을 간단하게 정리해봤습니다.
'언어 > java' 카테고리의 다른 글
[Java] Java의 가시성 키워드 Volatile (0) | 2025.03.25 |
---|---|
[시스템 프로그래밍] JVM 실행 흐름에 대한 코드 분석 (0) | 2024.07.17 |
JDK 동적 프록시 (2) | 2023.12.05 |
JDK21 Update 정리 (2) | 2023.11.22 |
[Java] 자바의 컬렉션(Collection) (0) | 2020.05.10 |