
Spring Boot 버전업 중 알게된 Java 버전별 캡슐화 정책 강화
두줄요약
Spring Boot와 Java 17 업그레이드 후 Gson의 LocalDateTime 직렬화 오류 원인을 분석했습니다.\n강화된 모듈 캡슐화를 Custom TypeAdapter로 우회하는 방식을 소개합니다.
문제 상황
- Spring Boot 2.5.3→3.2.4 및 Java 11→17 업그레이드 후 로그인 토큰의 Redis 직렬화 실패
- Gson이
LocalDateTime의 private 필드에 접근하며InaccessibleObjectException발생
원인 분석
- Gson 기본
ReflectiveTypeAdapterFactory의setAccessible(true)기반 필드 직렬화 - Java 9 모듈 시스템 도입 이후 Java 16·17에서 강화된 JDK 내부 패키지 캡슐화
java.time패키지를 열지 않은java.base모듈의 리플렉션 접근 차단
해결 방법
LocalDateTime전용 Custom TypeAdapter 구현 및 등록- ISO_LOCAL_DATE_TIME 포맷 기반 문자열 직렬화·역직렬화
- 기본 리플렉션 어댑터 대신 커스텀 어댑터 우선 선택으로 private 필드 접근 우회
주의할 점
- JDK 내부 타입의 필드 가시성 변경이나 무분별한 모듈 오픈보다 명시적 어댑터 방식 고려
- Java 버전업 시 라이브러리의 리플렉션 의존성과 모듈 캡슐화 호환성 점검
