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

[BE] TicketRepository, StageRepository의 JPQL을 수정한다. #517

Closed
seokjin8678 opened this issue Oct 7, 2023 · 1 comment · Fixed by #578
Closed

[BE] TicketRepository, StageRepository의 JPQL을 수정한다. #517

seokjin8678 opened this issue Oct 7, 2023 · 1 comment · Fixed by #578
Assignees
Labels
BE 백엔드에 관련된 작업 ⚙️ 리팩터링 리팩터링에 관련된 작업 🛠 수정 수정에 관련된 작업

Comments

@seokjin8678
Copy link
Collaborator

✨ 세부 내용

현재 다음과 같이 /festivals/1, /stages/1/tickets로 요청을 보낼 때 다음과 같이 티켓의 정렬 순서가 같지 않고 다르게 나옵니다.

image
image

원인은 다음과 같습니다.

TicketRepository

findAllDetailByFestivalId() 메소드에 JPQL이 잘못되었습니다.

다음과 같은 JPQL 코드를

@Query("""
        SELECT s FROM Stage s
        LEFT JOIN FETCH s.tickets t
        LEFT JOIN FETCH t.ticketAmount
        WHERE s.festival.id = :festivalId
        """)
List<Stage> findAllDetailByFestivalId(@Param("festivalId") Long festivalId);

다음과 같이 변경하면 됩니다.

@Query("""
        SELECT s FROM Stage s
        LEFT JOIN FETCH s.tickets t
        JOIN FETCH t.ticketAmount
        WHERE s.festival.id = :festivalId
        """)
List<Stage> findAllDetailByFestivalId(@Param("festivalId") Long festivalId);

TicketTicketAmount는 같은 생명 주기를 가집니다.
따라서 Ticket이 존재하면 TicketAmount는 무조건 존재할 수 밖에 없고 유일하기 때문에 LEFT JOIN을 할 필요가 없습니다.
정확한 원인은 모르겠으나, LEFT JOIN을 할 때 순서가 바뀌는 것 같습니다...

LEFT JOIN을 사용한 쿼리의 EXPLAIN

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE s1_0 null ref fk_stage__festival fk_stage__festival 9 const 1 100 null
1 SIMPLE t1_0 null ALL fk_ticket__stage null null null 2 100 Using where; Using join buffer (hash join)
1 SIMPLE t2_0 null ALL PRIMARY null null null 2 100 Using where; Using join buffer (hash join)

JOIN을 사용한 쿼리의 EXPLAIN

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE s1_0 null ref PRIMARY,fk_stage__festival fk_stage__festival 9 const 1 100 null
1 SIMPLE t2_0 null ALL PRIMARY null null null 2 100 Using join buffer (hash join)
1 SIMPLE t1_0 null ALL PRIMARY,fk_ticket__stage null null null 2 50 Using where; Using join buffer (hash join)

또한 StageRepository에 N+1 문제가 발생하는 것이 파악되었고 해당 메서드를 Fetch Join을 사용하여 N+1 문제를 해결할 수 있습니다.

⏰ 예상 소요 시간

30분

@seokjin8678 seokjin8678 added BE 백엔드에 관련된 작업 ⚙️ 리팩터링 리팩터링에 관련된 작업 🛠 수정 수정에 관련된 작업 labels Oct 7, 2023
@seokjin8678 seokjin8678 self-assigned this Oct 7, 2023
@seokjin8678
Copy link
Collaborator Author

seokjin8678 commented Oct 7, 2023

TicketAmount의 LEFT JOIN을 생략하니 Ticket이 없는 Stage 조회가 안되는 문제가 생기네요 😂
왜냐하면 TicketAmountJOIN 한다면 TicketAmount가 무조건 있어야 한다는 소리이고, 따라서 Ticket이 없는 Stage가 조회가 안됩니다. 😂😂😂
순서는 다음과 같이 뒤에 ORDER BY를 명시하면 해결할 수 있기는 한데...
안드로이드 측에서 ticketType으로 정렬을 한다면 굳이 해결을 하지 않아도 될 문제 같습니다.

BGuga pushed a commit that referenced this issue Nov 14, 2023
* refactor: findAllByStageId fetch 조인으로 변경

* refactor: fetch join 메서드 사용하도록 변경

