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