Jackson은 Java 환경에서 JSON 데이터를 직렬화 및 역직렬화할 때 가장 많이 사용되는 라이브러리 중 하나입니다. 기본 기능만으로도 강력하지만, 다양한 모듈을 통해 Jackson의 기능을 확장할 수 있습니다.
Jackson 모듈의 개념과 주요 모듈 소개
Jackson 모듈은 기본 JSON 기능 외에도 다양한 데이터 타입을 더 유연하게 다룰 수 있도록 만들어진 플러그인입니다. 예를 들어 Java 8 이상의 기능들 또는 Kotlin 데이터 클래스와 같은 새로운 기능과의 호환을 위해서 Jackson 모듈을 사용합니다. 주요 모듈 중 일부는 다음과 같습니다.
jackson-datatype-jsr310
jackson-datatype-jsr310 모듈은 Java 8부터 제공된 LocalDate, LocalDateTime 등 새로운 날짜와 시간 API를 지원하는 모듈입니다. 기본적으로 Jackson은 LocalDateTime 같은 타입을 처리하지 못하므로 이 모듈을 등록해야 합니다.
jackson-module-kotlin
jackson-module-kotlin 모듈은 Kotlin 언어와 Jackson을 통합하여, 데이터 클래스 같은 Kotlin의 주요 기능을 지원할 수 있게 합니다. Kotlin에서는 데이터 클래스를 많이 사용하는데, 이 모듈을 통해 Kotlin 데이터 클래스의 JSON 직렬화와 역직렬화가 매우 간단해집니다.
jackson-datatype-jdk8
jackson-datatype-jdk8 모듈은 Java 8의 Optional 타입을 Jackson이 지원할 수 있도록 합니다. Optional은 null 값을 다루는 데 매우 유용하지만, 기본 Jackson 설정만으로는 Optional을 처리할 수 없습니다. 이 모듈을 사용하면 JSON 데이터와 Optional 타입의 필드를 손쉽게 매핑할 수 있습니다.
커스텀 모듈을 Jackson에 추가하는 방법
커스텀 모듈을 추가하면 특정한 데이터 타입이나 포맷을 원하는 대로 처리할 수 있습니다. ObjectMapper에 커스텀 모듈을 등록하는 방법은 다음과 같습니다.
기본 모듈 추가 예제
1. pom.xml 파일에 jackson-datatype-jsr310 모듈과 jackson-datatype-jdk8 모듈을 추가합니다.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.13.0</version>
</dependency>
2. ObjectMapper에 모듈을 등록합니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
public class CustomModuleExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Java 8 모듈 등록
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new JavaTimeModule());
// 예시 데이터 설정 및 직렬화 테스트
Person person = new Person("이민준", Optional.of("서울"), LocalDate.now());
String json = mapper.writeValueAsString(person);
System.out.println("직렬화된 JSON: " + json);
}
}
class Person {
private String name;
private Optional<String> city;
private LocalDate birthDate;
public Person(String name, Optional<String> city, LocalDate birthDate) {
this.name = name;
this.city = city;
this.birthDate = birthDate;
}
// Getters and Setters
}
이 예제에서는 JavaTimeModule과 Jdk8Module을 ObjectMapper에 추가하여 Optional 타입과 LocalDate 타입을 JSON 직렬화에 사용할 수 있도록 설정합니다.
Jackson 모듈을 활용한 JSON 데이터 포맷 확장
Jackson의 모듈 확장 기능을 통해 특정한 데이터 포맷을 커스텀하거나 새로운 직렬화 방식을 구현할 수 있습니다. 예를 들어, 특정 날짜 포맷을 사용하거나 한국의 특정 통화 포맷을 맞추기 위해 커스텀 모듈을 생성해 볼 수 있습니다.
커스텀 모듈 구현 예제: LocalDate 포맷 확장
1. 커스텀 Serializer 작성하기
Jackson에서는 JsonSerializer를 상속하여 커스텀 직렬화를 구현할 수 있습니다. 아래는 LocalDate 타입을 원하는 날짜 포맷으로 직렬화하는 예제입니다.
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class CustomLocalDateSerializer extends JsonSerializer<LocalDate> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public void serialize(LocalDate date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(date.format(formatter));
}
}
2. 모듈 등록 및 ObjectMapper에 추가하기
커스텀 Serializer를 Jackson 모듈로 등록한 후, ObjectMapper에 등록하여 사용할 수 있습니다.
import com.fasterxml.jackson.databind.module.SimpleModule;
public class CustomModuleExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Custom 모듈 생성 및 Serializer 등록
SimpleModule customModule = new SimpleModule();
customModule.addSerializer(LocalDate.class, new CustomLocalDateSerializer());
mapper.registerModule(customModule);
// 테스트 데이터 생성
Person person = new Person("박준혁", Optional.of("부산"), LocalDate.now());
String json = mapper.writeValueAsString(person);
System.out.println("직렬화된 JSON (커스텀 포맷): " + json);
}
}
위 예제에서는 CustomLocalDateSerializer를 통해 LocalDate를 "yyyy-MM-dd" 형식으로 JSON에 직렬화합니다. 이처럼 커스텀 모듈을 통해 JSON 데이터 포맷을 원하는 대로 확장할 수 있습니다.
효율적인 JSON 데이터 처리 전략
- 필요한 모듈만 추가: Jackson의 기본 기능으로 처리할 수 없는 데이터 타입이나 포맷만 모듈로 추가합니다. 이를 통해 성능을 유지하고 필요 이상으로 ObjectMapper를 복잡하게 하지 않습니다.
- 커스텀 Serializer/Deserializer 사용: Jackson의 JsonSerializer와 JsonDeserializer를 적절히 활용하여 특수한 데이터 타입을 처리할 수 있습니다.
- 타입 안전성 강화: Optional과 같은 타입을 사용할 때 Jackson 모듈을 통해 null 값을 처리하는 방식으로 JSON 데이터를 더욱 안전하게 다룰 수 있습니다.
참고 사이트
- Jackson 공식 문서: https://github.com/FasterXML/jackson
'JAVA' 카테고리의 다른 글
[JAVA] Jackson 자주 발생하는 오류와 해결 방법 (1) | 2024.11.15 |
---|---|
[JAVA] Jackson과 Spring Boot 통합 (0) | 2024.11.15 |
[JAVA] Jackson을 활용한 XML 데이터 처리 (0) | 2024.11.14 |
[JAVA] Jackson의 성능 최적화 전략 (0) | 2024.11.13 |
[JAVA] Jackson과 Java 8 이상 기능 연동 (2) | 2024.11.12 |
[JAVA] Jackson의 Data Binding API와 Tree Model API 차이점 (0) | 2024.11.12 |
[JAVA] Jackson Tree Model API 활용하기 (2) | 2024.11.12 |
[JAVA] Jackson 컬렉션 및 배열 데이터 처리 (1) | 2024.11.12 |