토스뱅크의 MSA 환경에서의 Enum 관리 전략: EnumString, ArchUnit, Meta-Expose를 활용한 Deserialize 오류 극복기
🤖 AI 추천
MSA 환경에서 마이크로서비스 간 Enum 공유 시 발생하는 Deserialize 오류에 대한 실질적인 해결책을 찾는 백엔드 개발자, 시스템 아키텍트, 그리고 안정적인 서비스 운영을 추구하는 개발팀 리더에게 이 콘텐츠를 추천합니다.
🔖 주요 키워드

핵심 기술: 토스뱅크는 마이크로서비스 아키텍처(MSA) 환경에서 발생하는 Enum 역직렬화(Deserialize) 오류 문제를 해결하기 위해 Enum 자체의 유연성을 높이는 EnumString
, 코드의 일관성을 강제하는 ArchUnit
, 그리고 Enum 버전 동기화를 관리하는 Meta-Expose
라는 세 가지 전략을 성공적으로 도입했습니다.
기술적 세부사항:
- MSA와 Enum의 복잡성: MSA 환경에서 Enum을 여러 서버가 공유할 때, 버전 불일치로 인한 정의되지 않은 Enum 값 수신 시 Deserialize 에러가 빈번하게 발생하며 이는 치명적인 문제로 이어질 수 있습니다.
- 제공자(Provider) vs 소비자(Consumer) 전략: 통신 주체에 따라 Enum 처리 방식을 다르게 정의했습니다.
- 클라이언트(소비자) → 서버(제공자): 정의되지 않은 Enum 값 수신 시
400 Bad Request
와 같은 클라이언트 오류로 즉시 응답하는 엄격한 검증 방식을 채택했습니다. - 서버(제공자) → 클라이언트(소비자): 새로운 Enum 값 추가 시 클라이언트가 이를 유연하게 처리할 수 있도록 (경고 후 무시, 기본값 처리, 명시적 오류 발생 등) 선택권을 부여하는 개방적인 구조를 설계했습니다.
- 클라이언트(소비자) → 서버(제공자): 정의되지 않은 Enum 값 수신 시
- EnumString 도입: Enum 타입의 장점을 유지하면서도, 예상치 못한 값이 들어왔을 때 개발자가 원하는 동작을 직접 정의할 수 있는 유연한 접근법을 제공하는 전용 라이브러리를 제작했습니다.
toEnumOrNull()
,toEnumOrElse()
,toEnumOrThrow()
와 같은 메소드를 통해 상황에 맞는 Enum 역직렬화 처리를 지원합니다.
- ArchUnit을 통한 EnumString 전파: 제공자 → 소비자 패턴에서
EnumString
사용을 시스템적으로 강제하기 위해 ArchUnit을 활용했습니다.- 공용 레포에 ArchUnit 규칙을 적용하여 컨슈머 코드에서 Enum 사용을 감지하고 빌드 시점에 실패하도록 설정했습니다.
- Meta-Expose를 통한 Enum 배포 의존성 끊기: 서비스 간 Enum 버전 동기화 문제를 해결하기 위해 설계되었습니다.
- 중앙
Meta-Expose-Hub
가 Enum을 사용하는 모든 서버를 watch하고, 버전이 올라가지 않은 서버를 감지하여 관리자에게 알림을 제공합니다. - 자동으로 노출되는 Enum API, 중앙 Hub에서의 정합성 검증, ServiceDiscovery를 통한 동적 서비스 식별, Grafana를 통한 시각화 및 모니터링 기능을 포함합니다.
- 중앙
개발 임팩트:
- Enum 관련 Deserialize 오류를 거의 완전히 제거하여 서비스 안정성을 대폭 향상시켰습니다.
- 개발자의 주의에 의존하는 것이 아닌, 시스템적으로 오류를 예방하고 관리할 수 있게 되어 운영 효율성을 증대했습니다.
- 신규 구성원도 쉽게 Enum 관리 규칙을 따를 수 있도록 하여 개발 생산성을 높였습니다.
- 수백 번의 배포와 확장되는 MSA 환경 속에서도 단 한 번의 Enum 이슈 없이 안정적인 서비스 운영을 달성했습니다.
📚 관련 자료
archunit
Java 기반 애플리케이션의 아키텍처 규칙을 정의하고 검증하는 라이브러리로, 토스뱅크에서 Enum 사용 규칙을 강제하는 데 활용된 핵심 도구입니다. 클래스 간의 의존성을 분석하고 제약을 걸어 코드의 일관성을 유지하는 데 사용됩니다.
관련도: 95%
jackson-databind
Java 객체와 JSON 간의 직렬화 및 역직렬화를 처리하는 데 널리 사용되는 라이브러리입니다. 토스뱅크에서 Enum을 `EnumString`으로 처리하면서 JSON과의 호환성을 유지하고 커스텀 역직렬화 로직을 구현하는 데 기반 기술로 활용되었습니다.
관련도: 80%
spring-cloud-sleuth
분산 추적 기능을 제공하는 라이브러리로, MSA 환경에서 서비스 간의 요청 흐름을 추적하고 디버깅하는 데 필수적입니다. 비록 직접적으로 Enum 관리와 관련되지는 않지만, MSA 환경에서 서비스 간 통신 및 오류 추적이라는 맥락에서 간접적인 관련성을 가집니다.
관련도: 50%