테스트 전략에서 Mock Server와 **AOP (Aspect-Oriented Programming)**를 활용하는 방식
테스트 전략에서 Mock Server와 **AOP (Aspect-Oriented Programming)**를 활용하는 방식은 주로 외부 의존성 분리, 예측 가능한 테스트 환경 구성, 그리고 비즈니스 로직 중심의 테스트 작성을 위한 기법입니다. 각각을 설명하고, 함께 사용할 때의 시너지도 예를 들어 드리겠습니다.
---
🧪 1. Mock Server 활용
✅ 개념
Mock Server는 실제 외부 API 서버나 DB, 메시지 브로커 같은 외부 시스템을 흉내 내는 가짜 서버입니다. 테스트에서 외부 시스템에 의존하지 않도록 하기 위해 사용됩니다.
✅ 주요 목적
외부 시스템이 아직 개발되지 않았거나 사용이 불가능한 경우 대응
테스트의 일관성과 속도 확보
실패 상황(에러, 타임아웃 등)을 시뮬레이션
✅ 도구 예시
WireMock (Java 생태계)
MockServer (Node.js/Java 등 지원)
MSW (Mock Service Worker) – 프론트엔드용
✅ 사용 예시
// WireMock을 사용한 예시
stubFor(get(urlEqualTo("/api/user/1"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{ \"id\": 1, \"name\": \"Alice\" }")));
---
🧭 2. AOP (Aspect-Oriented Programming) 활용
✅ 개념
AOP는 공통 관심사(Cross-Cutting Concern) 를 모듈화하기 위한 프로그래밍 기법입니다. 테스트에서는 주로 로깅, 보안, 트랜잭션 처리, 의존성 우회(mocking) 등에 사용됩니다.
✅ 테스트에서의 활용
특정 메서드 호출을 가로채어 임시 동작을 삽입하거나 변경
실제 로직을 바꾸지 않고 테스트 환경 구성
특정 조건에서만 모킹 or 스킵
✅ 예시 (Spring AOP)
@Aspect
@Component
public class MockServiceAspect {
@Around("@annotation(UseMockService)")
public Object useMockService(ProceedingJoinPoint joinPoint) throws Throwable {
// 조건에 따라 실제 서비스 대신 Mock 리턴
if (isTestProfile()) {
return mockResponse(); // 테스트용 응답
}
return joinPoint.proceed();
}
}
---
🔗 3. Mock Server와 AOP의 병행 활용 전략
✅ 시나리오: 외부 결제 API 호출 테스트
Mock Server는 결제 API의 다양한 응답 시나리오 (성공, 실패, 타임아웃 등)를 흉내 낸다.
AOP는 실제 서비스 코드에서 API 클라이언트 호출을 감싸서, 테스트 중일 경우 Mock Server로 요청을 우회시킨다.
✅ 장점
테스트 코드에 직접 모킹 로직을 넣지 않아 비즈니스 로직의 순수성 유지
다양한 테스트 시나리오를 유연하게 설정
실제 운영 환경에서는 아무런 영향을 주지 않음
---
🧠 결론
요소 Mock Server AOP
목적 외부 시스템 모킹 실행 흐름 제어 / 조건부 로직 삽입
테스트 관점 예측 가능한 외부 응답 제공 테스트 환경 분기 / 주입
장점 빠르고 안정적인 테스트 코드 비침습적 테스트 로직 삽입