* chore: Inner 조건 명시하도록 변경
@github-project-automation github-project-automation bot moved this from Todo to Done in 2023-festa-go Nov 14, 2023
seokjin8678 added a commit that referenced this issue Nov 16, 2023
* [AN/USER] feat: 티켓 예매 디자인 수정 (#567) (#570)

* feat: 티켓 예매 바텀 시트 화면 디자인 수정

* feat: 포스터 크기 수정

* refactor: 티켓을 선택하면 INVISIBLE로 변환

* refactor: 화면 겹치는 현상 제거

* refactor: 불필요한 공백 제거

---------

Co-authored-by: re4rk <[email protected]>

* [AN/USER] feat: 페스타고 유저 앱 버전 변경 (#571) (#572)

* [BE] chore: 개발 환경의 서브 모듈을 업데이트 (#573) (#574)

* refactor: 사용하지 않게된 클래스를 제거한다. (#513)

* [BE] feat: 회원의 학생 인증 정보 조회 API 구현 (#496) (#531)

* refactor: 메서드 네이밍 수정 (verifiacte -> verify)

* feat: 학생 인증 정보 조회 기능 구현

* refactor: findByMemberIdWithFetch INNER JOIN으로 수정

* refactor: inner line return 으로 수정

* refactor: 캐싱된 Response 반환

* [AN/USER] fix: 예매 완료 화면 버그 픽스 (#575) (#576)

* fix: getParcelableExtraCompat

* update: 버전 변경

* [ALL] 프로젝트 README 추가 (#552) (#577)

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* docs: 기능 간단 소개 작성

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* docs: update

* Update README.md

줄바꿈 수정

* docs: Update README.md

* Update README.md

백엔드 기술스택 추가

* Update README.md

- JUnit5 오타 수정

* Update README.md

백엔드 기술스택 flyway 추가

* 인프라 아키텍처 사진 추가

* Update infra structure image

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

---------

Co-authored-by: xxeol2 <[email protected]>
Co-authored-by: Hyun-Seo Oh / 오현서 <[email protected]>
Co-authored-by: 해시 <[email protected]>
Co-authored-by: Guga <[email protected]>

* [AN/USER] refactor: ViewModel Test Code Dispatcher Rule 추가 (#590)

* feat: coroutine dispatcher main rule 추가

* refactor: 티켓 예매 화면 ViewModel 테스트 리팩터링

* refactor: 티켓 목록 화면 ViewModel 테스트 리팩터링

* refactor: 티켓 기록 화면 ViewModel 테스트 리팩터링

* refactor: 티켓 입장 화면 ViewModel 테스트 리팩터링

* refactor: 학생 인증 화면 ViewModel 테스트 리팩터링

* refactor: 로그인 화면 ViewModel 테스트 리팩터링

* refactor: 학교 선택 화면 ViewModel 테스트 리팩터링

* refactor: 마이페이지 화면 ViewModel 테스트 리팩터링

* refactor: 홈 화면 ViewModel 테스트 리팩터링

* refactor: 축제 목록 화면 ViewModel 테스트 리팩터링

* refactor: 마이페이지 화면 ViewModel 테스트 재변경

* [AN/USER] feat: 버튼 더블 클릭 막기(#584) (#585)

* feat: SingleClick Util 추가

* feat: 바텀 시트 바깥 클릭 막기

* feat: single 클릭 적용

* refactor: SingleClick 메서드명 변경

* refactor: xml 파일 호출 순서 맞추기

* [AN/USER] feat: 홈 화면에서 뒤로가기 누르면 곧바로 종료되지 않는다. (#588)

* feat: 홈화면 뒤로가기 상수 추가

* feat: 홈화면 뒤로가기 두 번 클릭 시 종료

* [AN/USER] feat: SingleLivedata 제거 (#586) (#587)

* refactor: 사용하지않는 SingleLiveData 제거

* refactor: 사용하지않는 Event 제거

* [AN/USER] feat: 예매 실패 케이스 처리(#369) (#593)

* feat: 에러 코드를 구분한다

* feat: API 요청 실패 결과에 따라 에러 코드를 예외로 던진다

* feat: 티켓 예매 요청에 실패하면 예외 이벤트가 발생한다.

* feat: 에러 코드에 따라 다른 메세지를 띄운다

* [AN/USER] refactor: 네트워크 에러 로깅을 확장함수 없이 직접 처리한다(#595) (#596)

refactor: 네트워크 에러 로깅을 확장함수 없이 직접 처리한다

* [BE] feat: 축제 조회 필터링 구현(#602) (#603)

* feat: specification 정의

* feat: FestivalFilter 정의

* feat: 축제 진행 상태에 따른 Controller, Service 생성

* refactor: private 생성자를 lombok 을 통해 생성

* chore: 괄호 제거

* chore: 변수 상수화

* chore: given 절 타입 명시

* feat: 축제 조회 ALL 삭제 및 기본값을 진행 중으로 변경

* feat: 축제 당일이 Progress에 포함되도록 변경 및 Spec 리팩터링

* feat: 축제 진행 상황별 정렬 조건 추가

* chore: 메서드 순서 변경

* chore: index 추가

* chore: 에러 메시지 변경

* chore: test 개행 변경 및 변수 재활용

* [AN/USER] feat: 홈화면 필터링 기능을 제공한다 (#600) (#606)

* feat: 축제 목록 필터 이름 상수화

* feat: 축제 목록 칩 색깔 및 텍스트 스타일 작성

* feat: 축제 목록 칩으로 필터링하기 화면 그리기

* feat: 축제 필터 분류 정의

* feat: FestivalRepository 필터링 요청 가능하도록 재정의

* feat: 축제 목록 ViewModel 에 축제 필터링 기능 적용

* feat: 축제 목록 Fragment 에 필터링 기능 적용

* feat: 축제 목록 필터링 API 연동 작업

* feat: 페스타고 홈화면 아이콘 추가

* refactor: 칩 색깔 selector 네이밍 수정

* refactor: 축제 목록 칩 색깔 네이밍 변경

* feat: 필터링 칩 다크모드 적용

* feat: 필터링 상태를 ViewModel 에서 관리하지 않는다

* feat: 현재 선택된 칩의 필터링에 해당하는 리스트를 요청한다

* fix: Loading 이 아니면 구성 변경 시 축제 목록을 재요청하지 않는다

* [BE] refactor: /stages/{stageId}/tickets API의 N+1을 해결한다.(#517) (#578)

* refactor: findAllByStageId fetch 조인으로 변경

* refactor: fetch join 메서드 사용하도록 변경

* chore: Inner 조건 명시하도록 변경

* [BE] 도메인 엔티티의 예외를 정의, 적용하고 테스트 패키지 구조를 정리한다. (#482) (#515)

* feat: DomainValidException 추가

* fix: DomainValidException -> ValidException 변경, 수정

* feat: Validator 검증 로직 추가

* refactor: 검증 로직 도메인에 적용

* refactor: ValidException 에러코드 수정, Validator 로직 추가

* feat: Admin 검증 추가

* feat: EntryCode 검증 추가

* refactor: 검증 로직 대폭 개선

* test: 테스트 코드 패키지 구조에 맞게 이동

* test: 테스트 코드 추가

* test: Member 테스트 코드 추가

* fix: EntryState IllegalArgumentException 변경

* fix: 테스트 코드 깨짐 수정

* refactor: Validator 호출 시 필드명 변수로 추출

* feat: IllegalArgumentException을 대체하는 UnexpectedException 추가, 적용

* feat: OAuth2Clients 중복 추가 시 에러 로그 추가

* feat: UnexpectedException 예외 핸들러 추가

---------

Co-authored-by: BGuga <[email protected]>

* [BE] test properties show sql 관련 설정 삭제 (#605) (#607)

test: 테스트 로그에 쿼리 로그 제거하도록 변경

* [BE] refactor: 사용하지 않는 AdminService 제거 (#610) (#611)

* test: 테스트 코드에 서비스 클래스 제거

* refactor: AdminService 삭제

* refactor: AdminDTO 삭제

* style: 개행 수정

* [BE] 학교 정보 API에 Swagger Annotation을 추가 (#597) (#598)

feat: SchoolController에 Swagger 정보 추가

Co-authored-by: hyunseo <>

* [AN/USER] feat: 축제 목록 화면 UX 개선(#614) (#615)

* [AN] release: v1.2.0 (#618) (#619)

chore: release v1.2.0

---------

Co-authored-by: re4rk <[email protected]>
Co-authored-by: 해시 <[email protected]>
Co-authored-by: Hyun-Seo Oh / 오현서 <[email protected]>
Co-authored-by: xxeol2 <[email protected]>
Co-authored-by: seokjin8678 <[email protected]>
Co-authored-by: Guga <[email protected]>
seokjin8678 added a commit that referenced this issue Nov 16, 2023
* refactor: findAllByStageId fetch 조인으로 변경

* refactor: fetch join 메서드 사용하도록 변경

* chore: Inner 조건 명시하도록 변경
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드에 관련된 작업 ⚙️ 리팩터링 리팩터링에 관련된 작업 🛠 수정 수정에 관련된 작업
Projects
Status: Done
1 participant