Skip to content

Conversation

@DDINGJOO
Copy link
Owner

📋 개요

JPA N+1 쿼리 문제를 Fetch Join을 통해 해결하고, 버전 변경으로 인한 중복/미사용 코드를 정리했습니다.

🎯 해결한 문제

1. N+1 쿼리 문제

  • 문제: Lazy Loading으로 인한 추가 쿼리 발생
  • 영향: 특히 SuspendRelease 스케줄러에서 심각한 성능 저하 (100명 처리 시 201개 쿼리)
  • 해결: Fetch Join을 통한 즉시 로딩

2. 중복 코드 문제

  • 문제: 버전 변경 과정에서 발생한 중복 서비스 클래스
  • 영향: 코드 유지보수 어려움, 혼란 야기
  • 해결: 미사용 코드 제거

🔧 주요 변경사항

N+1 쿼리 해결

AuthRepository 개선

// 추가된 Fetch Join 메서드
@Query("select a from Auth a left join fetch a.loginStatus where a.email = :email")
Optional<Auth> findByEmailWithLoginStatus(@Param("email") String email);

@Query("select a from Auth a left join fetch a.loginStatus where a.id = :id")  
Optional<Auth> findByIdWithLoginStatus(@Param("id") String id);

@Query("select a from Auth a left join fetch a.withdraw where a.email = :email")
Optional<Auth> findByEmailWithWithdraw(@Param("email") String email);

SuspendRepository 개선

@Query("select distinct s from Suspend s " +
       "join fetch s.suspendedUser a " +
       "left join fetch a.suspensions " +
       "where s.suspendUntil < :date")
List<Suspend> findAllWithAuthAndSuspensions(@Param("date") LocalDate date);

서비스 레이어 수정

  • LoginServiceImpl: LoginStatus를 함께 조회
  • WithdrawalManagementServiceImpl: Withdraw를 함께 조회
  • SuspendRelease: Auth와 suspensions를 한 번에 조회

미사용 코드 제거

  • SignupClientInterface.java (미사용)
  • SignupClientService.java (SignupServiceImpl과 중복)
  • UpdateService.EmailConfirm() 메서드 (백업용 미사용 코드)

📊 성능 개선 결과

서비스 Before After 개선율
SuspendRelease (100건) 201 queries 1 query 99.5% 감소 🚀
LoginService 2 queries 1 query 50% 감소
WithdrawalService 2 queries 1 query 50% 감소

예상 효과

  • 데이터베이스 부하 대폭 감소
  • API 응답 속도 향상
  • 특히 스케줄러 작업 성능 크게 개선

🧪 테스트

테스트 결과

./gradlew clean test
BUILD SUCCESSFUL
305 tests completed, 0 failed ✅

테스트 수정사항

  • LoginServiceImplTest: 새로운 Repository 메서드 호출 검증
  • WithdrawalManagementServiceImplTest: 새로운 Repository 메서드 호출 검증
  • UpdateServiceTest: EmailConfirm 관련 테스트 제거

📝 체크리스트

  • 코드 변경사항이 PR 목적에 부합함
  • 모든 테스트 통과
  • 빌드 성공
  • N+1 쿼리 문제 해결 확인
  • 미사용 코드 제거 완료
  • 문서화 (N1_QUERY_IMPROVEMENT.md)

🔍 리뷰 포인트

  1. Fetch Join 전략의 적절성

    • 필요한 연관관계만 즉시 로딩
    • 과도한 Fetch Join 사용 지양
  2. 테스트 커버리지

    • Repository 메서드 변경에 따른 테스트 수정 완료
    • 기존 비즈니스 로직 영향 없음 확인
  3. 성능 최적화 효과

    • 특히 SuspendRelease의 극적인 성능 개선
    • 실제 운영 환경에서 더 큰 효과 예상

📚 관련 문서

🏷️ 라벨

bug, performance, refactoring, cleanup

👥 리뷰어

@팀원1 @팀원2


Note: 이 PR은 성능 최적화와 코드 정리를 동시에 진행했습니다.
변경 범위가 크지만, 각 변경사항은 독립적이며 안전하게 테스트되었습니다.

## 주요 변경사항

### 1. N+1 쿼리 문제 해결
- AuthRepository에 Fetch Join 메서드 추가
  - findByEmailWithLoginStatus(): LoginService 최적화
  - findByIdWithLoginStatus(): refreshToken 최적화
  - findByEmailWithWithdraw(): WithdrawalService 최적화
- SuspendRepository에 Fetch Join 메서드 추가
  - findAllWithAuthAndSuspensions(): SuspendRelease 최적화

### 2. 서비스 레이어 개선
- LoginServiceImpl: LoginStatus를 함께 조회하도록 개선
- WithdrawalManagementServiceImpl: Withdraw를 함께 조회하도록 개선
- SuspendRelease: Auth와 suspensions를 한번에 조회하도록 개선

### 3. 미사용 코드 제거
- SignupClientInterface 삭제 (미사용)
- SignupClientService 삭제 (SignupServiceImpl과 중복)
- UpdateService.EmailConfirm() 메서드 제거 (백업용 미사용 코드)

### 4. 테스트 코드 수정
- LoginServiceImplTest: 새로운 Repository 메서드 사용
- WithdrawalManagementServiceImplTest: 새로운 Repository 메서드 사용
- UpdateServiceTest: EmailConfirm 관련 테스트 제거

## 성능 개선 효과
- SuspendRelease: 201 → 1 queries (99.5% 감소)
- LoginService: 2 → 1 queries (50% 감소)
- WithdrawalService: 2 → 1 queries (50% 감소)

## 테스트
- 모든 테스트 통과 (305 tests passed)
- 빌드 성공

관련 문서: N1_QUERY_IMPROVEMENT.md
@DDINGJOO DDINGJOO merged commit d40d818 into main Nov 25, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants