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

모코코님의 프로필 이미지
모코코

작성한 질문수

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

프록시

member Id 관련

작성

·

245

1

10분 20초 관련 질문입니다.

Member member = new Member();

member.setName("user1");

에서 어떻게 findMember.getId()를 DB에서 가지고오지 않아도 알 수 있는지 궁금합니다. id값을 지정하지 않았는데 바로 getId()로 Id값을 가지고 온다는게 이해가 안됩니다.

DB에서 꺼내와야 알 수 있는게 아닌가라고 생각되는데 궁금합니다.

답변 1

3

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

안녕하세요. Ul ysses님^^

em.getReference(Member.class, member.getId()) 이 부분에 힌트가 있습니다.

getReference를 호출해서 프록시로 조회할 때 member.getId(), 그러니까 ID 값을 넘깁니다.

이 ID 값을 내부에서 들고 있기 때문에 이후 getId()를 했을 때는, DB를 조회하지 않고, 방금 넘겨둔 ID 값을 사용합니다.

그러면 더 앞으로가서 다음 코드에서 member에는 애초에 어떻게 id가 들어있나요?

Member member = new Member()

member.setUsername("hello")

em.persist(member) -> 바로 이 부분을 거치면 ID가 들어가게 됩니다. ID 자동생성 전략이 이때 실행이 되고, ID에도 값이 들어가게 됩니다.

JPA에서 영속상태가 되려면 ID(PK)가 필수 입니다.

감사합니다.

안녕하세요! 저도 해당 부분 이해가 되지 않아 문의 드립니다. em.clear() 를하게 되면 준영속 상태가 되어 영속성 컨텍스트의 데이터가 지워지는 것으로 이해했는데 어떻게 getId()는 가져 올 수 있는 건가요??

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

안녕하세요. hamoey님

준영속 상태가 되어도 해당 객체가 가지고 있는 데이터는 그대로 사용할 수 있습니다.

감사합니다.

모코코님의 프로필 이미지
모코코

작성한 질문수

질문하기