요약 (TL;DR)
SoapUI 목 서비스는 SOAP 또는 REST 엔드포인트를 로컬에서 시뮬레이션하지만, 실행 중인 Java 프로세스, 수동 디스패치 구성이 필요하며 공유 머신 없이는 팀 간에 공유할 수 없습니다. Apidog의 Smart Mock은 API 스키마에서 목 응답을 생성하고 클라우드에서 실행되며 팀과 자동으로 공유됩니다.
서론
목 서비스는 API 개발의 일반적인 문제를 해결합니다: 서비스가 준비되기 전에 클라이언트 코드가 서비스를 어떻게 처리하는지 테스트하고 싶을 때, 또는 실제 시스템에서 발생시키지 않고 예외 사례(오류, 느린 응답)를 테스트하고 싶을 때 사용됩니다.
SoapUI의 목 서비스 기능은 초기 버전부터 제공되었으며 잘 작동합니다. 구성한 규칙에 따라 요청에 응답하는 로컬 HTTP 서버를 실행합니다. 문제는 이 로컬 프로세스가 마찰을 일으킨다는 것입니다: SoapUI를 닫으면 중단되고, 다른 팀원들은 네트워크 트릭 없이는 접근할 수 없으며, 구성 인터페이스가 번거롭습니다.
이 가이드는 SoapUI 목 서비스의 작동 방식, 설정 방법, 팀이 겪는 일반적인 문제, 그리고 Apidog의 접근 방식이 어떻게 다른지 다룹니다.
SoapUI 목 서비스 작동 방식
SoapUI는 프로젝트 내 기존 SOAP 또는 REST 인터페이스에서 목 서비스를 생성합니다. 목 서비스는 다음을 수행합니다:
- 구성한 로컬 포트에서 수신 대기합니다 (예:
http://localhost:8088/MockService) - 들어오는 요청을 가로챕니다.
- 디스패치 로직을 사용하여 요청을 "목 응답"과 일치시킵니다.
- 구성된 응답을 반환합니다.
SOAP 서비스의 경우, SoapUI는 WSDL에서 목 응답을 자동으로 생성하여 각 작업에 대한 스텁 응답을 만듭니다. 이는 서비스가 존재하기 전이나 실제 엔드포인트에 접근하기 전에 서비스를 시뮬레이션하는 데 유용합니다.
SoapUI 목 서비스 설정하기 (단계별)
SOAP 인터페이스의 경우
- SoapUI 프로젝트에서 프로젝트 트리에서 SOAP 인터페이스를 마우스 오른쪽 버튼으로 클릭합니다.
- "MockService 생성"을 선택합니다.
- 대화 상자에서 다음을 구성합니다:
- 서비스 이름 (예: "OrderService Mock")
- 포트 번호 (기본값은 8088; 해당 포트가 사용 중이면 변경)
- 경로 (예:
/orders)
- 확인을 클릭합니다. SoapUI는 프로젝트 트리에 MockService 노드를 생성합니다.
- MockService 노드를 확장합니다. 인터페이스의 각 SOAP 작업에 대한 "MockOperation"을 볼 수 있습니다.
- MockOperation을 두 번 클릭하여 목 응답 편집기를 엽니다.
- 시뮬레이션하려는 값을 반환하도록 SOAP 응답 XML을 편집합니다.
- MockService 편집기에서 녹색 재생 버튼을 클릭하여 로컬 서버를 시작합니다.
이제 목 서비스가 http://localhost:8088/orders에서 실행 중입니다. 클라이언트 코드를 이 URL로 지정하세요.
REST 인터페이스의 경우
- 프로젝트 트리에서 REST 인터페이스 또는 리소스를 마우스 오른쪽 버튼으로 클릭합니다.
- "MockService에 추가" 또는 "MockService 생성"을 선택합니다.
- 위와 같이 포트와 경로를 구성합니다.
- 각 리소스/메서드에 대해 목 응답 본문과 상태 코드를 구성합니다.
- 목 서비스를 시작합니다.
디스패치 구성하기
기본적으로 SoapUI의 목 서비스는 찾은 첫 번째 목 응답을 반환합니다. 다른 입력에 대해 다른 응답을 원한다면 "디스패치 스크립트"(Groovy)를 구성하거나 "SEQUENCE" 디스패치 유형을 사용합니다.
시퀀스 디스패치: 연속 호출 시 고정된 순서로 응답을 반환합니다. 호출 1은 응답 A를 받고, 호출 2는 응답 B를 받습니다.
스크립트 디스패치: Groovy 스크립트가 요청을 검사하고 로직에 따라 응답 이름을 반환합니다.
디스패치 스크립트 예시:
def request = mockRequest.getRequestContent()
if (request.contains("orderId>12345")) {
return "OrderFoundResponse"
} else {
return "OrderNotFoundResponse"
}
여러 개의 이름 있는 목 응답(예: "OrderFoundResponse", "OrderNotFoundResponse")을 생성하고, 디스패치 스크립트가 들어오는 요청 내용에 따라 반환할 응답을 선택합니다.
SoapUI 목 서비스의 일반적인 문제
문제 1: SoapUI를 닫으면 목 서비스가 중단됨
SoapUI의 목 서비스는 SoapUI JVM 프로세스의 일부로 실행됩니다. SoapUI를 닫으면 목 서비스가 중단됩니다. 목 서비스를 사용하던 팀원들은 이를 잃게 됩니다.
해결 방법:
- 전용 머신 또는 VM에서 SoapUI를 계속 열어둡니다.
- SoapUI의 명령줄 목 서버 옵션을 사용합니다:
mockservicerunner.sh -p 8088 -s "OrderService Mock" project.xml - 항상 목 서비스를 실행하는 영구적인 공유 머신을 사용합니다.
이들 중 어느 것도 우아한 해결책은 아닙니다. 명령줄 옵션은 도움이 되지만, 여전히 SoapUI와 Java가 설치된 머신이 필요합니다.
문제 2: 팀 전체에 목 서비스 공유하기
localhost:8088에서 실행되는 목 서비스는 이를 실행하는 사람만 접근할 수 있습니다. 팀원들이 동일한 목 서비스에 접근하려면 해당 머신에 대한 네트워크 접근(방화벽 규칙, VPN 설정)이 필요하거나 공유 서버에서 목 서비스를 실행해야 합니다.
문제 3: 복잡한 XML에서 디스패치 스크립트가 작동하지 않음
SoapUI 디스패치 스크립트는 원시 XML 본문에서 Groovy 문자열 일치를 사용합니다. SOAP 엔벨로프에는 네임스페이스가 있으며, 클라이언트에 따라 동일한 논리적 값이 다른 네임스페이스 접두사와 함께 나타날 수 있습니다. <orderId>12345</orderId>와 같은 리터럴 문자열을 검색하는 스크립트는 접두사가 다르면 작동하지 않습니다.
이 문제를 해결하려면 SoapUI의 GroovyUtils 클래스를 사용하여 디스패치 스크립트에서 적절한 XML 파싱이 필요하며, 이는 복잡성을 증가시킵니다.
문제 4: 호출 간 상태가 유지되지 않음
SoapUI 목 서비스는 기본적으로 무상태(stateless)입니다. 생성-읽기 워크플로우(생성을 위한 POST, 조회를 위한 GET)를 목업하려면 공유 변수에 상태를 저장하는 Groovy 디스패치 스크립트가 필요합니다. 이는 작동하지만 취약합니다.
문제 5: 목 서비스를 위한 SSL
SoapUI 목 서비스에 HTTPS를 구성하려면 키스토어를 설정하고, SoapUI의 SSL 설정을 구성하고, 클라이언트를 올바른 인증서로 지정해야 합니다. 이는 HTTP 전용 목 서비스보다 훨씬 더 복잡합니다.
Apidog Smart Mock: 비교
Apidog의 목 접근 방식은 실행 중인 프로세스가 아닌 API 디자인에서 시작됩니다.
Apidog에서 API 엔드포인트(메서드, 경로, 요청 스키마, 응답 스키마)를 정의하면, Apidog는 클라우드에서 자동으로 목 엔드포인트를 생성합니다. 별도의 구성이 필요 없습니다.
목 URL은 다음과 같습니다: https://{your-project}.mock.apidog.io/orders/{id}
이 URL은:
- 항상 실행 중입니다 (시작하거나 중지할 로컬 프로세스가 없음).
- 프로젝트에 접근 권한이 있는 모든 팀원이 접근할 수 있습니다.
- 정의한 스키마에서 응답을 생성합니다.
Apidog가 목 응답을 생성하는 방법
Apidog는 응답 스키마(JSON Schema 또는 OpenAPI 응답 정의)를 읽고 현실적인 가짜 데이터를 생성합니다. orderId가 UUID 형식의 string이라고 명시된 스키마는 무작위 UUID를 반환합니다. amount가 0에서 10000 사이의 number라고 명시된 스키마는 해당 범위의 숫자를 반환합니다.
특정 필드에 대한 사용자 정의 목 규칙을 구성할 수도 있습니다. 예측 가능한 값이 필요할 때 orderId가 항상 "test-123"을 반환하도록 설정할 수 있습니다.
Apidog Mock의 SOAP 엔드포인트
Apidog의 Smart Mock은 JSON 응답을 사용하는 REST 엔드포인트용으로 설계되었습니다. SOAP 엔드포인트의 경우, 목 설정은 수동입니다: Apidog에서 요청을 생성하고, SOAP 엔벨로프를 사용하여 사용자 정의 응답을 구성한 다음, Apidog의 목 서버를 사용하여 이를 반환합니다.
이는 SoapUI의 WSDL 기반 목 생성보다 자동화가 덜하지만, 로컬 Java 프로세스를 실행하지 않고 간단한 SOAP 목이 필요한 팀에는 유용합니다.
상태 저장 목업
Apidog는 상태 저장 목업 동작을 위한 사용자 정의 응답 스크립트를 지원합니다. JavaScript 목 스크립트에서 요청 본문을 검사하고, 요청 내용에 따라 다른 응답을 반환할 수 있으며, 이는 SoapUI의 디스패치 스크립트와 유사하지만 JavaScript로 작성됩니다.
나란히 비교
| 기능 | SoapUI Mock | Apidog Smart Mock |
|---|---|---|
| Java 필요 | 예 | 아니요 |
| 항상 실행 | 명령줄 실행기에서만 | 예 (클라우드) |
| 팀 접근 가능 | 수동 네트워킹 | 예, 공유 URL을 통해 |
| WSDL 자동 생성 | 예 | 아니요 |
| REST 스키마 기반 | 아니요 | 예 |
| 동적 응답 | Groovy 디스패치 | JavaScript 목 스크립트 |
| HTTPS 지원 | 수동 키스토어 설정 | 내장 |
| 상태 저장 목업 | Groovy 변수를 통해 | JavaScript 스크립트를 통해 |
| 무료 | 예 | 예 |
각각을 언제 사용해야 하는가
다음 경우에 SoapUI 목 서비스를 사용하세요:
- WSDL 기반 SOAP 서비스를 목업해야 하고 자동 생성된 응답 스텁을 원할 때
- 팀이 오프라인으로 작업하거나 엄격한 네트워크 제어 뒤에서 작업할 때
- 이미 SoapUI 생태계에 깊이 관여하고 있고 도구를 변경하고 싶지 않을 때
다음 경우에 Apidog Smart Mock을 사용하세요:
- 팀이 REST 엔드포인트를 목업하고 네트워킹 설정 없이 공유 접근이 필요할 때
- 수동 개입 없이 계속 실행되는 목 서버를 원할 때
- 새 프로젝트를 시작하고 구현 전에 API 계약을 정의할 때
- 목 서비스를 위해 Java 환경을 설치하고 유지 관리하는 것을 피하고 싶을 때
자주 묻는 질문 (FAQ)
SoapUI 목 서비스를 GUI 없이 실행할 수 있나요? 예. SoapUI에는 mockservicerunner.sh (Linux/macOS)와 mockservicerunner.bat (Windows)가 포함되어 있습니다. 프로젝트 파일 경로와 서비스 이름을 사용하여 실행하세요. Java는 설치되어 있어야 하지만, GUI를 열어둘 필요는 없습니다.
Apidog가 SOAP 목 서비스를 지원하나요? 부분적으로 지원합니다. Apidog의 목 서버에서 SOAP XML을 사용하여 사용자 정의 응답을 구성할 수 있습니다. WSDL 기반의 스텁 응답 자동 생성은 제공되지 않습니다. 잘 이해된 SOAP 인터페이스를 사용하는 팀에게는 수동 설정이 관리 가능합니다.
SoapUI 목 서비스가 느린 응답을 시뮬레이션할 수 있나요? 예. 목 응답 구성에서 "지연(Delay)" 값을 밀리초 단위로 설정하세요. Apidog는 또한 느린 네트워크 상태를 시뮬레이션하기 위한 응답 지연 구성을 지원합니다.
Apidog는 얼마나 많은 목 요청을 처리할 수 있나요? Apidog의 클라우드 목 서버는 일반적인 개발 및 테스트 부하를 처리합니다. 대용량 성능 테스트의 경우, 전용 목 서버 도구가 더 적합할 수 있습니다.
두 명의 팀원이 동일한 엔드포인트에 대해 다른 목 응답이 필요한 경우 어떻게 되나요? SoapUI에서는 각 사람이 자체 로컬 목 서비스를 실행하고 독립적으로 구성할 수 있습니다. Apidog에서는 여러 환경을 생성하거나 쿼리 매개변수를 사용하여 다른 응답 시나리오를 선택할 수 있습니다. Apidog의 "Mock expects" 기능은 특정 요청 조건을 특정 응답과 일치시킬 수 있도록 합니다.
Apidog의 목은 API가 먼저 완전히 정의되어야 하나요? 응답 스키마는 Apidog가 현실적인 데이터를 생성하는 데 도움이 되지만, 전체 스키마 없이도 수동 목 응답을 생성할 수 있습니다. 엔드포인트를 정의하고 사용자 정의 응답 본문을 설정하면 목이 작동합니다.
SoapUI의 목 서비스는 기능적이지만 로컬 Java 프로세스에 묶여 있습니다. 지속적이고 공유 가능한 목이 필요한 현대 팀에게 Apidog의 클라우드 기반 접근 방식은 조정 오버헤드를 줄여줍니다.
