저는 졸업 작품으로 Spring Boot를 이용해서 REST API로 백엔드 서버를 구성했습니다.
졸업 작품의 경우 교수님 앞에서 데모를 하기 때문에
모니터 앞에서 시연하면 교수님이 보는 그런 구조입니다.
사실 데모만을 위해서는 동시성에 대한 고민을 전혀 할 필요가 없습니다.
하나의 시나리오만 준비하면 되거든요.
그렇다면, 실제 서비스가 가능할까요? 절대 안됩니다.
서비스 한다고 하면 그냥 맞아야겠죠..?
사용자가 2~3명이 동시에 요청해도 무슨 일이 일어날지 모릅니다.
그래서 오늘은 Apache Jmeter를 이용하여 성능 테스트를 하고
제 프로젝트에서 여러 사용자가 동시 요청 시 발생할 수 있는 문제들을 파악해보겠습니다.
Jmeter 홈페이지 에 접속합니다. ZIP 파일을 다운로드 해주겠습니다.
그리고 압축을 풀어줍시다.
압축을 풀어준 폴더에 bin 폴더에서 jmeter라고 명령어를 입력합니다.
그러면 이런 프로그램이 실행 됩니다.
📢 테스트 할 때는 다른 서버에서 돌리는 것이 좋다고 하네요.
메모리를 공유하니 최대 성능이 안나올 수 있다고 하네요.
Thread Group : 테스트에 사용될 쓰레드 개수, 쓰레드 1개당 사용자 1명
Sampler : 사용자의 액션 (예: 로그인, 게시물 작성, 게시물 조회 등)
Listener : 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리
Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, Header 등)
Assertion : 응답 확인 방법 (응답 코드, 본문 내용 비교 등)
1초 동안 5명의 유저가 요청을 한번에 보내는데, 1번만 요청을 보낸다는 의미입니다.
또한 에러가 발생하면, 어떻게 처리할 건지도 설정 할 수 있습니다.
요청을 보낼 API를 실제로 설정할 수 있습니다.
보통 동시성을 고려할 때 GET에서 오류가 나지 않습니다. 뭔가 값을 수정하는 POST에서 주로 나타나죠
그래서 제 졸업 작품에서 인공지능을 이용해서 스타일 분석하여 스타일을 알려주는 API를 테스트 해보겠습니다.
API 요청대로 image를 key값으로 value는 파일 업로드 하여 보내보겠습니다.
본인 API에 맞게 Body로 값을 보내실 분은 값을 보내시면 되겠습니다.
응답을 잘 받았는지 확인 할 수 있는 설정입니다.
[HTTP Request] 에서 우클릭 [Add] > [Listener] 에서 3가지를 모두 선택해주세요.
Summary Report : 전체 성능을 한 눈에 체크할 수 있음
View Results Tree : 각 요청에 대해서 상세하게 확인 가능
View Results in Table : 각 요청 상세 성능 확인
Response에서 실제 값이 담겼는지 검증 할 수 있습니다.
[HTTP Request] 에서 우클릭 [Add] > [Assertions] 를 눌러주세요.
✅ Response가 Json 형태면 [Json Assertions] 을 눌러주시고,
✅ Response가 그냥 Text 형태면 [Response Assertions] 을 눌러주세요.
Response Body 에 {message : 1} 이면 테스트가 통과되도록 설정 할 수 있습니다.
그리고 Header도 추가하고 싶다면, Header Manager 도 추가합시다.
[HTTP Request] 에서 우클릭 [Add] > [Config Element] > [HTTP Header Manager]를 눌러주세요.
json으로 요청하고 싶다면 Content-Type : application/json
으로 하고 요청을 보내면 됩니다.
현재 서버가 갤럭시 노트 9입니다.
[Termux] 안드로이드 폰에 MySQL을 설치해보자. [1편]
테스트용 서버이기 때문에 성능을 기대하긴 어렵고, 동시성 관련 테스트만 진행해야 했습니다.
그래서 일단 로그인 하는 테스트를 진행해보겠습니다.
근데 몇번? 1초에 3000번.
테스트 하기 이전에 Clear All을 해줍시다.
아 시작 버튼을 누르니..
"? 저기요. 냅다 ssh
연결도 끊겨버림"
연결이 끊기고.. 서버가 죽은줄 알았지만 다행히 살아 있었습니다..
지금 밖인데,, 집에 달려갈 뻔 했습니다..
✅ 일단 통신이 되는지는 알았습니다!
오늘의 하이라이트!
사실 동시성 오류를 확인하려면 POST로 무언가 값이 바뀌는 것을 처리해야 합니다.
제 졸업 작품에서 인공지능을 이용해서 스타일 분석하여 스타일을 알려주는 API를 테스트 해보겠습니다.
API 요청대로 image를 key값으로 value는 파일 업로드 하여 보내보겠습니다.
또한, Header에 JWT Token도 같이 보내야 합니다. 추가해주도록 하겠습니다.
일단 요청 한 개만 보내보겠습니다.
요청 | 결과 |
---|---|
![]() | ![]() |
정상적으로 성공했고, 16초가 걸렸습니다.
그러면 요청 5개를 동시에 보내보겠습니다.
요청 | 결과 |
---|---|
![]() | ![]() |
한개만 성공했고, 나머지는 실패했습니다.
왜 그럴까요? 서버 로그를 살펴 봅시다.
파일명을 날짜, 시간으로 저장하고 있습니다. 아마 중복이 되어서 그런 것 같습니다.
08 / 10 : 오류를 수정 했습니다
오류 수정 후, 정상 성공한 모습
위 5개는 평균 60~70초가 나오는데, 아래는 AWS Lambda가 Cold Start가 끝나서 그렇습니다.
그렇다면 조금만 더 늘려볼까요? 20명으로 보내보겠습니다!
몇개는 성공하고, 몇개는 실패했습니다.
또 로그를 살펴보니..
SQL 연결이 끊긴 오류가 발생했습니다. 어떤 부분인가 살펴봤더니
고작 회원 번호를 찾는 쿼리인데도, 파일 저장과 업로드에 작업이 밀려 서버가 감당하지 못하는 모습입니다.
이 부분은 서버 성능을 올려야 하는 문제라.. 일단 보류해두겠습니다.
Apache Jmeter를 이용해서 테스트를 진행해봤습니다.
사실 테스트 코드로도 각종 에러를 찾아낼 수 있습니다.
이렇게 테스트를 진행하고 나니, 테스트의 중요성도 알았고, 테스트 코드 작성의 중요성도 알았습니다.
또한 Github Action으로 테스트 코드 검증도 하던데, 나중에 배워야겠다고 느꼈습니다.
나중에 배포용 서버에서도 성능 테스트 해볼 예정입니다!