부하 테스트 사용 툴: ngrinder, scouter
1. 배경
nGrinder
를 이용한 부하 테스트 결과, 초기 TPS(초당 처리량)가 1.3에 불과하여 대규모 트래픽 처리 및 서비스 확장성에 큰 제약이 있음을 확인.2. 원인 분석
User
, Profile
, WasteItem
)를 조회하는 추가 쿼리가 발생하는 N+1 문제임을 파악.3. 해결 과정 및 기술적 결정
1단계: Fetch Join과 Batch Size를 이용한 N+1 완화
@ManyToOne
, @OneToOne
관계(User, Profile)에는 Fetch Join
을 적용하여 즉시 로딩으로 쿼리 수 감소.@OneToMany
관계(WasteItems)에는 @BatchSize
를 적용하여 지연 로딩 시 IN
절을 통한 일괄 처리로 N+1 쿼리 완화.2단계: DTO 직접 조회를 통한 근본적인 성능 최적화
Projections
**를 사용하여 조회 결과를 DTO로 직접 매핑하는 방식으로 리팩토링을 진행.SELECT
절 최적화: SQL 레벨에서 API에 필요한 컬럼만 정확히 지정하여 조회함으로써 네트워크 트래픽과 DB 부하를 최소화. (기존에는 응답 DTO에서 ToMany 리스트를 호출)