Java 17 모듈 시스템 강화로 Gson 직렬화 에러 발생, Custom TypeAdapter로 해결
·2024.12.06 14:00
핵심 내용
Java 17의 강력한 캡슐화 정책으로 Gson 리플렉션 접근이 차단되어 Custom TypeAdapter로 문제를 해결했다.
자세히 보기
컬리 개발자가 Spring Boot 2.5.3에서 3.2.4로, Java 11에서 17로 업그레이드하는 과정에서 Gson 직렬화 에러를 겪었다. 로그인 시 LocalDateTime 객체를 Redis에 저장할 때 InaccessibleObjectException이 발생했으며, 이는 Java 17부터 적용된 강력한 캡슐화 정책으로 인해 리플렉션을 통한 java.time 패키지 내부 필드 접근이 차단되었기 때문이다.
Java 모듈 시스템의 변화
Java 9에서 도입된 모듈 시스템은 하위 호환성을 위해 초기에는 리플렉션 접근을 허용했으나, 점진적으로 제한이 강화되었다.
- Java 9:
--illegal-access=permit기본값으로 JDK 내부 요소 리플렉션 접근 허용 - Java 16:
--illegal-access=deny로 기본값 변경, 내부 패키지 접근 기본 차단 - Java 17: JEP 403 적용으로
setAccessible(true)를 통한 내부 API 접근 엄격 제한, 단일 옵션으로 완화 불가
이로 인해 Gson의 기본 동작인 ReflectiveTypeAdapterFactory가 private final 필드에 접근할 수 없게 되었다.
Custom TypeAdapter를 통한 해결
Gson 프로젝트는 플랫폼 패키지 객체 직렬화 문제를 근본적으로 해결하기 어려운 상황이다. 따라서 개발자는 필드 가시성을 변경하는 대신 Custom TypeAdapter를 작성하여 문제를 우회했다.
TypeAdapter<LocalDateTime>상속 구현DateTimeFormatter.ISO_LOCAL_DATE_TIME을 사용하여 수동으로 직렬화 및 역직렬화 수행- 커스텀 어댑터 등록 시 Gson의 리플렉션 기반 팩토리보다 우선순위가 높아져 접근 제한 회피 가능
이 방식을 통해 리플렉션 의존성을 제거하고 보안성을 유지하면서 정상적인 직렬화 동작을 확보했다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.