안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 업브렐라에서 부하테스트를 할 때, 외부 API 의존성을 어떻게 해결하였는지 적어보려 합니다.
1. 문제 정의
업브렐라 서비스는 로그인한 유저만 사용할 수 있기 때문에, 로그인 하는 과정은 필수적입니다.
하지만 kakao oauth 로그인을 통해서만 접근이 가능하기 때문에 nGrinder 부하 테스트는 시작부터 어려움에 봉착하고 말았습니다.
이를 해결하기 위해 wiremock 이라는 mock server를 도입하기로 결정하였습니다.
2. WireMock
2 - 1. WireMock이란?
**Flexible API Mocking for Testing and Development**
WireMock은 Oauth와 같이 외부 API에 의존적인 부분을 Mocking할 수 있도록 도와주는 오픈소스 프로젝트입니다.
업브렐라 서버팀에서는 카카오 로그인을 한 후, 카카오 개인정보가 있으면 로그인, 없을 경우 회원가입으로 넘어가는 플로우를 가지고 있습니다. WireMock에서 카카오 로그인을 처리해준다면, 업브렐라 서버팀이 직면한 문제를 해결할 수 있을 것입니다.
2 - 2. WireMock 설치
wiremock 은 두 가지의 방법을 지원합니다.
- Stand Alone
- WireMock 서버를 독립적으로 실행합니다.
- Spring Boot Server에 설치
- Test시에만 동작하도록 설정합니다.
업브렐라 서버팀은 실제 oauth server를 이용하는 것처럼 테스트를 진행할 것이기 때문에 Stand Alone 방식을 도입하였습니다.
WireMock 은 jar 파일로, JVM 위에서 동작합니다.
-
우선 jar 파일을 아래의 공식 사이트에서 다운받습니다.
https://wiremock.org/
-
다운받은 wiremock 을 실행합니다.
java -jar wiremock-standalone-[최신-버전].jar --verbose
명령어를 실행하면 다음과 같이 wiremock이 실행되는 것을 확인할 수 있습니다.
이제 localhost:8080 으로 접속해보면
이와같이 wiremock 서버가 실행된 것을 확인할 수 있습니다.
다만 현재는 어떠한 stub도 해주지 않았기 때문에 에러가 발생하였습니다.
wiremock에서 특정 url로 요청하면 지정한 값으로 반환하도록 설정할 수 있습니다.
기본적인 wiremock 설정을 해보겠습니다.
curl -X POST \
--url http://localhost:8080/__admin/mappings/new \
--header 'Content-Type: application/json' \
--data '{
"request": {
"method": "GET",
"url": "/some/thing"
},
"response": {
"status": 200,
"body": "Hello from WireMock!",
"headers": {
"Content-Type": "text/plain"
}
}
}'
이제 localhost:8080/some/thing 으로 요청을 보낼 시 Hello from WireMock 을 응답받을 수 있을 것입니다.
WireMock 으로 외부 API 를 모킹하였으니, 다음 게시글에서는 WireMock을 이용하여 로그인을 진행한 후 nGrinder를 통해 부하테스트를 해보겠습니다.