Spring Boot 버전업 중 알게된 Java 버전별 캡슐화 정책 강화
고산하 컬리 · 컬리 기술 블로그
AI 핵심 요약
Spring Boot와 Java를 업그레이드한 뒤 로그인 과정에서 Redis에 저장할 `ValidToken`을 Gson으로 직렬화할 때, `LocalDateTime`의 private 필드에 접근하지 못하는 `InaccessibleObjectException`이 발생했습니다. 원인을 추적한 결과 Gson의 기본 `ReflectiveTypeAdapterFactory`가 리플렉션으로 필드를 처리하는 방식과 Java 모듈 시스템의 캡슐화 강화가 충돌한 것이었습니다. `LocalDateTime`을 ISO 형식 문자열로 읽고 쓰는 커스텀 `TypeAdapter`를 등록해 기본 리플렉션 처리를 우회했고, 직렬화 문제를 해결했습니다. 버전업 오류는 임시 옵션으로 덮기보다 라이브러리의 동작과 런타임 정책 변화를 함께 살펴 근본 원인을 파악하는 것이 중요하다는 점을 보여줍니다.
- Java 17에서는 모듈 경계가 리플렉션에도 적용되므로, JDK 타입의 private 필드에 `setAccessible(true)`로 접근하는 방식은 실패할 수 있습니다.
- Gson은 등록된 `TypeAdapter`를 먼저 찾고, 적합한 어댑터가 없으면 `ReflectiveTypeAdapterFactory`로 필드를 처리합니다.
- `LocalDateTime`처럼 JDK 타입을 직렬화할 때는 내부 필드를 탐색하기보다 `DateTimeFormatter`를 이용한 명시적 변환을 구현하세요.
- `--add-opens`로 접근을 허용하는 것보다 필요한 타입에 전용 어댑터를 등록하면 캡슐화를 유지하면서 직렬화 형식을 통제할 수 있습니다.
소개
자바 모듈 시스템의 변화로 인한 직렬화 문제를 분석하면서 알게된 내용을 공유합니다.
비슷한 학습 자료
컨퍼런스 if kakao
추가 배포 없이 API의 case 통일시키기 / if(kakaoAI)2024
컨퍼런스 if kakao
운영이력이 쌓이면서 DTO들의 case들이 다양해진 상황에서, 개발 효율을 높이기 위해 case를 snake case로 일원화하기 위한 과정을 소개합니다. 24/7 상용환경과 MSA로 구성된 서버환경에서 Jackson 라이브러리를 활용해 서비스 중단없이 변경하려 고군분투한 일화입니다. #Spring #MSA #JAVA #DTO #Parsing 카카오톡 마이구독에서 백엔드 개발을 맡고 있는 Luis입니다. 발표자료 보기 👉 https://speakerdeck.com/kakao/ifkakao24-83 if(kakaoAI)2024에 대한 자세한 정보는 👉 https://if.kakao.com #카카오 #이프카카오 #개발자컨퍼런스 #AI #기술 #개발 #ifkakaoAI2024
백엔드 프로그래밍 언어 로드맵 1개에 담김
문서 김성두
Feign 코드 분석과 서버 성능 개선
문서 김경록
하이버네이트의 시간은 거꾸로 간다
문서 박준규