본문으로 이동
문서

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

운영이력이 쌓이면서 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과 다중 스레드를 사용하는 과정에서 생긴 문제를 이해하고 성능 개선까지 한 경험을 공유해요.

백엔드 프로그래밍 언어

문서 이준희

REST Docs 를 최소한의 코드로 작성하면서 변화에도 더 유연하게 대처할 수 있는 tosspayments-restdocs 라이브러리와, 라이브러리에 녹인 기술들을 소개합니다.

백엔드 개발 도구

문서 김경록

스프링부트 버전을 업그레이드하는 과정에서 발견된 버그 해결기

백엔드 데이터베이스

문서 박준규

공통 모듈에서 발생한 동시성 이슈의 해결 과정을 소개합니다.

백엔드 프로그래밍 언어