인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

ildong-dev03님의 프로필 이미지
ildong-dev03

작성한 질문수

실전! Querydsl

17강 조인 - on절을 듣다가 질문드립니다.

작성

·

149

0

안녕하세요.

스프링입문부터 강의를 듣다가 처음으로 질문드립니다.

17강 조인 - on절을 듣던중

join_on_filtering() Test예제에서 잘 모르겠는 부분이 있어서 질문드립니다.

모든 member를 조회하고 teamA이면 team을 left outer join 으로 조회하는 케이스였는데요

list<Tuple> result 를 loop한 결과 

```

tuple = [Member(id=3, username=member1, age=10), Team(id=1, name=teamA)]

tuple = [Member(id=4, username=member2, age=20), Team(id=1, name=teamA)]

tuple = [Member(id=5, username=member3, age=30), null]

tuple = [Member(id=6, username=member4, age=40), null]

```

이렇게 나왔습니다.

제가 여기서 3번째 항목(index 2)의 Team이 Null인것을 확인하여 결과를 화면에 찍어보다가

result.get(2).get(member).getTeam() 을 했을때

teamB에 대한 select query 없이 TeamB가 출력되는 결과가 나타났습니다.

1. query 결과상 team_id(FK)는 null 이 나왔는데 result.get(2).get(member).getTeam() 과 result.get(2).get(team) 의 차이가 궁금합니다.

2. teamA에 대해 select 했기 때문에 result.get(2).get(member).getTeam() 가 null 이 나오거나 구문을 수행하면 teamB에 대한 select query를 실행할줄알았는데,

LAZY와 상관이 없는것인지, teamB에 대한 select query 없이 teamB에 대한 내용이 출력될수 있는지 궁금합니다.

(select query가 없어서 영속성 컨텍스트 1차캐시에서 바로 불러온줄 알았는데 그 전에 teamB에 대한 조회쿼리가 없었습니다)

ps1. p6spy query로그를 보았을때 궁금한점이 있습니다.

```

/* select member1, team

from Member member1

  left join Team team with member1.team = team and team.name = 'teamA'1 */

select member0_.member_id as member_id1_1_0_, team1_.team_id as team_id1_2_1_, member0_.age as age2_1_0_, member0_.team_id as team_id4_1_0_, member0_.username as username3_1_0_, team1_.name as name2_2_1_ from member member0_ left outer join team team1_ on (member0_.team_id=team1_.team_id and team1_.name=NULL);

```

주석안에 쿼리는 parameter가 잘 나왔는데 밑에 실제 query에는 NULL로 나오고 실제 수행된 결과는 parameter가 잘 적용된 결과가 나옵니다. ㅎㅎ...

ps2. 사내에서 주 RDBMS를 Oracle로 사용하고있습니다.(과거 Oracle ERP를 사용하면서 주 RDBMS로 선택했고, 현재 SAP ERP로 전환하였지만 Legacy System의 DB는 95% 이상 Oracle로 운영되고있습니다)

기존 Legacy는 거의 Mybatis로 query mapping을 하고있는데 orm을 처음 적용하여 개발을 진행해보려고 합니다.

현재 dialect로 Oracle10gDialect를 사용하여 실습중인데 실습한 내용을 바탕으로 실 운영환경에서 잘 적용할 수 있을지 걱정이됩니다.

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. ildong-dev03님

member1 -> teamA

member2 -> teamA

member3 -> teamB

member4 -> teamB

이렇게 연관관계가 형성되어 있습니다.

해당 쿼리에서 데이터를 뽑을 때 left join + on 절의 영향으로 해당 쿼리에서만 데이터가 줄어든 것입니다.

지연로딩은 연관관계가 있으면 데이터를 조회하기 때문에 연관관계가 있으면 조회되는 것이 정상입니다.

Q: select query 없이 teamB에 대한 내용이 출력될수 있는지 궁금합니다.

테스트 데이터를 입력한 내용이 영속성 컨텍스트에 남아있어서 그렇습니다. 테스트 데이터 입력을 완료한 다음에 em.flush(); em.clear();를 함께 호출해주시면 쿼리가 보입니다.

Q: ps1. p6spy query로그를 보았을때 궁금한점이 있습니다.

p6spy의 버그아닌 버그입니다. p6spy는 단순히 ? 부분을 치환하는데, 하이버네이트 주석이 있느면 /* ? /* select =? 이렇게 되면 ?가 2개가 나타납니다. 첫번째 것만 치환하고 두번째 것은 치환하지 못한 것입니다.

Q: ps2. 조언을 드리자면, 잘 운영되고 있는 레거시 시스템에서 시작하기 보다는, 작은 신규 프로젝트부터 조심씩 경험을 쌓는 것을 추천드립니다. 그리고 가장 중요한 것은 기술을 변경할 때는 팀에서 합의가 이루어져야 합니다.

감사합니다.

ildong-dev03님의 프로필 이미지
ildong-dev03

작성한 질문수

질문하기