2025-08-12
1일 1아티클
토스 테크
MSA에서 Enum 정합성 처리 방법
상황
- Enum : 타입 안정성, 컴파일 타임 체크, IDE 자동완성 등 장점
- 그러나 MSA에서, 공유된 Enum을 가진 서버 간에 정의되지 않은 Enum 수신 시 Deserialize Error 발생
ex. A, B 서버가 ‘PayStatus(결제 상태)’ 라는 Enum을 공유하고 있는 상황
A 서버에만 새로운 상태인 ‘REFUND_SUCCESS(환불 완료)’ 추가이후, A 서버가 B 서버에게 PayStatus 값으로 ‘REFUND_SUCCESS’를 보내면, B 서버는 처음 보는 정보이기 때문에 역직렬화 오류 발생
전략 수립
- 클라이언트(소비자) → 서버(제공자) : 요청 수신자 입장에서는 오류가 명확해야 한다.
- Enum 값을 엄격하게 검증하고, 알 수 없는 값은
400 Bad Request
등의 클라이언트 오류로 응답
- Enum 값을 엄격하게 검증하고, 알 수 없는 값은
- 서버(제공자) → 클라이언트(소비자) : 처리는 소비자의 선택에 맡긴다.
- 반대의 경우 (클라이언트가 Enum 값을 파싱하는 경우) 에는 서버의 확장과 별개로 클라이언트가 새로운 정보를 모를 수 있기에, 클라이언트가 대응 방식을 정하도록 선택지를 열어 두어야 한다.
- ex. 알 수 없는 값 → 경고만 띄우고 무시
- fallback 동작으로 “UNKNOWN” 이나 “기타” 로 처리
- 오류를 발생시켜 명시적으로 사용자에게 알림
- 반대의 경우 (클라이언트가 Enum 값을 파싱하는 경우) 에는 서버의 확장과 별개로 클라이언트가 새로운 정보를 모를 수 있기에, 클라이언트가 대응 방식을 정하도록 선택지를 열어 두어야 한다.
해결 방법
EnumString
: Enum을 선택적으로 deserialize- 알 수 없는 Enum 값이 들어오면, 유연하게 ‘예외 처리’ / ‘기본값 사용’ 방식으로 대처하도록 Wrapper Class 구현
ArchUnit
: EnumString 강제 전파- 모든
제공자 → 소비자
패턴에서Enum
이 아닌EnumString
을 사용하도록 강제 통일 - ArchUnit : 패키지와 클래스간 의존성을 테스트하는 오픈소스 라이브러리 도구
- 공용 레포에 ArchUnit으로 규칙 생성 후, 컨슈머 코드에서 Enum 사용 감지 시 빌드 시점에서 실패하도록 설정
- 모든
Meta-Expose
: Enum 배포 의존성 끊기- 모든 Enum이 유연한 것은 아님 (ex. 반드시 서비스 간 버전업이 같이 이루어져야만 하는 Enum, etc.)
- Enum의 버전 동기화 상태를 관찰/감지하는 시스템 설계 및 도입
Meta-Expose-Hub
에서Enum
을 사용하는 모든 서버를 지켜보다가, 버전이 올라가지 않은 서버를 자동 감지하여 어드민 및 모니터링 도구로 알림 전송
오늘 배운 것
내일 할 일
- 알고리즘 공부