Replies: 2 comments
-
|
JPA에서 N:1 연관관계(예: 게시글 N개가 하나의 작성자(User)를 참조할 때)에서는 연관된 엔티티를 언제 불러올지를 1. LAZY (지연 로딩)
2. EAGER (즉시 로딩)
예제 상황: 게시글(Post) - 작성자(User)
💡 1. LAZY일 때의 쿼리 동작
▶ 실행된 쿼리 로그
📝 지연 로딩이므로 필요할 때만 User 조회함. 💡 2. EAGER일 때의 쿼리 동작
▶ 실행된 쿼리 로그
📝 즉시 로딩이라 Post를 조회할 때 User도 함께 조회됨. ✨ 권장 전략
|
Beta Was this translation helpful? Give feedback.
-
|
면접 질문: 💬 답변 예시: 우선, EAGER는 연관된 객체를 항상 즉시 로딩하기 때문에 조회할 때마다 불필요한 JOIN 쿼리가 발생할 수 있고, 관계가 복잡할수록 쿼리 성능이 저하되거나 N+1 문제가 발생할 위험이 큽니다. 특히 컨트롤러에서 리스트 조회 시 EAGER로 인해 곱집합(Cartesian Product)이 발생하면 예기치 않은 성능 저하가 발생할 수 있습니다. 반면, LAZY는 연관 객체를 실제 사용할 때 쿼리를 실행하므로 초기 쿼리가 가볍고, 필요에 따라 fetch join이나 @entitygraph를 통해 명확하게 쿼리의 범위를 제어할 수 있어 성능 튜닝에도 유리합니다. 실제 사용에서는 다음과 같이 전략을 구분합니다: 일반적인 서비스 계층에서는 LAZY를 기본으로 사용하고, 필요한 연관 객체가 있을 때 JOIN FETCH로 명시적으로 가져옵니다. 반면, 연관 객체가 반드시 사용되고 별도로 분리할 이유가 없을 때, 예를 들어 조회 대상이 단일 엔티티이고, 항상 연관된 객체가 필요할 경우에는 EAGER를 사용할 수 있다고 판단합니다. 또한, 트랜잭션 밖에서 엔티티를 뷰로 전달하는 경우 LazyInitializationException이 발생할 수 있으므로, LAZY 전략을 유지하면서 DTO로 변환하는 방식을 선호합니다. 결론적으로, 기본은 LAZY를 사용하되, 조회 시점과 연관 객체 사용 여부에 따라 fetch 전략을 명확하게 제어하는 방식이 유지보수와 성능 측면에서 가장 바람직하다고 생각합니다." |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
🤔
Beta Was this translation helpful? Give feedback.
All reactions