DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 아임웹
  • Related reads#TypeScript
#Backend

1. 통과하는 테스트 뒤에 숨어 있던 것들

1. 통과하는 테스트 뒤에 숨어 있던 것들
01

Summary

AI가 양산한 2,199개의 Mock 지옥에서 단 4개만 남기고 탈출한 비결

통합 테스트 환경 구축부터 골든 마스터 기법까지, 흔들리지 않는 튼튼한 테스트 코드를 만드는 실무 가이드

AI 에이전트와 함께 작성하며 폭발적으로 증가한 Mock 테스트의 실체를 파헤치고 이를 구조적으로 해결한 실무 전환 과정을 소개합니다. Testcontainers와 WireMock을 활용해 포트 충돌 없이 격리된 통합 테스트 인프라를 손쉽게 구축한 노하우를 공유합니다. 나아가 계산 오차를 1원 단위까지 감지하는 특성화 테스트 기법과 기록형 Mock 설계를 통해 레거시 코드를 안전하게 리팩토링하는 여정을 생생히 보여줍니다.

  • 01AI 에이전트의 단일 파일 편향 및 테스트 패스 완료 조건에 따른 Mock 무한 증식의 자기강화 루프 현상 규명
  • 02Testcontainers(MySQL)와 WireMock 동적 포트 매핑을 통해 충돌 걱정 없는 멀티 워커 병렬 통합 테스트 환경 구축
  • 03구현에 종속적인 toHaveBeenCalled 검증 대신 계약에 묶인 전송 페이로드 중심의 기록형 Mock 도입
  • 04리팩토링 과정에서 소수점 오차 및 음수 경계값까지 빈틈없이 체크하는 특성화 테스트(Golden Master) 스냅샷 설계
  • 05CI 빌드를 무력화하던 777건의 테스트 코드 lint 기술 부채를 소거해 강건한 빌드 수문장 게이트웨이 마련

+RECOMMENDATION

AI 코딩 도구를 적용한 후 늘어나는 테스트 유지보수 비용으로 고통받거나, 작은 구현 변경에도 수많은 Mock 단언문이 깨져 스트레스를 받는 백엔드 엔지니어 및 테크 리드에게 일독을 강력히 권장합니다.

The Problem

어필리에이트 서비스의 3개 TypeScript 백엔드 서버에서 통합 테스트가 전혀 없는 상황에서 테스트 작성을 AI 에이전트에 의존한 결과, 무분별하게 Mock이 양산되어 최대 2,199개까지 증가했습니다. 이로 인해 사소한 시그니처 변경에도 무관한 테스트들이 깨지고, 실제 입출력 값 검증 대신 단순 호출 여부만 검증하는 취약한 구조가 고착화되었습니다.

The Solution

Testcontainers와 WireMock을 도입하여 실제 운영 환경과 유사한 격리된 통합 테스트 환경을 구축했습니다. DB 연동 로직은 통합 테스트로 검증하고, 외부 프로세스 경계는 호출 횟수가 아닌 송신 페이로드를 검증하는 기록형 Mock으로 전환하였으며, 리팩토링 안정성을 담보하기 위해 대량의 금액 계산 조합을 스냅샷으로 동결하는 특성화 테스트(Golden Master)를 구현했습니다.

The Result

정교한 테스트 인프라 구축과 점진적인 전환 작업을 거쳐 Mock의 개수를 기존 2,199개에서 단 4개로 대폭 축소하는 데 성공했습니다. 더불어 테스트 코드 내의 777건의 lint 규칙 위반 부채를 전량 해결하여 정상적인 CI 게이트를 복구하였고 계산 로직 변경 시의 미세한 오차도 원천적으로 차단할 수 있게 되었습니다.

Trade-off

