AI Briefing

카카오 마이구독, API 케이스 통일 위해 무중단 DTO 마이그레이션 모듈 개발

·2024.11.19 00:00

핵심 내용

RequestBodyAdvice와 Jackson Custom Deserializer를 활용해 서버 점검 없이 900개 DTO의 케이스를 Camel로 일원화했다.

1 / 4

자세히 보기

카카오 마이구독 서비스는 백엔드 개발 중 혼용되던 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가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.