inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

페치 조인 1 - 기본

toString() 만 사용해도 프록시객체가 초기화되는 것이 맞나요?

해결된 질문

626

동해물과백두산이마르고닳도록

작성한 질문수 27

0

일전에, 지연로딩 을 사용하면 객체의 참조를 얻을 때가 아닌, 실제 필드(메서드 포함) 에 접근할 때 프록시 객체가 진짜 객체로 초기화 되는 것으로 이해했습니다.

그런데 아래와 같이 코드를 짜고 실행해보니, 객체의 참조를 얻을 때 쿼리가 나가는 것 처럼 보이더라고요.

// 팀
Team teamA = new Team();
teamA.setName("팀A");
em.persist(teamA);

Team teamB = new Team();
teamB.setName("팀B");
em.persist(teamB);

// 회원: member1, 2 는 팀A 소속. member3은 팀B 소속
Member member1 = new Member();
member1.setUsername("회원1");
member1.setTeam(teamA);
em.persist(member1);

Member member2 = new Member();
member2.setUsername("회원2");
member2.setTeam(teamA);
em.persist(member2);

Member member3 = new Member();
member3.setUsername("회원3");
member3.setTeam(teamB);
em.persist(member3);

em.flush();
em.clear();

// Query
String query = "select m from Member m";

List<Member> findMembers = em.createQuery(query, Member.class)
   .getResultList();

for (Member member : findMembers) {
   System.out.println("member = " + member.getUsername() + ", " + member.getTeam());
}

tx.commit();

 

(나간 쿼리)

Hibernate: 
    /* select
        m 
    from
        Member m */ select
            member0_.MEMBER_ID as MEMBER_I1_7_,
            member0_.createdBy as createdB2_7_,
            member0_.createdDate as createdD3_7_,
            member0_.lastModifiedBy as lastModi4_7_,
            member0_.lastModifiedDate as lastModi5_7_,
            member0_.COMPANY_CITY as COMPANY_6_7_,
            member0_.COMPANY_STREET as COMPANY_7_7_,
            member0_.COMPANY_ZIPCODE as COMPANY_8_7_,
            member0_.city as city9_7_,
            member0_.street as street10_7_,
            member0_.zipcode as zipcode11_7_,
            member0_.LOCKER_ID as LOCKER_15_7_,
            member0_.TEAM_ID as TEAM_ID16_7_,
            member0_.USERNAME as USERNAM12_7_,
            member0_.endDate as endDate13_7_,
            member0_.startDate as startDa14_7_ 
        from
            Member member0_
Hibernate: 
    select
        team0_.TEAM_ID as TEAM_ID1_10_0_,
        team0_.createdBy as createdB2_10_0_,
        team0_.createdDate as createdD3_10_0_,
        team0_.lastModifiedBy as lastModi4_10_0_,
        team0_.lastModifiedDate as lastModi5_10_0_,
        team0_.name as name6_10_0_ 
    from
        Team team0_ 
    where
        team0_.TEAM_ID=?
member = 회원1, hellojpa.domain.Team@26ae880a
member = 회원2, hellojpa.domain.Team@26ae880a
Hibernate: 
    select
        team0_.TEAM_ID as TEAM_ID1_10_0_,
        team0_.createdBy as createdB2_10_0_,
        team0_.createdDate as createdD3_10_0_,
        team0_.lastModifiedBy as lastModi4_10_0_,
        team0_.lastModifiedDate as lastModi5_10_0_,
        team0_.name as name6_10_0_ 
    from
        Team team0_ 
    where
        team0_.TEAM_ID=?
member = 회원3, hellojpa.domain.Team@6bd16207

 

저는 위 코드 중 System.out.println 과정 중 프록시 객체가 초기화가 되어서 위같은 쿼리가 나왔다고 생각하는데 제 판단의 근거가 맞는지 궁금합니다.

System.out.println("member = " + member.getUsername() + ", " + member.getTeam());

System.out.println 을 사용하면 자동으로 객체.toString() 이 호출되고, 따라서 필드(메서드)에 접근 했으므로 이 시점에 프록시 객체가 엔티티로 초기화 되었다.

위 처럼 이해하는게 맞을까요? 항상 애써주시는 영한님과 서포터님들께 감사드립니다!!

java jpa

답변 1

1

김영한

안녕하세요. manhae님

프록시의 메서드에 접근하면 초기화가 진행됩니다. toString()의 경우도 포함됩니다.

@Id를 조회하는 getId()의 경우는 내부에서 이미 id 값을 가지고 있기 때문에 초기화 되지 않습니다.

감사합니다.

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

47

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

94

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

115

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1