Skip to content

3. Lazy Fetch? 이게 무슨 개소린가!

chodakk edited this page Mar 3, 2022 · 1 revision

??? : Fetch는 뭐고?

그냥 외래키 참조와 관련된 단어입니다.

예를 들자면...
User Entity에는 userId(PK)만 존재하고,
Post Entity에는 postId, userId(FK, ManyToOne), contents가 존재할 때
ManyToOne이 뭔지 모르면 검색하자

Post Entity에서 User Entity의 userId를 받기 때문에 서로 연관되어 있는 것은 아시져?
그럼 이제 Post Entity를 조회하면 User Entity까지 바로 조회할 수 있겠네요?

게시글 하나만 띄우려 하는 Service에서 Post Entity를 조회하면 User Entity까지 자동으로 조회되는 시스템에서
게시글 하나를 조회했을 뿐인데, 게시글 N개를 다 보는 것도 모자라 User Entity까지 N번 봐야한다니 극혐이지 않아요?

난 단지 과자가 먹고 싶었을 뿐인데 훨씬 많은 양의 질소가 따라오는 것처럼 비효율적인 방법이다.

이는 Eager, 즉시 로딩이라 불리우는 Fetch 방법이고,
위의 문제를 N+1 문제(한 번 조회하는데 N개 쿼리가 따라와서ㅎ;)라고 말해요~


그럼 낭비되는 구문을 어떻게 해야 줄여요?

Lazy Fetch가 있도다!

Lazy Fetch는 내가 원할 때 외래키 참조 class에 접근해서 쓸 수 있는 방법이다.

근데 난 주로 FK의 클래스까지 사용하는데??? 그냥 Eager 쓸래!

원리 상으론 그렇지만 현업에서는 거의 Lazy Fetch를 사용한다고 한다.

아니 ** 나는 참조를 자주 할거라니까????????

그럼 Fetch join을 사용해봐!

Fetch join은 객체 그래프를 SQL 명령 한 번에 다 조회하는 기능이야!
Eager Fetch처럼 작동하지만 걔는 강제적으로 FK의 참조까지 조회하잖아.
나는 그냥 원할 때 쓰면 돼!
사용법 참고 : https://pugyu.tistory.com/94
나도 아직 Fetch join은 다 알아보지 않아서 정확히 모름ㅋ