Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REFACTOR] - 쿼리 최적화 (N+1 문제를 해결), 빌드 에러 해결 #80

Open
wants to merge 23 commits into
base: develop
Choose a base branch
from

Conversation

na0th
Copy link
Contributor

@na0th na0th commented Dec 23, 2024


name: Pull Request
about: '풀 리퀘스트를 제출합니다.'
title: "[FEATURE] - [기능명] 또는 [FIX] - [버그 설명]"
labels: ''
assignees: ''


🆕 기능 추가 / 🔧 버그 수정

  • 기능 추가:
  • 쿼리 최적화(N+1 문제 해결) ,
  • 결제 임시 값 저장 로직 Session -> Redis로 리팩터링,
  • 경매 스케쥴링 완료(경매 시각되면 상태 변경)
  • userId를 JWT 토큰에서 추출하도록 리팩터링
  • 낙찰 시, 경매 상태를 변경하고 closed_at 생성으로 조회 안 되게 막음
  • 낙찰 시, 비동기 이벤트 발행하여 지갑 잔액 차감 시도 후 실패 시 로깅
  • 버그 수정:
    빌드 에러 수정
  1. Clock Config 수정 Asia/seoul -> Asia/Seoul
  2. Jwt Config 수정 ConfigureProperties로 변경
  3. PaymentProperties에 setter 추가
  4. 로깅 레벨 수정 (yml)

📋 변경 사항

  • 변경된 주요 파일 및 함수에 대한 설명을 작성합니다.
  • 변경된 부분의 이유와 기대되는 결과를 설명합니다.

🔍 테스트 사항

  • 새로 추가된 기능이나 수정된 버그를 테스트하기 위한 방법을 설명합니다.
  • 관련 테스트 케이스 또는 시나리오를 포함시킬 수 있습니다.

📄 관련 문서

  • 변경 사항과 관련된 문서나 링크가 있다면 여기에 추가해주세요.

📝 추가 사항

  • PR과 관련된 다른 중요한 정보나 주의 사항을 기입합니다.

수정한 내용 :
1. 빌드 에러 수정
-> Clock Config (seoul ->Seoul)로 대문자로 수정
-> Jwt Config Propertiese 방식으로 수정
-> Payment Properties setter 추가

2. logging level 수정
-> debug 에서 Info로 로깅 레벨을 약하게 수정
@na0th na0th added this to the 공통 도메인 milestone Dec 23, 2024
@na0th na0th self-assigned this Dec 23, 2024
@na0th na0th changed the base branch from migration/DDD to develop December 23, 2024 17:03
na0th added 14 commits December 24, 2024 02:06
삭제한 내용 :
1. viewCount 삭제
-> 불필요한 update 쿼리를 만들어서 추후에 더 좋은 방식으로 구현할 예정
예를 들면 redis
추가한 내용 :
1. 유효한 값 인지 검증하는 validate 추가
-> 비즈니스 로직이 아닌 유효 값 검증은 resolver에서 처리해도 되겠다고 생각함
- 경매 시작,종료 시각 범위는 함께 주어지도록 검증
- 경매 시작 시각이 종료 시각보다 이전이도록 검증
- MinPrice의 값이 MaxPrice보다 작도록 검증
변경한 내용 :
1. UserDetailResponse에서 Wallet ID 필드가 String이던 것을 Long으로 변경
-> 엔티티 필드에서 walletId는 Long 타입이라서.
수정한 내용 :
- 명시적으로 모든 연관 관계를 지연 로딩으로 설정(디폴트는 toMany는 지연 로딩, toOne은 즉시 로딩)
1. getAuctionById 메서드 쿼리 최적화
- findAuctionById V2 메서드 추가
 -> Auction 조회 시 User를 fetch join하여 의도치 않은 쿼리 방지
 -> 쿼리 3개 => 쿼리 1개로 최적화

2. getProductByAucitonId 메서드 쿼리 최적화
- Product <-> ProductImage 간 양방향으로 매핑 관계 변경
 -> 기존은 Product -> ProductImage로의 단방향 매핑으로 조인 테이블 방식이었지만, 양방향 매핑 시 외래 키 매핑 방식으로 조인 테이블을 경유하지 않아 성능이 향상 됨.
