• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

페치조인 별칭

23.01.19 18:35 작성 23.01.19 21:07 수정 조회수 1.09k

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)

[질문 내용]

질문 1 ============================================


별칭과 관련하여 영한님의 댓글을 찾아보던 도중

 

라는 글이 있습니다.

 

제가 이해한 바로는

1:N 이던 N:1 이던 1:1 이던

페치조인할때 별칭은 사용하지 않는것이 좋지만

페치 조인시 별칭을 사용했을때와 별칭을 사용하지 않았을때와 의 데이터가 일치한다면(정합성) 사용 할수 있다

 

이렇게 이해를 했는데 맞나요 ?

 

 

질문 2 ============================================

 

페치조인시 1:N 에서 페이징을 사용할수 없는 이유는

페치조인의 메커니즘 자체가 1:N 이면 N 만큼 데이터를 다 가지고 있어야 하는데

ex) @OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
(Team 은 페치조인시 members 의 뻥튀기 된 데이터를 모두 가지고 있어야한다)

 

그런데 이때 페이징을 실행하면 뻥튀기된 데이터를 가지고 있을수가 없다.

그래서 JPA는 메모리에 모든 정보를 끌어모아 저장 시킨후 메모리에서 페이징 처리를 실행 하기 때문에 메모리 부족 현상이 나타날수 있다

 

이렇게 이해를 했는데 맞나요 ? (질문1,2)

 

======================질문3

페이징 처리를 위해

N:1 을 1:N 으로 바꿔서 페치조인을 하면 되는데

막상 이 쿼리를 디비에 실행해도 둘다 데이터가 각 3건씩 똑같이 나오는게 맞나요 ? (뻥튀기 가 일어나면 데이터가 더많아야 하는게 아닌가요 ? 1:n 조인이)

 

각각 1:N , N:1 페치조인 실행한 결과

 [데이터 뻥튀기는 -> 데이터 베이스 쿼리는 동일하게 나오나, 자바 객체에서 뻥튀기 ->[중복] 현상이라고 생각하면 되는건가요 ??]

 

이 부분은 몆번을 봐도 햇갈리네요

 

 

답변 1

답변을 작성해보세요.

1

안녕하세요. 기팝님

데이터 뻥튀기 라는 것은 SQL JOIN의 결과로 만들어지는 것입니다.

조인을 하면 데이터가 N에 맞추어서 늘어나게 되지요.

SQL JOIN 부분을 먼저 꼭! 공부하시고 이해하시는 것이 필요합니다.

이 부분을 먼저 이해하셔야 질문에 대해서 명확한 이해가 가능해집니다.

질문1

네 맞습니다.

질문2

게시판(1)과 댓글(N)이 있다고 가정을 하겠습니다. 게시판과 댓글을 조인하게 되면 게시판을 기준으로 하는 페이징이 불가능해집니다.

왜냐하면 게시판이 아니라 댓글 수 만큼 곱해서 데이터가 나오는데, 여기에 페이징을 위해 10건을 데이터를 받게 되면 게시판이 몇게가 나올지 예상이 안됩니다. 게시판이 1개가 나올 수도 있고, 10개가 나올 수도 있습니다.

SQL문을 실행해서 직접 만들어보시면 이해가 되실꺼에요.

따라서 모든 데이터를 다 확인하지 않는 이상 페이징이 불가능해집니다. 이것은 SQL문 자체의 한계로 이해하시면 됩니다.

질문3

SQL JOIN 자체를 이해하셔야 합니다.

감사합니다.