마이크로서비스(MSA) 아키텍처는 개발 속도를 높여주지만, QA에게는 ‘통합 테스트 지옥’을 선물하기도 합니다.
수십 개의 서비스가 서로 얽혀있어, 하나의 기능을 테스트하려면 다른 모든 서비스를 함께 실행해야 합니다.
이 과정은 너무 느리고, 불안정하며, 하나의 서비스에 장애가 생기면 다른 모든 팀의 테스트가 멈추는 비효율을 낳습니다.
이 문제를 해결하기 위해 등장한 영리한 해법이 바로 ‘계약 테스트(Contract Testing)’입니다.

Q. ‘계약 테스트’, 정확히 무엇인가요?
‘계약 테스트’는 여러 마이크로서비스가 서로 통신할 때, 각 서비스가 미리 정의된 ‘계약’을 잘 지키는지 독립적으로 검증하는 테스트 기법입니다.
전체 서비스를 모두 실행하지 않고도, 서비스 간의 API 호환성이 보장되는지 확인할 수 있습니다.
- 비유:
- 국제 표준 규격(ISO)과 같습니다.
- 한국에서 만든 볼트와 독일에서 만든 너트가 직접 만나보지 않아도 괜찮습니다.
- 두 부품 모두 ‘M12’라는 국제 표준 규격, 즉 ‘계약’에 따라 만들어졌다면, 우리는 이 둘이 서로 잘 맞을 것이라고 확신할 수 있습니다.
- 여기서 ‘계약’은 API의 요청과 응답 형식에 대한 약속입니다.
Q. ‘소비자 주도 계약 테스트’는 무슨 의미인가요?
‘계약 테스트’의 가장 일반적인 방식으로, 서비스를 사용하는 ‘소비자(Consumer)’가 자신이 필요한 데이터의 형식을 직접 정의하여 ‘계약’을 주도하는 것을 의미합니다.
- 프로세스 예시:
- 1. 소비자 (프론트엔드 팀):
- “저는 주문 정보를 화면에 표시하기 위해, ‘주문 서비스’가
orderId(숫자)와status(문자열)를 포함한 JSON 응답을 주었으면 좋겠습니다.” - 이 내용을 바탕으로 ‘계약’ 파일을 생성합니다.
- “저는 주문 정보를 화면에 표시하기 위해, ‘주문 서비스’가
- 2. Pact Broker (계약 관리소):
- 소비자가 만든 이 계약 파일은 ‘Pact Broker’라는 중앙 관리소에 저장되고 버전 관리됩니다.
- 3. 제공자 (주문 서비스 팀):
- ‘주문 서비스’는 Pact Broker에 저장된 최신 계약 파일을 가져옵니다.
- 그리고 자신이 정말로 이 계약을 지킬 수 있는지 확인하는 자동화 테스트를 수행합니다.
- 결과:
- 만약 ‘주문 서비스’ 개발자가 실수로
orderId를order_id로 바꾸면, 계약 테스트가 즉시 실패합니다. - 이를 통해, 프론트엔드 팀에 영향을 주기 전에 문제를 미리 발견하고 수정할 수 있습니다.
- 만약 ‘주문 서비스’ 개발자가 실수로
- 1. 소비자 (프론트엔드 팀):
Q. ‘계약 테스트’는 기존 API 테스트와 무엇이 다른가요?
검증의 ‘관점’이 다릅니다.
- 일반적인 API 테스트:
- 서비스 ‘제공자(Provider)’의 입장에서 진행됩니다.
- “우리 API가 명세서대로 잘 동작하는가?”를 검증하는 데 집중합니다.
- 계약 테스트:
- 서비스 ‘소비자(Consumer)’의 실제 사용 사례에 집중합니다.
- “내가 정말로 필요한 형식대로 제공자가 응답을 잘 주고 있는가?”를 검증합니다.
- 제공자는 수많은 기능을 가지고 있더라도, 소비자는 오직 자신이 사용하는 기능에 대한 계약만 신경 쓰면 됩니다.
Q. QA는 ‘계약 테스트’를 어떻게 활용할 수 있나요?
‘계약 테스트’는 QA가 E2E 테스트의 의존성을 줄이고, 더 빠르고 안정적인 피드백 루프를 만드는 데 핵심적인 역할을 합니다.
- 빠른 실패 확인:
- 전체 사용자 시나리오를 실행하는 무거운 E2E 테스트를 돌리지 않고도, API 응답 형식 변경과 같은 치명적인 통합 문제를 CI/CD 파이프라인 초반에 즉시 발견할 수 있습니다.
- 명확한 장애 지점 파악:
- 테스트가 실패하면, 어떤 소비자와 어떤 제공자 사이의 ‘계약’이 깨졌는지 명확하게 알 수 있습니다.
- 이는 수많은 서비스들 사이에서 어디가 문제인지 추측할 필요 없이, 원인 분석을 매우 빠르게 만들어 줍니다.
- 팀 간의 커뮤니케이션 강화:
- ‘계약’은 서비스 간의 공식적인 소통 문서 역할을 합니다.
- 한 팀이 API를 변경하기 전에, 이 변경이 다른 팀(소비자)에게 어떤 영향을 미칠지 ‘계약 테스트’를 통해 미리 알 수 있고, 사전에 논의할 수 있습니다.
결론: 신뢰를 테스트하는 기술
‘계약 테스트’는 복잡한 마이크로서비스 환경에서, 느리고 불안정한 E2E 테스트에 대한 의존도를 줄여주는 가장 효과적인 ‘테스트 전략’ 중 하나입니다.
이는 단순히 버그를 찾는 것을 넘어, 여러 팀이 서로를 믿고 독립적으로, 하지만 안전하게 협업할 수 있도록 돕는 강력한 커뮤니케이션 도구입니다.
Pact와 같은 도구를 활용하여 ‘계약 테스트’를 도입하는 것은, MSA 환경의 QA가 한 단계 더 성장하기 위한 중요한 도전 과제입니다.
참고 자료 (References)
- 우아한형제들 기술블로그 – 컨트랙트 테스트 (Pact는 거들 뿐):
https://techblog.woowahan.com/2697/ - Pact – What is contract testing?:
https://docs.pact.io/