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

dksrudwns님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

공통 인터페이스 설정

외래키에 해당하는 컬럼으로 조회하고 싶을때는 어떻게 하면 될까요???

20.02.18 21:22 작성

·

2K

1

특정 팀 소속인 사용자 목록을 얻고 싶다면

Member Repository에서 아래와 같이 만들어서 

findByTeam(Team team, Pageable pageable);

Team 객체에 해당하는 Team의 id 값을 담아서 조회 하고 있는데 이러한 방식 맞나요??

답변 4

2

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

2020. 02. 18. 23:03

안녕하세요. dksrudwns님

findByTeam과 같이 해결하는 방법이 맞습니다.

이게 어색하면 다른 해결 방안으로는 다음과 같이 ID를 직접 조회하는 JPQL을 작성하시면 됩니다.

@Query("select m from Member m where m.team.id = :teamId")
Member findByTeamJpql(@Param("teamId") Long id);

추가로 findByTeamId(Long id) 또는 findByTeam_id(Long id)를 사용하셔도 되는데, 이 방식은 불필요한 조인이 발생합니다.(스프링 데이터의 한계)

감사합니다^^

0

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

2020. 02. 19. 21:30

네 맞습니다^^ 스프링 데이터 JPA가 findByTeamId라고 하면 Team과 강제로 조인하고 Team의 id를 찾습니다

alkooper5님의 프로필 이미지

2024. 08. 05. 02:41

오래됐지만 여전히 빛나는 답글에 질문을 드려봅니다.

 

혹시 어떤 한계 때문에 강제로 join이 발생하는지 알 수 있을까요?

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

2024. 08. 05. 19:30

안녕하세요. alkooper5님

우선 이 내용을 이해하려면 JPA 기본편 강의

섹션 11. 객체지향 쿼리 언어 - 중급 문법 -> 엔티티 직접 사용에 대해서 알아야 합니다.

 

다음과 같이 JPQL을 작성하면

select m from Member m where m.team.id = :teamId

 

다음과 같은 SQL이 실행됩니다.

select * from Member m where m.teamId = :teamId

teamId가 Member에 있기 때문에 Team과 조인이 없이 teamId를 Member에서 바로 찾을 수 있습니다.

 

스프링 데이터 JPA는 이런 경우 최적화를 하지 못하고 Team과 조인을 하는데요. 한계라기 보다는 스프링 데이터 JPA가 메서드 이름을 그대로 JPQL에 반영하는 방식으로 작동하기 때문으로 추정됩니다.

감사합니다.

alkooper5님의 프로필 이미지

2024. 08. 05. 22:11

빠른 답변 감사드립니다~~

0

dksrudwns님의 프로필 이미지
dksrudwns
질문자

2020. 02. 19. 13:48

알려주시셔서 감사합니다. 

추가적으로 궁금한게 findByTeamId(Long id), findByTeam_id(Long id)으로 사용 시 (fetch = FetchType.LAZY)가 적용된 컬럼이여도 해당 방식으로 조회 시 join이 강제로 발생한다는 의미가 맞나요?? 

0

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

2020. 02. 18. 23:11

추가로 연관관계가 있을 때 id로 조회하는 것과 엔티티로 조회하는 것 관련해서 기본편 강의

섹션 11. 객체지향 쿼리 언어 - 중급 문법 -> 엔티티 직접 사용을 들어보시면 궁금해 하시는 내용을 자세히 설명해드립니다^^

감사합니다.