카카오 마이구독, API 케이스 통일 위해 무중단 DTO 마이그레이션 모듈 개발
핵심 내용
RequestBodyAdvice와 Jackson Custom Deserializer를 활용해 서버 점검 없이 900개 DTO의 케이스를 Camel로 일원화했다.
자세히 보기
카카오 마이구독 서비스는 백엔드 개발 중 혼용되던 DTO 네이밍 규칙(Camel, Snake 등)을 Camel case로 통일하기 위해 무중단 마이그레이션을 수행했다. 기존 점진적 변경 방식은 게이트웨이와 비즈니스 로직 서버 간 케이스 불일치, 중첩 DTO 파싱 오류, 그리고 무중단 배포 시 복잡한 의존성 관리 문제를 야기했다.
Request 처리: Spring RequestBodyAdvice 활용
Request 데이터 파싱 직전에 동작하는 Spring의 RequestBodyAdvice를 적용했다. Filter나 Interceptor로는 타겟 클래스 파악이나 원본 Body 변경이 어려웠기 때문에, beforeBodyRead 메서드에서 Java Reflection을 이용해 타겟 클래스의 어노테이션(@JsonNamingStrategy, @JsonProperty 등)을 확인하고 케이스를 변환했다. Generic 타입의 경우 가장 안쪽 클래스를 기준으로 파싱하며, Map 타입은 제외했다.
Response 처리: Jackson Custom Deserializer 적용
ResponseBodyAdvice가 데이터 전달 전이 아닌 후 동작하는 특성 때문에, Jackson의 Custom Deserializer를 사용했다. ApiResponse Wrapper 클래스에 대해 JsonDeserializer와 ContextualDeserializer를 구현하여 역직렬화 시점의 Generic 타입 정보를 확보하고, Request와 동일한 로직으로 케이스를 변환했다.
동시성 이슈 해결 및 결과
초기 구현에서는 Jackson의 캐싱 메커니즘으로 인해 createContextual 시 새로운 Deserializer 인스턴스를 반환하지 않아, 여러 세션이 동일한 인스턴스를 공유하며 타입 정보가 섞이는 동시성 이슈가 발생했다. 이를 해결하기 위해 createContextual에서 항상 새로운 인스턴스를 반환하도록 수정했다. 최종적으로 이 모듈들을 적용하여 총 900개 이상의 DTO 케이스를 서버 점검 없이 성공적으로 변경했다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.