20240402 (화) 최종 프로젝트 티켓레이더 6주차 - 유저테스트전 최적화?

2024. 4. 2. 21:30TIL

엔티티에서 대부분을 FetchType을 EAGER로 설정해놨다.

일부 Response에서 LAZY로 해놓을시 불러오질 못해서였다.

하지만 EAGER 라는것은 상당히 조심해서 써야한다.

이유를 들자면

  1. EAGER 를 사용하면 예상치못한 SQL이 발생할수 있다.
    1. ManyToOne이 5개가 있는데 전부 EAGER로 설정되어있다면 조인이 5개 일어난다.
  2. EAGER 는 JPQL에서 N+1 문제를 일으킬수 있다.
    1. 위에 이유에 이어서 일어나는 문제인데, 다대일 관계에서 멤버(다)2개와 팀(일)이 2개 있다고 가정해보자
    2. 멤버 2명을 조회한다.
    3. JPQL에서는 EAGER시에 반환시점에서 전부 다 조회가 되어있어야 한다.
    4. 멤버를 조회했는데 그 멤버마다 팀을 추가로 또 가져온다.
    5. 이처럼 N+1의 문제는 쿼리를 1개 날렸는데 그 때문에 추가쿼리가 N개 생긴다 라는 의미

처음엔 이러한 오류들이 좀 나왔다.

이게 우리가 EAGER로 해놓은 이유들

LAZY상태에선 트랜잭션이 끝난시점에서 직접적으로 부르지않은 엔티티의 프로퍼티를 사용할수가 없어서였다.

 

해당 오류를 해결하려면

이벤트 하나를 불러와서 리스폰스 할 때 Place와 Price 가 필요한 상태

이런것처럼 리스폰스시에 필요한 객체들을 트랜잭션 내에서 생성해서 줄필요가 있다.