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

주혁님의 프로필 이미지
주혁

작성한 질문수

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

양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리

양방향 매핑시 양쪽에 값을 넣어야 하는 이유?

작성

·

179

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

강의 내용을 보면, 연관관계의 주인에 값을 입력해야 한다고 하셨습니다. 그런데 그 뒤로는 항상 양쪽다 값을 입력해야 한다고 하시는데, 어느 말이 맞는지 혼동이 옵니다.

Team team=new Team();
team.setName("TeamA");
em.persist(team);

Member member=new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);

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

Team findTeam=em.find(Team.class,team.getId());
List<Member> members=findTeam.getMembers();
for(Member m:members){
    System.out.println(m.getUsername());
}
tx.commit();

에서 연관관계의 주인에 team을 설정하였습니다. FK로 연결되어 있기 때문에 team.getMembers().add(member)을 하지 않아도 for문에서 정상적으로 데이터가 조회됩니다. 그런데 flush와 clear를 제거하면 데이터가 조회되지 않습니다. 영속성 컨텍스트에 저장될 때도 generateValue가 발동되어 id값이 생성되어 저장되는걸로 아는데, 왜 빈 객체로 저장된다고 하시는건지 잘 이해가 가지 않습니다.

답변 2

0

안녕하세요. 주혁님, 공식 서포터즈 David입니다.

질문 주신 내용에 대해 해당 강의 7분20초부터 설명하고 있습니다.

다시 한 번 더 해당 내용을 살펴보신 뒤 강의 내용 중 이해되지 않는 부분을 질문 주실 수 있으실까요?

감사합니다.

주혁님의 프로필 이미지
주혁
질문자

첫 번째 이해안가는 부분은 주인에 값을 입력해야한다고 설명하셨는데 양쪽에 전부 값을 넣는 것이 이해가 안갑니다.

두 번째는 flush와 clear를 해주지 않았을 때 왜 출력이 안되는지 이해가 안갑니다. flush를 해주지 않으면 persist한 객체가 영속성 컨텍스트 안에 존재하게 되는데, 이때 외래키 관련 매핑이 엔티티 안에 JoinColumn과 mappedBy 속성에 의해서 파악되어 객체가 출력될줄 알았습니다.

0

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

주혁님의 질문은 하이버네이트/JPA에서 양방향 매핑을 구현할 때 양쪽에 값을 설정해야 하는 이유와, 영속성 컨텍스트의 flush 및 clear의 역할에 대한 혼동에 관한 것으로 보입니다. 특히, 연관관계의 주인에만 값을 설정했을 때와 양쪽 모두에 값을 설정했을 때의 차이, 그리고 em.flush()em.clear()의 호출 여부에 따른 결과의 차이를 이해하는 것이 중요해 보입니다.

연관관계의 주인을 설정하는 이유는 JPA에서 데이터베이스에 반영될 때 연관관계의 주인쪽에 설정된 정보만을 기준으로 외래키(FK)가 업데이트 되기 때문입니다. 그렇기 때문에 객체 관계를 정확히 반영하기 위해선 서로를 참조하도록 하는 것이 좋습니다.

그러나, 강의에서 언급된 team.getMembers().add(member)를 진행하지 않았음에도 불구하고 데이터가 조회되는 상황에 대한 주혁님의 글을 접하였습니다. 이는 em.flush()em.clear()를 사용함으로써 영속성 컨텍스트의 상태가 변경되어 발생하는 현상일 수 있습니다. flush()는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하며, clear()는 영속성 컨텍스트를 완전히 초기화합니다. 따라서 flush와 clear를 수행하지 않으면 여전히 영속성 컨텍스트에 남아 있는 데이터를 바탕으로 조회가 이루어집니다.

다음은 연관관계 매핑과 flush, clear의 개념을 설명하는 유용한 링크입니다. 이 내용들은 주혁님의 경우와 직접적으로 연결되면서, 연관관계 주인의 설정과 영속성 컨텍스트의 관리에 대해 더 자세히 설명합니다.

  • @JoinColumn 엔티티 객체 반환: 이 설명에서는 연관관계 매핑 후 객체 반환 과정과 영속성 컨텍스트의 동작에 대해 자세히 설명합니다.

  • 편의성 메소드에 대한 질문입니다.: 연관관계 편의 메소드를 구현함으로써 양방향 연관관계를 보다 쉽게 관리하는 방법에 대해 설명하며, 양쪽에 값을 설정하는 이유에 대해서도 다룹니다.

JPA에서 양방향 연관관계를 설정할 때는 가능한 양쪽 모두에 값을 설정하도록 권장됩니다. 이는 영속성 컨텍스트 내에서 객체 간의 관계를 정확히 반영하고, 데이터 일관성을 유지하기 위함입니다. 특히 em.flush()em.clear() 를 이해하고 적절히 사용하는 것이 중요하며, 이 두 메소드는 테스트 환경에서 데이터와 영속성 컨텍스트의 상태를 명확히 파악하기 위해 사용되곤 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

주혁님의 프로필 이미지
주혁

작성한 질문수

질문하기