반응형
글 상세보기를 하면 유저는 한 개의 데이터만 가져오면 되니까 EAGER 전략을 사용한다.
EAGER 전략을 사용하면 조인해서 데이터를 가져오는데
조인 쿼리가 어떻게 나오는지 살펴보자.
글에 댓글은 없을 수 있지만 유저는 없을 수가 없으니까 INNER 조인으로 가능하다.
-- User EAGER, List<Comment> LAZY
SELECT *
FROM post p
INNER JOIN user u ON p.userId = u.id
WHERE p.id = 3;
코멘트는 여러 건 데이터가 있을 수 있어서 LAZY 전략을 사용하니까
나중에 한번 더 SELECT 하게 JPA가 돌아간다.
SELECT *
FROM comment
WHERE postId = 3;
만약 코멘트가 EAGER 전략을 사용한다면
두 번에 나눠서 SELECT 하지 않고 한 번에 조인해서 가져온다.
SELECT *
FROM post p
INNER JOIN user u ON p.userId = u.id
INNER JOIN comment c ON p.id = c.postId
WHERE p.id = 3;
1번 글에 4개의 댓글이 있다.
이렇게 INNER 조인을 사용하면 중복되는 데이터가 나오는데
JPA가 중복되는 데이터들은 한 건씩만 넣어주고,
4개의 댓글은 List<Comment> 리스트에 넣어준다.
엄청 똑똑하다!
만약 이 데이터가 글 상세보기가 아닌 게시글 목록보기에 필요하다고 한다면
댓글이 없는 post들은 글 자체가 출력되지 않는다.
INNER JOIN이기 때문이다.
post 목록이 다 나오게 하기 위해서는 LEFT OUTER 조인을 사용한다.
post는 출력되고 대신 댓글이 없기 때문에 null 값이 들어간다.
-- User EAGER, List<Comment> EAGER
SELECT *
FROM post p
INNER JOIN user u ON p.userId = u.id
LEFT OUTER JOIN comment c ON p.id = c.postId;
우리 블로그에서는 두 번 SELECT 하는 쿼리를 사용할 것이다.
ANSI 표준
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형