강의

멘토링

로드맵

Inflearn brand logo image

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

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

단방향 연관관계

@ManyToOne(fetch = FetchType.LAZY) 하고 콘솔에 select 쿼리문

해결된 질문

작성

·

68

0

[질문 내용]

단방향 연관관계 영상 22분 10초 쯤에서 Member클래스에 Team 필드 어노테이션으로 @ManyToOne(fetch = FetchType.LAZY)를 지정하고 서버를 재실행하였을 때 김영한 강사님 콘솔에서는 쿼리가 지연로딩되어 분리돼서 Member와 Team이 따로 조회가 되는걸로 나와있는데요 저도 같은 환경으로 실행하였을 때는 한 DB테이블만(MEMBER) 만 조회돼서 나오는데 왜 이러는 것인지 궁금합니다

스크린샷 2025-01-20 135606.png

.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. soojinkimss님.

지연 로딩(Lazy Loading)은 JPA에서 엔티티의 연관된 데이터를 실제로 필요할 때 즉, 호출할 때 로드하는 방식입니다. 따라서, @ManyToOne(fetch = FetchType.LAZY)로 설정된 연관 관계에서는 관련된 엔티티의 데이터를 조회할 때 실제 쿼리가 실행됩니다. 이를테면, Member 엔티티에서 Team을 참조할 때, team.getName() 등을 호출하기 전까지 실제 Team 엔티티는 데이터베이스에서 조회되지 않습니다.

질문하신 상황에서 Member만 조회되고 Team이 조회되지 않는 것은 Team 엔티티의 프로퍼티를 접근하지 않아서일 가능성이 높습니다. 만약 Team 엔티티의 데이터를 사용하지 않으면 실제로 데이터베이스 쿼리가 발생하지 않습니다. 이는 JPA의 프록시 객체 때문에 발생하는데, 프록시 객체는 실제 데이터에 접근하기 전까지는 데이터베이스 조회를 지연시킵니다.

이를 직접 확인하고 싶으시다면 다음과 같은 코드를 추가하신 후 실제 쿼리를 확인해볼 수 있습니다:

Member member = em.find(Member.class, memberId);
System.out.println(member.getTeam().getName()); // 여기서 실제 쿼리가 나갑니다.

추가적으로 비슷한 상황에 대한 김영한 강사님의 답변이 인프런에 올라와 있습니다. 아래의 게시물을 참고해보시면 이해에 도움이 될 것입니다:

이 게시물들에서 다루는 사례들은 지연 로딩과 관련된 특성과 데이터베이스 쿼리 실행에 대한 상세한 이해를 돕는 데 유용할 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

soojinkimss님의 프로필 이미지
soojinkimss

작성한 질문수

질문하기