실제 도커 컨테이너를 띄워 DB 및 외부 API 스텁을 검증하므로, 순수 메모리 기반의 유닛 테스트에 비해 초기 인프라 설정 비용이 크고 로컬 및 CI 파이프라인상에서의 전체 테스트 실행 시간이 소폭 증가할 수 있습니다. 또한 현재의 결과값을 그대로 스냅샷화하는 특성화 테스트 방식의 특성상 기존 코드 내에 존재하던 잠재적 버그까지 정상 스펙으로 오인하여 동결시킬 수 있으므로 면밀한 검증 검토가 동반되어야 합니다.

03

Key Concepts

Concept · 01

Testcontainers

Docker 컨테이너를 사용하여 테스트 실행 시 데이터베이스나 캐시 등의 실제 인프라 구성 요소를 코드 레벨에서 주입하고 라이프사이클을 손쉽게 제어할 수 있게 돕는 라이브러리입니다.

  • MySQL 컨테이너를 동적으로 빌드하고 무작위 포트를 할당하여 로컬 개발 환경 및 CI 파이프라인 간의 충돌 방지
  • 실제 상용 DB의 엔티티 명세와 일치하는 실시간 스키마 생성 및 정렬 방식을 테스트 전용으로 활용
Concept · 02

WireMock

HTTP 기반의 외부 서비스를 스터빙하고 요청 및 응답을 시뮬레이션할 수 있는 가상 목 서버 도구로, 통신 사양 분석과 요청 데이터 유효성 검사를 독립적으로 수행합니다.

  • 결제나 계좌 인증 등 프로세스 외부에 있는 HTTP 연동 구역을 Mocking하지 않고 완벽한 가상 서버 통신으로 대체
  • 외부로 유출되는 예금주 정보 등의 페이로드 구조가 원래 사양대로 유실 없이 유지되고 배출되는지 직접 가로채 정밀 검증
Concept · 03

특성화 테스트 (Characterization Test / Golden Master)

현재 구현된 코드가 산출하는 다양한 스냅샷 결과를 기준 지표(골든 마스터)로 삼아 안전핀을 잠근 채 구조를 개편하고 의도치 않은 변조를 추적하는 역공학 테스트 기법입니다.

  • 금액, 크리에이터 수수료, 플랫폼 비율 등의 실분포 경계 데이터를 교차한 수천 개의 조합 결과물을 단일 스냅샷 파일로 영구 동결
  • 내부 로직 리팩토링 시 금액이 단 1원이라도 틀어지는 회귀 오차를 컴파일 및 실시간 비교 프레임워크 상에서 바로 검출
Continue reading · same source

아임웹More from 아임웹

View all posts from 아임웹
  • VPC Lattice 기반 서비스 네트워크 재설계와 비용 최적화 사례

    VPC LatticeAWSKubernetes
    1주 전
  • 963초짜리 쿼리 하나가 HLL 205만까지 끌어올렸습니다

    Aurora MySQLMVCCHLL
    2주 전
  • 2. 유스케이스를 격리하고 의존성을 나누어 Lint로 규칙 세우기

    TypeScriptESLintNestJS
    3주 전
  • 보안 계정을 처음부터 다시 설계했습니다.

    AWSOktaTransit Gateway
    1개월 전
  • GA에게 AI를 쥐어주면 생기는 일

    Slack APIOAuthGenerative AI
    1개월 전

Related reads#TypeScript

Explore #TypeScript
채널 톡·React

AI가 읽는 디자인 시스템: 추상화를 다시 설계한 이유

#TypeScript5일 전
아임웹

2. 유스케이스를 격리하고 의존성을 나누어 Lint로 규칙 세우기

#TypeScript3주 전
미리디·Micro Frontends

micro frontends가 미리캔버스 프론트엔드팀이 일하는 방식을 바꾸는 이유

#TypeScript1개월 전
NAVER D2

FE News 26년 7월 소식을 전해드립니다.

#TypeScript1개월 전
NAVER D2

FE News 26년 7월 소식을 전해드립니다.

#TypeScript1개월 전

Source

아임웹
아임웹
Engineering Blog

Published · August 7, 2026

Topics

TypeScriptTestcontainersWireMockMockingRefactoring