JAVA

[JAVA] Jackson 커스텀 모듈 사용하기

인생아 2024. 11. 12. 15:22
반응형

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
}

이 예제에서는 JavaTimeModuleJdk8Module을 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 데이터 처리 전략

  1. 필요한 모듈만 추가: Jackson의 기본 기능으로 처리할 수 없는 데이터 타입이나 포맷만 모듈로 추가합니다. 이를 통해 성능을 유지하고 필요 이상으로 ObjectMapper를 복잡하게 하지 않습니다.
  2. 커스텀 Serializer/Deserializer 사용: Jackson의 JsonSerializer와 JsonDeserializer를 적절히 활용하여 특수한 데이터 타입을 처리할 수 있습니다.
  3. 타입 안전성 강화: Optional과 같은 타입을 사용할 때 Jackson 모듈을 통해 null 값을 처리하는 방식으로 JSON 데이터를 더욱 안전하게 다룰 수 있습니다.

참고 사이트

반응형