400. 통합 테스트 (Integration Test) - 모듈 간 인터페이스 검증

⚠️ 이 문서는 개별 부품(단위 테스트)이 아무리 완벽해도 부품들을 조립하는 순간 규격이 맞지 않아 발생하는 치명적인 결함(인터페이스 오류)을 찾아내기 위해, 모듈들을 점진적으로 결합하면서 데이터의 흐름을 검증하는 **'통합 테스트(Integration Testing)'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 통합 테스트는 100% 통과한 A 모듈(회원가입)과 B 모듈(DB 저장)을 **연결(결합)**했을 때, 두 모듈 사이의 접점(Interface)에서 데이터가 유실되거나 타입이 깨지는 오류를 찾아내는 과정이다.
  2. 가치: 혼자서는 잘 돌아가던 코드들이 함께 모이면 전역 변수 충돌, API 파라미터 불일치, 응답 지연 등 온갖 '조립 불량'을 일으킨다. 이를 시스템 전체로 번지기 전에 컴포넌트 단위로 조기에 차단한다.
  3. 기술 체계: 한 번에 다 합치면 원인을 찾을 수 없으므로(빅뱅 테스트의 한계), 위에서 아래로(하향식-Stub 사용) 또는 아래서 위로(상향식-Driver 사용) 하나씩 차분하게 결합하는 점진적 통합 방식을 주로 사용한다.

Ⅰ. 개요: 부품은 100점, 조립품은 0점 (Context & Necessity)

우주선을 만들 때 엔진도 완벽하고(단위 테스트 패스), 연료통도 완벽했다(단위 테스트 패스). 그런데 우주선이 폭발했다. 원인은 엔진의 파이프는 5cm인데, 연료통의 파이프가 6cm라서 중간에 연료가 새어나갔기 때문이다.

소프트웨어에서도 정확히 똑같은 일이 벌어진다.

  • A 개발자: "제가 만든 결제요청() 함수는 완벽해요! (단위 테스트 완료)"
  • B 개발자: "제가 만든 카드사_API() 함수도 완벽해요! (단위 테스트 완료)"
  • 결합 결과 (폭발 💥): A는 날짜를 YY/MM/DD 포맷으로 던졌는데, B의 함수는 YYYY-MM-DD 포맷을 기대하고 있었다. 파라미터 규격 불일치로 에러가 터진다.

단위 테스트가 '격리된 공간(Mock)'에서 나 혼자 잘하는지 보는 것이라면, **통합 테스트(Integration Test)**는 진짜 DB, 진짜 API, 진짜 다른 모듈을 엮어서 **"모듈 간의 대화(Interface)가 잘 통하는가?"**를 검증하는 협동 테스트다.

📢 섹션 요약 비유: 이케아(Lego) 블록을 조립할 때, 개별 블록의 모양이 예쁜지 보는 건 단위 테스트입니다. 통합 테스트는 블록의 '튀어나온 동그라미(인터페이스)'와 다른 블록의 '파인 구멍'이 헐겁지 않고 딱 맞물려 들어가는지를 껴맞춰 보는 과정입니다.


Ⅱ. 통합 테스트의 주요 오류 유형

통합 테스트에서 주로 발견되는 '조립 불량' 버그들은 다음과 같다.

  1. 데이터 형식 불일치 (Data Format Mismatch): 위에서 언급한 날짜 포맷이나, 한쪽은 String을 주는데 한쪽은 Integer를 받는 경우.
  2. 타이밍 및 동기화 오류 (Timing Issue): A 모듈이 B 모듈에 데이터를 던졌는데, B가 처리하는 데 3초가 걸려서 A가 타임아웃(Timeout)으로 뻗어버리는 경우. (단위 테스트의 Mock 객체는 0.1초 만에 응답했기 때문에 이 버그를 잡지 못한다.)
  3. 전역 변수 충돌 (Global Variable Conflict): A와 B가 우연히 같은 이름의 전역 변수 메모리를 건드리면서 값이 오염되는 현상.

Ⅲ. 점진적 통합 vs 비점진적 통합

부품을 조립하는 순서와 전략이 매우 중요하다. 100개의 부품을 어떻게 조립하느냐에 따라 버그를 찾는 난이도가 극과 극으로 나뉜다.

