개요

ChatApplication의 RestAPI 서버에 대한 MVP 개발 완료 및 예정해뒀던 정비가 어느 정도 끝나가고 있어, 이제는 부하 테스트를 작성해야 할 때가 왔다는 생각에 어떻게 하면 좋을지에 대해 고민을 하게 됐습니다.

크게는 두 가지 방법을 생각했습니다. 시작부터 직접 부하 테스트를 작성하는 방법과 부하 테스트 도구를 사용하는 방법이 그것입니다. 그리고 부하 테스트 도구를 사용하는 것이 시간이 지나치게 오래 걸리고 메리트가 없다 싶으면 직접 부하 테스트를 작성하고, 그렇지 않다면 부하 테스트 도구를 사용하는 것이 좋겠다는 생각에 도달했습니다.

이를 검토하기 위해 부하 테스트 도구로 주로 사용되는 오픈 소스 솔루션에 무엇이 있는지 찾아보고 그 중에 후보로 Locust, k6, JMeter를 고민하게 됐습니다.


기준 세우기

비교하기에 앞서 어떤 도구를 내가 원하는 지에 대한 기준을 세워야 했고, 그 기준은 다음과 같았습니다.

1. 자유도가 높으며, 다양한 테스트 케이스를 작성할 수 있는가?
2. websocket을 지원하는가?
3. 부하 테스트 결과를 쉽게 분석할 수 있는가?
4. 활발한 커뮤니티를 기반으로 유지보수가 잘 되고 있는가?
5. 적당한 학습 부하를 통한 자극이 되는가?

각각의 기준을 선정한 이유는 다음과 같습니다.

  1. ChatApplication의 RestAPI 서버는 현재 작은 규모의 트래픽만을 다루지만, 여기에 더해 다양한 기술들을 장기간에 걸쳐 새로 도입하는 것을 목표로 하기 때문입니다.
  2. 채팅을 주 기능으로 설정했기 때문에 이에 대해서는 확실한 부하 테스트를 해야 하기 때문입니다.
  3. 어떤 부분이 병목이 되는지, 어떤 부분이 더 개선이 필요한지를 빠르게 파악할 수 있기 때문입니다.
  4. 활발한 커뮤니티가 있을 경우 제가 부딪히게 될 문제들을 빠르게 해결할 수 있으며 동시에 오픈 소스에 참여할 수 있는 기회도 늘어나기 때문입니다.
  5. 마지막으로 이 프로젝트는 장기간 동안 새로운 것을 배우면서 적용해나가는 것을 목표로 하고 있기 때문에 적당한 학습 부하를 통한 자극이 되어야 합니다.

후보군 선정

Locust, k6, JMeter는 현재 가장 널리 쓰이는 부하 테스트 도구들 중 하나였기 때문에 우선적으로 후보군으로 선정했지만, JMeter의 경우에는 위의 기준에 부합하지 못하는 부분이 많다고 판단했습니다. 이는 JMeter는 GUI 기반의 도구이기 때문에 테스트 케이스를 작성하고 실행하는 데에 시간이 많이 소요되며, 제가 원하는 수준의 자유도를 제공하거나 학습 부하를 제공하지 못한다고 생각했기 때문입니다.

따라서 Locustk6를 후보군으로 선정하게 됐습니다.


Locust vs k6

Locust는 파이썬으로 작성된 오픈 소스 부하 테스트 도구로, 코드 기반의 테스트 케이스를 작성할 수 있으며, 분산 부하 테스트를 지원합니다. 파이썬을 사용하기 때문에 파이썬에 익숙한 제가 자유도 높게 테스트 코드를 작성하기에 적합하고, github repository가 23.6k의 star를 받고 contributor가 274명이나 될 정도로 활발한 커뮤니티를 가지고 있었습니다. websocket을 자체적으로 지원하지 않는 것은 python의 websocket 패키지를 사용하면 되기 때문에 큰 문제가 되지 않았습니다.

k6는 Go로 작성된 오픈 소스 부하 테스트 도구로, 코드 기반의 테스트 케이스를 작성할 수 있으며, 분산 부하 테스트를 지원합니다. Go로 작성돼있기 때문에 Locust와 비교해 더 대규모의 부하 테스트를 수행할 수 있으며, websocket을 내부 로직으로 지원하기 때문에 채팅 서버에 대한 부하 테스트를 진행하기에 적합합니다. github repository가 23.3k의 star를 받고 contributor가 1400여명이나 될 정도로 활발한 커뮤니티를 가지고 있었습니다. javascript를 사용하기 때문에 마침 javascript를 공부할 계기가 필요했던 저에게 충분한 학습 부하를 제공할 것이라는 생각이 들었습니다.


k6를 선택하다

locust 역시 굉장히 잘 운영되고 있는 매력적인 도구였지만, 제가 정해 둔 기준들에서 대부분 k6가 우세했고 무엇보다 이를 계기로 javascript를 공부할 수 있는 기회가 될 것이라는 생각에 k6를 사용해서 부하 테스트를 진행하기로 결정했습니다. 이를 통해 ChatApplication의 RestAPI 서버에 대한 부하 테스트를 진행하고, 이를 통해 어떤 부분이 개선이 필요한지 파악하고 개선해나가는 것이 목표입니다.


2024-04-21
다음 글: docker mount: volume vs bind → 카테고리로 돌아가기 ↩