웹소켓 부하 테스트
웹 소켓은 웹에서 사용하는 소켓이라는 말로, 소켓과 웹소켓은 맥락 상 개념은 같지만 쓰임새가 다르다. 쉽게 보자면 소켓이 상위 개념이다.
소켓은 TCP/UDP에 기반하고 대부분의 네트워크 소켓은 인터넷 소켓이다.
웹소켓은 웹에서 소켓 프로토콜을 사용할 수 있게 하며, TCP 접속에 양방향 통신인 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다.
부하 테스트의 구현
부하 테스트 조건은 다음과 같다.
socketio기반으로 구성된 웹소켓 서버로 사용자가 연결되고 각 신호에 맞게 게임을 플레이한다.
- 사용자 연결 시 토큰 검증
- 확인 후 join 이벤트 처리
- 룸 마스터의 start 신호에 맞춰 게임 플레이
- 플레이 로직 진행
- 종료
게임의 종류가 4가지이고, 4가지 모두 시작 시점, 플레이 방식, 종료 시점이 다르기 때문에 유저 플로우를 세밀하게 조절할 수 있는 도구를 선택한다.
테스트 도구 종류
부하 테스트 도구로는 여러가지가 있으니 몇 가지만 소개한다.
- jmeter (java)
- k6 (javascript + k6 module)
- artillery (javascript)
- locust (Python)
그 외 golang으로 개발된 도구도 있지만 인기도와 커뮤니티 규모를 봤을 때 추천하는 것으로만 추렸다.
도구별 특징
jmeter는 너무나 유명해서 추가 설명이 필요없을 정도이다. jemeter는 유저 플로우를 견고하게 짤 수 있고, 헤더, 바디, 조건문, 루프문 등 상세한 옵션 설정 또한 가능하다.
하지만 UI/UX가 너무 오래되기도 했고, 설정하는게 여간 불편하다.
artillery는 웹소켓 테스트 도구에서는 꽤 이름이 있다. 설정이 간편하고, yml 스크립트로 간편하게 시나리오와 플로우를 구현할 수 있다.
다만, 성능상으로 테스트 도구 자체가 부하가 생기는 일이 발생한다는 소문도 있고, 빠르고 가볍게 테스트 해야할 때는 적합할 것 같다.
상세한 플로우 조절이 불가하지는 않지만 processor를 통한 커스텀 스크립트로 조정해야하기 때문에 꽤 손이 많이 가게 된다.
locust는 artillery와 다르게 테스트 환경을 코드로 작성하게 된다.
추가로 대시보드를 UI로 제공하기 때문에 잘만 쓰면 grafana없이도 간단한 테스트와 지표를 한 번에 해결할 수 있다.
다만 python으로 코드를 짜야한다는 점과 websocket 중 socketio의 호환이 완벽하지 않은 점이 큰 단점이다.
socketio의 경우 메세지를 보내는 emit 기능은 구현되어 있으나 중요한 listening 기능이 없어 해당 기능이 필요한 경우 울며 겨자먹기로 websocket기반으로 전환해 직접 socketio 프로토콜을 파싱하는 경우도 있다. (그게 나다)
마지막으로 k6는 그라파나에서 만든 테스트 도구로 locust와 유사하게 코드로 테스트 환경을 구성한다.
javascript 기반이고 socketio를 지원하는 xk6 라이브러리의 확장이 있기 때문에 socketio도 커버 가능하다.
다만, k6를 설치하는 것과 해당 테스트 스크립트 내 사용되는 모듈이 k6에 의한 모듈만 사용할 수 있어 그 점이 좀 아쉽다.
즉, node의 기본 모듈이나 fetch함수를 사용하지 못한다는 단점이 있다.
하지만 단점보다 장점이 워낙 많기에 k6를 사용하지 않나 싶다.
지표분석을 하려면 InfluxDB와 Grafana를 사용한다.
k6 메트릭스를 대시보드로 제공하는 기본 템플릿도 있으니 매우 간편하게 부하테스트를 할 수 있다.
레퍼런스
📅 작성일: 2025-12-30
✍️ 작성자: 김경남