1. 빅뱅 통합 (Big Bang Integration) - 비점진적

  • 방식: 100개의 부품을 한꺼번에 다 털어 넣고 전원을 켜보는 무식한 방식.
  • 특징: "에러가 났습니다!" 라고 뜨는데, 100개 중 어디서 났는지 추적이 아예 불가능(Fault Isolation 실패)하다. 주먹구구식 개발에서나 쓰는 안티패턴이다. (401번 문서 참조)

2. 점진적 통합 (Incremental Integration)

  • 방식: A와 B를 먼저 결합해서 테스트하고, 성공하면 C를 붙여보고, 성공하면 D를 붙이는 우아한 방식.
  • 에러가 나면 "방금 붙인 C가 문제구나!" 하고 즉시 범인을 찾을 수 있다.
  • 방향성에 따른 분류:
    • 하향식 (Top-Down): 메인 화면(UI)부터 붙여나가며, 아직 안 만든 밑바닥 DB 모듈 대신 가짜 로봇(Stub)을 쓴다. (402번 문서)
    • 상향식 (Bottom-Up): 밑바닥 DB 모듈부터 만들고, 얘한테 명령을 내릴 상위 UI 대신 가짜 조종사(Driver)를 붙여본다. (403번 문서)
    • 샌드위치 (Sandwich): 위와 아래에서 동시에 조립해 들어와서 중간에서 만난다. (404번 문서)
┌─────────────────────────────────────────────────────────────────────────┐
│           단위 테스트와 통합 테스트의 포커스 차이 시각화                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│ 🔬 [ 단위 테스트 (Unit Test) : 현미경 검사 ]                            │
│    [ 모듈 A ] ──▶ (내부 로직만 검증) ──▶ OK!                            │
│    [ 모듈 B ] ──▶ (내부 로직만 검증) ──▶ OK!                            │
│                                                                         │
│ 🤝 [ 통합 테스트 (Integration Test) : 이음새 검사 ]                     │
│                         (어? 구멍 크기가 다르네? 에러!)                 │
│    [ 모듈 A ] ━━━━━━▶ 💥 ◀━━━━━━ [ 모듈 B ]                             │
│        (보내는 파라미터)        (받는 파라미터)                         │
│                                                                         │
│ ★ 핵심: 통합 테스트는 모듈 자체의 완벽함이 아니라,                      │
│         모듈과 모듈 사이의 '인터페이스(화살표)'를 집중적으로 검사한다.  │
└─────────────────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"혼자서는 천재지만, 모이면 바보가 되는 시스템을 구원하라." 오늘날의 마이크로서비스 아키텍처(MSA) 환경에서 통합 테스트의 중요성은 단위 테스트를 압도할 정도로 커졌다. 수십 개의 컨테이너가 서로 REST API와 gRPC로 대화를 나누는 분산 시스템에서는, 모듈 자체의 에러보다 통신 규약과 네트워크 지연으로 인한 결합 오류가 시스템 장애의 90%를 차지하기 때문이다. 따라서 CI/CD 파이프라인에서 깐깐하게 짜인 API 계약(Contract) 기반의 통합 테스트는, 파편화된 코드 조각들을 하나의 위대한 심포니로 완성시키는 지휘자의 역할을 수행한다.


📌 관련 개념 맵

  • 전제되는 테스트: 단위 테스트 (Unit Test)
  • 통합의 방식들: 빅뱅, 하향식(Top-down), 상향식(Bottom-up), 샌드위치(Sandwich)
  • 더미 객체(Test Double): 스텁(Stub), 드라이버(Driver)
  • 진화된 형태: 계약 기반 테스트 (Contract Testing, 예: Pact 프레임워크)

👶 어린이를 위한 3줄 비유 설명

  1. 로봇 장난감을 만들 때, 오른팔이 잘 구부러지는지(단위테스트), 몸통 건전지가 잘 켜지는지(단위테스트) 따로따로 검사해서 모두 합격했어요.
  2. 그런데 오른팔을 몸통에 끼우려고 하니 연결 부위 크기가 달라서 억지로 끼우다 부러져버렸어요! (인터페이스 조립 불량)
  3. 이렇게 부품과 부품을 서로 '연결'할 때 아귀가 딱 맞물리는지, 연결된 상태에서 둘이 협동을 잘 하는지 확인하는 것이 바로 통합 테스트랍니다.