수천 명 이상이 동시에 몰리는 수강신청 상황에서 시스템이 다운되지 않고 얼마나 잘 버티는지, 특히 제한된 자원(t3.large) 환경에서 얼마만큼의 트래픽을 처리할 수 있는지를 보기 위해 이번 테스트를 진행햇다.
👉이 시스템은 다음과 같은 특성이 있다:
👉 테스트 아키텍처
이번 글은 MVP 구조에서의 테스트만 다루며 이후 보완된 단계는 별도 포스트로 기록할 예정이다.
📢 테스트의 성능 측정 결과는 JMeter에서 수집된 데이터를 기반으로 HTML 리포트로 시각화해 확인했다.
각 요청별 응답시간 분포, 실패율, TPS, 네트워크 전송량 등 지표를 정량적으로 비교할 수 있었다.
아래는 실제 리포트 시각화 예시 캡처 이미지이다.
테스트는 총 6가지 인원 케이스(100 / 1,000 / 3,000 / 5,000 / 7,000 / 10,000명)로 나누어 수행했고, 아래 5가지 핵심 시나리오를 중심으로 구성했다:

100명~1,000명까지는 비교적 안정적이었지만 3,000명 이상부터 502 Bad Gateway 오류가 급증했고, 10,000명 접속 시 실패율은 83.54%에 달했으며 대부분 Timeout 또는 서버 내부 오류였다.
502는 Spring Boot 백엔드가 응답을 제때 주지 못해 Nginx가 대신 에러를 반환한 것으로 500 오류는 내부 Thread Pool 포화 혹은 HikariCP 커넥션 부족이 원인으로 보였다.
Nginx에서 worker_connections란?
클라이언트의 요청을 처리하는 동시 연결 수를 조절하는 값이다.
이 숫자가 작으면 많은 유저가 몰릴 경우 요청이 차단되거나 지연된다.

📌 정리하면, Nginx 튜닝은 효과가 있지만 입구만 뚫린 상태로 내부 문제는 여전했다.
Thread Pool이란?
애플리케이션에서 동시에 여러 요청을 처리할 수 있도록 해주는 작업 스레드 모음이다. 너무 작으면 처리 병목이 생기고, 너무 크면 시스템 자원과 충돌한다.

📌 결론: Thread만 늘리면 오히려 병목 심화됨 → 반드시 DB Connection Pool과 함께 조정해야 함
DB 커넥션 풀(HikariCP)이란?
DB와 연결할 수 있는 커넥션들을 미리 만들어 풀(Pool) 형태로 관리하는 구조다. 필요할 때 커넥션을 즉시 꺼내 쓸 수 있어 빠르고 효율적이다.

커넥션 풀이 부족하면 Thread는 살아 있어도 DB 연결을 못 받아 대기 상태로 빠지고
이로 인해 TPS 하락, 응답 시간 증가, 502/500 오류 증가로 이어졌다.
📌 결론: 적절한 커넥션 풀 확보만으로도 전체 시스템 안정성이 비약적으로 향상됨
🌟 결론적으로 현재 구조(MVP)에서는 3,000명 이상의 동시 접속에서 시스템 안정성 확보가 어렵다는 것을 실험으로 확인했고 비동기 구조 도입 없이는 이 한계를 넘기 어렵다고 판단했다.