기술과 산업/언어 및 프레임워크
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