ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Gson supports Java 8 datetime types
    카테고리 없음 2025. 2. 13. 12:17
    반응형

    개요

    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 객체로 변환할 때 유용하게 사용될 수 있습니다.

    반응형
Designed by Tistory.