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 서버는 처음 보는 정보이기 때문에 역직렬화 오류 발생

전략 수립

  1. 클라이언트(소비자) → 서버(제공자) : 요청 수신자 입장에서는 오류가 명확해야 한다.
    • Enum 값을 엄격하게 검증하고, 알 수 없는 값은 400 Bad Request 등의 클라이언트 오류로 응답
  2. 서버(제공자) → 클라이언트(소비자) : 처리는 소비자의 선택에 맡긴다.
    • 반대의 경우 (클라이언트가 Enum 값을 파싱하는 경우) 에는 서버의 확장과 별개로 클라이언트가 새로운 정보를 모를 수 있기에, 클라이언트가 대응 방식을 정하도록 선택지를 열어 두어야 한다.
      • ex. 알 수 없는 값 → 경고만 띄우고 무시
      • fallback 동작으로 “UNKNOWN” 이나 “기타” 로 처리
      • 오류를 발생시켜 명시적으로 사용자에게 알림

해결 방법

  1. EnumString : Enum을 선택적으로 deserialize
    • 알 수 없는 Enum 값이 들어오면, 유연하게 ‘예외 처리’ / ‘기본값 사용’ 방식으로 대처하도록 Wrapper Class 구현
  2. ArchUnit : EnumString 강제 전파
    • 모든 제공자 → 소비자 패턴에서 Enum이 아닌 EnumString을 사용하도록 강제 통일
    • ArchUnit : 패키지와 클래스간 의존성을 테스트하는 오픈소스 라이브러리 도구
      • 공용 레포에 ArchUnit으로 규칙 생성 후, 컨슈머 코드에서 Enum 사용 감지 시 빌드 시점에서 실패하도록 설정
  3. Meta-Expose : Enum 배포 의존성 끊기
    • 모든 Enum이 유연한 것은 아님 (ex. 반드시 서비스 간 버전업이 같이 이루어져야만 하는 Enum, etc.)
    • Enum의 버전 동기화 상태를 관찰/감지하는 시스템 설계 및 도입
      • Meta-Expose-Hub에서 Enum을 사용하는 모든 서버를 지켜보다가, 버전이 올라가지 않은 서버를 자동 감지하여 어드민 및 모니터링 도구로 알림 전송

오늘 배운 것

내일 할 일

  1. 알고리즘 공부

참고자료

results matching ""

    No results matching ""