테스트 개요
테스트 환경
- 최대 동시 사용자: 40명
- 테스트 시간: 22분 30초
- 테스트 대상: 실제 사용자 여정 시뮬레이션
사용자 여정 시나리오
로그인 → 상품 목록 조회 → 상품 상세 조회 → 메인 복귀
→ 가상 피팅 → 찜하기 → 옷장 조회 → 장바구니 추가
→ 주문서 작성 → 배송지 선택 → 주문 생성
성능 지표 비교
주요 개선 결과
| 지표 | 개선 전 | 개선 후 | 목표 | 달성 여부 |
|---|---|---|---|---|
| API 성공률 | 75% | 90.90% | 90% | ✅ |
| 사용자 여정 완료율 | 0% | 100% | 85% | ✅ |
| 로그인 성공률 | 99.89% | 100% | 95% | ✅ |
| 응답시간 (95%) | 2.62초 | 712ms | 3초 이내 | ✅ |
| 평균 응답시간 | 672ms | 181ms | - | 개선됨 |
개선율 요약
- 응답시간: 73% 개선 (2.62초 → 0.71초)
- 여정 완료율: 100%p 개선 (0% → 100%)
- API 성공률: 21%p 개선 (75% → 90.9%)
- HTTP 실패율: 31% 감소 (33.3% → 23.1%)
주요 최적화 내용
1. N+1 쿼리 문제 해결
문제 상황
// 상품 100개 조회 시 101번의 쿼리 발생
products.forEach(product ->
product.getCategory().getName() // 각 상품마다 추가 쿼리
);
해결 방법
// Fetch Join으로 한 번의 쿼리로 해결
@Query("SELECT p FROM Product p JOIN FETCH p.category")
List<Product> findAllWithCategory();
결과: 101개 쿼리 → 1개 쿼리로 최적화
2. 주문 시스템 안정화
- 이전: 주문서 작성 성공률 0%
- 현재: 주문서 작성 성공률 100%
OrderService의 N+1 쿼리 문제를 해결하여 주문 프로세스가 정상 작동하게 되었습니다.
3. 데이터베이스 최적화
- HikariCP 커넥션 풀 설정 조정
- JPA 배치 처리 적용 (batch_size=50)
- 지연 로딩 최적화
테스트 시나리오 구현
// k6 성능 테스트 핵심 로직
export let options = {
stages: [
{ duration: '2m', target: 10 }, // 워밍업
{ duration: '5m', target: 20 }, // 일반 트래픽
{ duration: '10m', target: 20 }, // 안정화
{ duration: '3m', target: 40 }, // 피크 트래픽
{ duration: '2m', target: 0 }, // 종료
],
thresholds: {
login_success_rate: ['rate>0.95'],
api_success_rate: ['rate>0.90'],
user_journey_completion_rate: ['rate>0.85'],
http_req_duration: ['p(95)<3000'],
},
};
export default function () {
// 1. 로그인
let loginRes = http.post(`${BASE_URL}/api/auth/mail/login`, loginData);
// 2. 메인 상품 조회
let mainRes = http.get(`${BASE_URL}/api/home/products`, authHeaders);
// 3. 상품 상세 조회
products.forEach(product => {
http.get(`${BASE_URL}/api/products/${product.id}`, authHeaders);
});
// 4. 가상 피팅
http.post(`${BASE_URL}/api/avatars/try-on`, fittingData, authHeaders);
// 5. 장바구니 추가
http.post(`${BASE_URL}/api/cart/items`, cartData, authHeaders);
// 6. 주문 프로세스
http.get(`${BASE_URL}/api/addresses`, authHeaders);
http.post(`${BASE_URL}/api/orders`, orderData, authHeaders);
}
현재 상태 분석
해결된 문제들
- 메인 페이지 로딩 지연 - 응답시간 대폭 개선
- 주문서 작성 실패 - 성공률 100% 달성
- 데이터베이스 과부하 - N+1 쿼리 최적화로 해결
- 사용자 여정 중단 - 전체 프로세스 정상 작동
개선이 필요한 영역
- HTTP 실패율 23%: 일부 API에서 간헐적 실패 발생
- 외부 의존성: 네트워크 또는 외부 서비스 연동 부분
테스트에서 제외된 기능
- 결제 시스템: QR 코드 방식으로 자동화 테스트 제한
- 실제 결제 처리: 테스트 환경 안전성을 위해 제외
다음 단계
단기 계획 (1-2주)
- 최적화된 코드 프로덕션 배포
- 실시간 모니터링 시스템 구축
- 남은 HTTP 실패율 원인 분석
중기 계획 (1개월)
- CDN 적용으로 정적 리소스 최적화
- 캐싱 전략 고도화
- 추가 성능 테스트 (더 높은 동시 사용자 수)
주요 교훈
성능 최적화 우선순위
- N+1 쿼리 해결이 가장 큰 성능 개선 효과를 가져옴
- 코드 레벨 최적화가 인프라 변경보다 효과적일 수 있음
테스트 방법론
- 실제 사용자 여정을 시뮬레이션하는 것이 중요
- 단순 부하 테스트로는 발견하지 못한 문제들을 찾을 수 있음
데이터베이스 중심 접근
- 웹 애플리케이션 성능 병목의 대부분이 데이터베이스 관련
- ORM 사용 시 쿼리 최적화에 특별한 주의가 필요
728x90
'Jungle' 카테고리의 다른 글
| 데이터베이스 액세스 최적화로 TPS 4.4% 향상시키기 (144.6 → 151 TPS) (0) | 2025.08.01 |
|---|---|
| TIO 성능 테스트: EC2 업그레이드로 144 TPS 달성하기 (0) | 2025.07.29 |
| TIO 개선 소요 파악 - 성능 최적화 (0) | 2025.07.29 |
| 상세이미지 버킷 링크 노출 (0) | 2025.07.24 |
| 성능 분석 실패기 : Grafana K6, N+1 문제를 폭로하다 (0) | 2025.07.24 |