포시코딩

[동시성 문제] Apache JMeter를 이용한 테스트 본문

Node.js

[동시성 문제] Apache JMeter를 이용한 테스트

포시 2023. 2. 20. 20:31
728x90

개요

https://4sii.tistory.com/422

 

[동시성 문제] (1) Transaction 사용과 통 Lock 걸어버리기

코드 Back-End: Nest.js - boards.service.ts async joinGroup(boardId: number, userId: number) { const board = await this.getBoard(boardId); const boardJoinInfo = await this.joinRepository.find({ where: { boardId }, }); if (board.joinLimit { if (join.userId

4sii.tistory.com

https://4sii.tistory.com/423

 

[동시성 문제] (2) Nest.js의 Bull Queue - 작성중

개요 이전에 고민했던 동시성 문제에 대해 Queue 디자인 패턴을 활용해 해결할 수 있을 것 같다는 팀 의견이 모아졌다. 마침 Nest에서는 Node.js 기반 대기열 시스템 구현에 필요한 @nestjs/bull 패키지

4sii.tistory.com

 

위 포스팅에서 얘기한 동시성 문제를 테스트하는 과정에서

클라이언트단에서 여러 POST 요청 코드를 한번에 실행하는 방법이 

오차가 있을 수 있고 판단이 있어 툴을 통해 테스트하는걸로 의견이 좁혀졌다.

 

여기서 스트레스 테스트 툴인 JMeter를 쓰면 

원하는 과정을 진행할 수 있을것 같다고 생각해 진행하게 되었다.

 

사용 방법에 대해서는

https://creampuffy.tistory.com/209

 

Apache JMeter를 이용한 부하 테스트 및 리포트 생성

서버의 성능을 최적화하기 위해선 어떤 작업이 필요할까요? 어떤 지표를 기준으로 성능을 측정할 것인지, 정의된 지표에 영향을 미치는 변수에는 무엇이 있는지, 해당 변수들의 변화가 성능에

creampuffy.tistory.com

 

위 블로그에 너무나도 친절히 나와있기 때문에 생략하고 

요점만 정리해보고자 한다.

 

사용 방법

사용하기에 앞서 요청을 받을 controller는 다음과 같다.

 

boards.controller.ts

@Post(':id/join')
async joinGroup(@Param('id') boardId: number, @Req() req: Request) {
  const { userId } = req.cookies;
  if (userId === '' || isNaN(userId)) {
    console.log('BadRequestException - userId: ' + userId);
    throw new BadRequestException('userId가 잘못되었습니다.');
  }
  return await this.boardsService.addJoinQueue(boardId, parseInt(userId));
}

동시성 테스트에 앞서 일단 

쿠키가 없을 때랑 쿠키가 있을 때로 나눠 응답이 잘 오나 테스트를 진행해보았다.

 

쿠키가 전송되지 않은 요청

cookie가 전송되지 않은 요청

요청 결과

Sampler result
Response data

요청 정보를 보면 쿠키가 없다.

 

쿠키 설정

key=value가 userId=101인 쿠키를 설정해 다시 요청해보았다.

 

요청 결과

빨간색은 위에서 쿠키 없이 실패한 요청, 아래가 지금 성공한 요청
join Table에 데이터가 저장된 모습

요청에 대해서 201 응답을 받았고 DB에도 잘 저장된 것을 볼 수 있다.

 

동시성 테스트

위에서 쿠키가 있을 때의 테스트한 HTTP Request를 복사해 5개로 만든 다음 

각각 이름을 부여하고 Cookie value도 다르게 부여해주었다.

 

 

React 클라이언트 서버에서 수고롭게 세팅했던 요청에 대한 응답 결과와 똑같은 결과를 확인할 수 있었다.

 

정리

처음에는 해당 테스트를 진행하기 위해 임시로 배포 서버에 올린뒤 팀원들이 동시에 버튼을 따닥 눌러야되나?

라고까지 생각을 했었는데

 

JMeter를 통해 이렇게 쉽고 빠르게 원하던 동시성 테스트를 하게 됐다는 사실에 너무 만족해버렸다.

 

앞으로도 매우매우 자주 애용할 것 같고

동시성 테스트 뿐만 아니라 나중에는 응용해서 원래 툴의 목적인 스트레스 테스트 또한 진행하여

소개한 블로그에 나와있듯 테스트 결과에 대해 HTML 보고서로 뽑아 쓰면 

아주 그럴듯한 결과물이 나올 것이라 예상한다.

 

이렇게 무기가 하나 또 생긴 느낌

728x90