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

서정원님의 프로필 이미지

작성한 질문수

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

양방향 연관관계와 연관관계의 주인 1- 기본

team.getMembers에 관한 질문

작성

·

296

·

수정됨

1

em.flush() em.clear를 해야지만 findTeam.getMembers()를 통해서 members조회가 가능하더라구요. 제가 이해한 바로는 Team안에

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

이렇게 되어있지만 우리가 members에 대해서 설정한 부분이 없다. 여기까지는 이해했습니다. 그렇다면 이렇게 설정하고 DB에 flush를 하면 JPA가 알아서 Team에 대한 members를 넣어주는건가요? 아니면 em.find(Member.class,member.getId())를 했을 때에 JPA가 members를 찾아주나요? 이것이 궁금합니다.

답변 2

1

안녕하세요. 서정원님, 공식 서포터즈 OMG입니다.

양방향 연관관계와 연관관계의 주인 1- 기본을 수강중에 남기신 질문으로 확인이 됩니다.

바로 직전 강의(단방향 연관관계) 영상 후반부 21분~ 부터 설명해주시는데요, em.flush()와 em.clear()를 통해 1차캐시에서 조회하지 않고, 실제 DB쿼리(select쿼리 호출)를 통해 조회해올 수 있기 때문입니다.

 

강의에서도 잠깐 언급하시지만, 이 부분은 지연로딩과도 연결되어 있어서 섹션8.프록시와 연관관계 관리

를 수강하시면 의문이 해소되실 것 같아요.

 

감사합니다.

0

저도 이게 궁금합니다. Team의 members에는 우리가 값을넣어주지 않았는데, 어떻게 findMember.getTeam().getMemebers()에 멤버가 들어있을 수 있는 건가요? ㅠㅠ 너무 헷갈리네요..

Member findMember = em.find(Member.class, member1.getId());

이렇게 코드를 쳤을 때 join으로 team 테이블 까지 같이 가져오는 건 알겠는데, 어떻게 team의 members 컬렉션에 member가 저장되는 걸까요...

 

정원님도 8강까지 가서 의문이 해결되셨나요?

서정원님의 프로필 이미지
서정원
질문자

안녕하세요 일단 저는 강의를 다 들었던 상태이긴 한데... 지금 이 상황이라고 해야할까요? team과 members가 서로 양방향 연관관계이지 않을까 생각합니다. 그렇기 때문에 연관관계의 주인을 통해서 데이터를 입력하게 된다면? 객체 입장에서는 난 분명 members.setTeam을 한것이지 team.setMembers를 했는데 어떻게 team에서 member.id를 통해서 member를 찾을 수 있지? 라고 생각하실 수 있을 것 같네요. 제가 느낀바로는 객체세상과 DB세상이 공존한다고 해야할까요? 분명 우리는 객체에서는 앞서 설명드린것처럼 team에다가 멤버를 세팅?하는 느낌이었지만 저렇게 객체에서 세팅을하고 flush clear를 하게되면 db세상에서는 member의 외래키로 team의 id가 몇이라고 세팅이 될 것입니다. 그렇기 때문에 db적으로 봤을 때 findMember.getTeam을 하면 db에서 외래키인 team의id를 통해서 team을 찾겠죠. 거기서 이제 team의 id를 통해서 teamId가 1인 member들을 찾아줘!라고 하는것이죠.

어떻게 team의 members컬렉션에 member가 저장되냐라고 물으시면 양방향 연관관계를 설정했을 때 연관관계의 주인을 통해서 값을 추가하거나 변경하거나 삭제를 하게되면 그게 db에 그대로 적용이 될겁니다. 객체 입장에서는 collection에 넣은것이 아니지만 db적으로 봤을때는 그렇게 되는거죠. 그렇기 때문에 collection에서 가져올때도 collection에서 가져오는 것이 아니라 db에서 가져온다? 라고 저는 이해했습니다.