- findByAuctionIdV2 메서드 추가
-> Product 조회 시 User와 컬렉션인 ProductImage까지 fetch join해서 가져 옴
-> 컬렉션은 지연 로딩 초기화 하는 방식이랑 트레이드 오프 고려 해야 함.

3. application.yml에 default batch size 설정
-> 엔티티 조회 시 지연 로딩을 in 쿼리로 묶어서 한 번에 로딩 하기 위함(쿼리 최적화)

추가한 메서드는 적용 안 했음
변경한 내용 :
1. application.yml 문법 수정 및 Redis yml 추가, build.gradle 추가, include : 아래 - jwt, - payment
-> 띄어쓰기 안해서 값이 제대로 안들어가던 오류 수정

2. Session으로 결제 임시 값 저장 -> Redis에 임시 값 저장(5분 후 삭제)

3. PaymentController 세션 관련 테스트 수정
-> Redis 이용하도록 테스트 수정
추가한 내용 :
Job Runr 라이브러리를 통해 경매 스케쥴링을 구현
1) 경매 시작 시각이 되면 경매 Status가 변경됨
- PENDING -> ACTIVE
2) 경매 종료 시각이 되면 경매 Status가 변경
- ACTIVE -> CLOSE

미완 :
낙찰 시 로직 구현?
수정한 내용 :
1) 결제 시 쿼리 스트링으로 userId를 전달하던 부분에서 JWT 토큰에서 userId를 추출하는 방식으로 리팩터링

2) resolver에서 refresh token의 subject를 가져오던 것을 access token으로 가져오도록 수정
수정한 내용 :
1)결제 컨트롤러에서 인증/인가 관련 테스트 오류 수정
수정한 내용 :
1) auction의 highestBidAmount 필드, highestBidderId 필드 추가
- 관련 테스트 수정
- 입찰 갱신 시 양방향 참조 맺어줌

2) auction과 bid간 mappedBy 명시하지 않아서 조인 테이블 방식이던 걸, mappedBy 명시해서 외래키 방식으로 교체
-> 성능상 조인 테이블은 매우 안좋음
추가한 내용 :
1) 입찰 시 지갑 잔액 검증
-> User 조회 시 Wallet까지 fetch join
-> n+1 쿼리 방지

2) 경매 종료 검증 로직 변경
-> time을 기준으로 하다가 auctionStatus를 기준으로 하도록 변경
변경한 내용  :
1) walletService에서 잔액 체크하는 메서드 삭제
-> 도메인 모델로 옮김
추가한 내용 :
1) 조회 되지 않도록 closed_at 생성
추가한 내용 :
1) 잔액 차감을 이벤트로 처리
-> 경매 종료 시 경매 상태를 바꾸면 트랜잭션이 커밋될 때 업데이트 쿼리가 나가는데,
지갑 잔액 차감 관련 로직까지 수행하게 되면 그 중간에 동시성 문제가 생길 수 있다고 판단함
- 비동기로 처리
- 지갑 잔액을 차감
- 실패 시 로깅
[FEATURE] - 낙찰 로직을 구현합니다.
수정한 내용 :
입찰 시 auction 쪽 highest bid를 갱신할 떄, save()를 하지 않아 update되지 않던 에러
na0th added 2 commits January 2, 2025 23:53
수정한 내용 :
가독성을 위해 간단한 수정
메서드 변경 후 이전 메서드로 테스트 해서 생긴 테스트 오류 해결
na0th added 4 commits January 4, 2025 00:52
삭제한 내용 :
1) auction쪽 highest bid 관련 삭제
bid 로직은 auction당 1개의 bid만 존재
-> 여러 개의 bid가 존재하는 구조가 아니라 1개의 웹소켓 연결된 bid만 추적한다.
1) initializer에서 bidderId를 삭제한다.
-> DummyBid를 추가한다.
2) Auction Job (낙찰 로직)
-> 낙찰 로직 수행 시 auction.getBids로 bid를 조회하도록 수정
1) user create 시 wallet도 생성되도록 수정
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

2 participants