인프런 커뮤니티 질문&답변

임도현님의 프로필 이미지

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

N+1 Select 문제 해결

leftjoin에 관한 질문입니다.

작성

·

254

0

처음에 N+1을 해결하시기전에 tag만 leftjoin으로 보여주시고 중복되는 row를 보여주시는 부분에서 질문이있습니다.

 

해당 sql문이 동작하는 방식이 아래인것같은데

  1. where문이 먼저 study중 jpa가 들어간 study만 조회해온다.

  2. 후에 해당 study 에 연관된 애들만 fetch join해서 가져온다.

궁금한것은 왜
join먼저 되고 where문이 걸러주지 방식으로 동작하지 않는건가요..? 원래 이 방식이 sql 문에 join 과 where을 같이 썼을때 동작하는 방식이 아닌가요..?

답변 3

0

임도현님의 프로필 이미지
임도현
질문자

말씀하신대로 제가 첫번째 줄을 보고 오해한것 같습니다. 적용이 된것이 맞군요

친절한 설명해주셔서 감사합니다 ㅜㅜ

0

백기선님의 프로필 이미지
백기선
지식공유자

데이터는 이 수업에서도 where 절이 걸러준거에요.

테이블이 세개여서 조금 복잡한데요. 스터디, 스터디_태그, 태그 이렇게 세개인데 이 세개를 왼쪽 기준으로 합치는 쿼리를 만들었죠. 왼쪽 조인이니까 where 조건 (jpa 태그를 가지고 있거나 스터디 타이틀에 jpa가 있는 데이터)으로 걸러낸 데이터를 왼쪽 테이블 들 (스터디와 스터디_태그) 기준으로 출력하는 과정에서 세줄이 되었고 그 중에 한 줄에 spring 태그가 들어간 겁니다.

좀 더 자세히 설명드리자면, 태그 기준으로 보면 1개의 데이터(jpa 태그)를 찾았는데 그 한 데이터는 2개의 스터디_태그와 연결되어 있습니다. 그리고 다시 그 두개의 스터디_태그는 2개의 스터디와 연결이 되죠.

자 그럼 이제 합쳐서 출력해야 하는데 왼쪽 기준이니까 스터디 데이터 2개, 해당 스터디가 가지고 있는 스터디_태그 데이터가 3개 (여기서 세줄이 됩니다) 그리고 각각의 스터디_태그에 연결되어 있는 태그들을 출력합니다.

  • 첫번째 줄은 1번 스터디의 1번 스터디_태그에 연결된 1번 태그 (spring).

  • 두번째 줄은 1번 스터디의 2번 스터디_태그에 연결된 2번 태그 (jpa)

  • 세번째 줄은 1번 스터디의 3번 스터디_태그에 연결된 2번 태그 (jpa)

 

첫번쨰 줄을 보고 where절이 적용 안된거 아니냐고 생각하시는 것 같은데요. 적용이 되었기 때문에 나온겁니다. jpa 태그나 타이블에 jpa가 없는 스터디를 만들어서 테스트 해보시면 해당 데이터가 걸려져서 아에 출력이 안되는걸 볼 수 있을 겁니다.

 

0

백기선님의 프로필 이미지
백기선
지식공유자

지금 여기서 중복 row가 보이는 이유가 where 절 실행 순서랑 관련이 있나요?

임도현님의 프로필 이미지
임도현
질문자

https://stackoverflow.com/questions/354070/sql-join-where-clause-vs-on-clause

image

위 링크의 2번째 답변을 보고 궁금증이 생겨서 여쭤봤습니다.

해당 답변에서 where가 강의의 쿼리처럼 뒤에 존재하는데
처음에 leftjoin 결과를 보여주고 where 문 때문에 중복이 걸러지는 것을 보여줍니다.

왜 강의에서 where는 jpa 태그만 가진 study만을 보여주지 않는지 궁금했습니다.