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

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

jaemoon님의 프로필 이미지
jaemoon

작성한 질문수

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

프록시

5분대 설명하신 부분이 이해가 잘 안됩니다.

해결된 질문

작성

·

87

0

1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
5분 지점에 member와 team을 분리해서 호출하기 위해 프록시를 사용한다라고 이해했는데 9분 53초대에서 보면 getUsername()을 호출했을 때 쿼리가 team까지 조인해서 가져옵니다.
getTeam() 을 호출하지 않아도 조인으로 가져오는 거라면 굳이 프록시를 사용해야되는 것인지 의문점이 들었습니다.

제가 이해한 것이 맞는지 궁금합니다.

답변 3

1

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

즉시로딩과 지연로딩을 듣기 전이라 디폴트가 EAGER인지 몰랐네요 ㅎㅎ.. 감사합니다!

제가 진도를 착각했습니다 ㅜㅜ 죄송합니다!

언제든 편하게 질문해주십쇼!

1

안녕하세요. jaemoon99님, 공식 서포터즈 y2gcoder입니다.

AI 인턴의 답변에 덧붙여 말씀드리고 싶습니다 🙂

9분 53초 때 호출 전 8분 경에 잠깐 보이는 Member 엔티티의 구현사항을 보면 team 에 대한 @ManyToOne 이 보입니다!

그때 fetch 설정이 따로 되어있지 않습니다. 이 말은 저희가 배운 것처럼 기본적으로 페치 전략이 즉시 로딩으로 작동한다는 것입니다! 이를 바탕으로 AI 인턴의 답변을 추가로 참가해보시면 좋을 것 같습니다 🙂

 

감사합니다.

1

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

jaemoon99님, 질문해 주신 내용을 바탕으로 JPA에서의 프록시와 즉시 로딩(Eager Loading), 지연 로딩(Lazy Loading)에 대한 개념을 간단히 설명드리겠습니다.

  1. 프록시의 사용 이유: JPA에서는 데이터베이스의 여러 테이블 간 연관관계가 있는 엔티티를 관리할 때, 필요한 시점에만 데이터를 로딩하여 성능을 최적화합니다. 지연 로딩(Lazy Loading)을 사용하면, 초기에는 프록시 객체만 생성되어 필요한 순간까지 실제 데이터를 로딩하지 않습니다. 이는 메모리 효율과 성능을 높이기 위한 전략입니다.

  2. 즉시 로딩과 지연 로딩: 즉시 로딩(Eager Loading)을 사용하는 경우, 엔티티가 로딩될 때 연관된 모든 엔티티도 함께 로딩됩니다. 따라서, 하나의 쿼리문으로 여러 테이블에서 데이터를 가져오게 되어, 데이터 접근 시점에 지연이 줄어드는 대신 불필요한 데이터를 미리 로딩할 수 있습니다. 반면, 지연 로딩(Lazy Loading)은 연관 엔티티를 실제로 사용할 때까지 데이터를 로딩하지 않습니다. 이때는 프록시 객체를 통해 실제 데이터가 접근될 때만 데이터베이스 쿼리가 실행됩니다.

  3. getUsername() 호출 시의 쿼리 발생: 강의에서 살펴보셨던 부분은, 지연 로딩 설정이 되어 있을 경우에도 어떤 연관관계에서는 쿼리가 즉시 발생할 수 있는데, 이는 JPA 구현체(예: Hibernate)의 설정에 따라 다를 수 있습니다. 즉시 로딩(fetch=FetchType.EAGER) 같은 경우에는 연관 데이터를 항상 함께 가져오도록 강제합니다.

이를 통해 JPA의 동작을 이해하시는데 도움이 되셨길 바라며, 비슷한 질문과 답변을 아래에서 참고하실 수 있습니다:

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

jaemoon님의 프로필 이미지
jaemoon

작성한 질문수

질문하기