안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 업브렐라에서 부하테스트를 할 때, 외부 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 은 두 가지의 방법을 지원합니다.

  1. Stand Alone
    • WireMock 서버를 독립적으로 실행합니다.
  2. Spring Boot Server에 설치
    • Test시에만 동작하도록 설정합니다.

업브렐라 서버팀은 실제 oauth server를 이용하는 것처럼 테스트를 진행할 것이기 때문에 Stand Alone 방식을 도입하였습니다.

WireMock 은 jar 파일로, JVM 위에서 동작합니다.

  1. 우선 jar 파일을 아래의 공식 사이트에서 다운받습니다.

    https://wiremock.org/

  2. 다운받은 wiremock 을 실행합니다.

     java -jar wiremock-standalone-[최신-버전].jar --verbose
    

명령어를 실행하면 다음과 같이 wiremock이 실행되는 것을 확인할 수 있습니다.

image

이제 localhost:8080 으로 접속해보면

image

이와같이 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를 통해 부하테스트를 해보겠습니다.