기술과 산업/언어 및 프레임워크

Gson supports Java 8 datetime types

B컷개발자 2025. 2. 13. 12:17
728x90

개요

Gson은 기본적으로 Java 8의 날짜-시간 API를 직접 지원하지 않습니다. 하지만 커스텀 JSON 직렬화기를 만들어 Java 8의 날짜-시간 타입을 지원할 수 있습니다. 이 글에서는 Gson을 사용하여 LocalDate 타입을 처리하는 방법을 설명합니다.

Gson 설정

먼저 pom.xml 파일에 Gson 의존성을 추가해야 합니다:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

기본 Gson의 한계

기본적으로 Gson을 사용하여 LocalDate와 같은 Java 8 날짜-시간 타입을 처리하려고 하면 Java 9 모듈 오류가 발생합니다. 예를 들어:

Gson gson = new Gson();
Book book = new Book(1L, "Book A", BigDecimal.valueOf(9.99), LocalDate.of(2023, 10, 1));
String json = gson.toJson(book); // 직렬화 시도

이 코드는 다음과 같은 오류를 발생시킵니다:

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final int java.time.LocalDate.year accessible: module java.base does not "opens java.time" to unnamed module @57fa26b7

커스텀 직렬화기 및 역직렬화기 구현

이 문제를 해결하기 위해 LocalDate 타입에 대한 커스텀 직렬화기와 역직렬화기를 만들어야 합니다. 다음은 LocalDateAdapter 클래스의 구현 예시입니다:

public class LocalDateAdapter implements JsonSerializer<LocalDate>, JsonDeserializer<LocalDate> {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;

    @Override
    public JsonElement serialize(LocalDate localDate, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(localDate.format(formatter)); // "yyyy-MM-dd"
    }

    @Override
    public LocalDate deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        return LocalDate.parse(json.getAsJsonPrimitive().getAsString(), formatter);
    }
}

Gson에 커스텀 어댑터 등록

이제 GsonBuilder를 사용하여 위에서 만든 LocalDateAdapter를 등록할 수 있습니다

Gson gson = new GsonBuilder()
    .registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
    .create();

Book book = new Book(1L, "Book A", BigDecimal.valueOf(9.99), LocalDate.of(2023, 10, 1));
String json = gson.toJson(book); // 직렬화
System.out.println("Serialized book: " + json);

Book newBook = gson.fromJson(json, Book.class); // 역직렬화
System.out.println("Deserialized book: " + newBook);

이 코드의 출력 결과는 다음과 같습니다:

Serialized book: {"id":1,"title":"Book A","price":9.99,"publishDate":"2023-10-01"}
Deserialized book: Book{id=1, title='Book A', price=9.99, publishDate=2023-10-01}

결론

Gson을 사용하여 Java 8의 날짜-시간 타입을 처리하려면 커스텀 직렬화기와 역직렬화기를 구현해야 합니다. 이 방법을 통해 LocalDate, LocalDateTime, ZonedDateTime 등의 타입을 효과적으로 처리할 수 있습니다. 이 접근 방식은 Java 8 이상의 버전에서 날짜와 시간 데이터를 JSON으로 변환하거나 JSON에서 Java 객체로 변환할 때 유용하게 사용될 수 있습니다.

728x90