해결된 질문
작성
·
81
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요 연관관계 코드로 쳐보면서 하다가 이상한 부분이 있어서 궁금증이 생겨 질문합니다.
Member : N
Team : 1 로
Member가 연관관계 주인인 상태로
member와 team 객체의 연관관계를 설정하고
public class Member {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
public class Team {
@OneToMany(mappedBy = "team") // Member의 team과 연결되어있다.
private List<Member> members = new ArrayList<>();
}
member 저장후 team 저장시
member insert
team insert
가 나간 뒤에
member update 쿼리가 나가는데
이때 member의 모든 필드에 대한 업데이트 쿼리가 나갑니다.
Member member = new Member();
member.setUsername("member1");
Team team = new Team();
team.setName("team1");
member.setTeam(team);
team.getMembers().add(member);
em.persist(member);
em.persist(team);
em.flush();
em.clear();
이게 왜이런지 모르겠습니다.
member가 먼저 추가되면서 teamId가 설정됬을 텐데
실질적인 team 이 데이터베이스에 없어서
team이 추가된 뒤에 연관관계를 맞추기위해 member의 모든 필드를 update했다고 봐야하나요?
그러면 teamId만 update 해주면 되는데 모든 필드를 업데이트하는 이유가 궁금합니다.
항상 감사합니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. 허찬욱님의 질문에 대해 명확한 해결 방향을 알려드리기 위하여 관련 질문과 비슷한 상황을 찾아보았습니다.
허찬욱님의 질문은 연관관계 매핑과 관련하여, 엔티티를 저장할 때 발생하는 쿼리의 순서와 특히나 업데이트 쿼리의 발생 원인에 대한 것입니다. 이와 관련해 다음 답변이 유용할 수 있습니다:
멤버와 팀의 영속화 순서를 뒤집었을 때(?) 생성되는 query에 대한 질문입니다!: 이 글에서는 멤버와 팀을 저장할 때 발생하는 쿼리와 그 순서에 대한 질문이 있었습니다. 특히 멤버를 먼저 영속화 시킨 후 팀을 영속화 시킬 때 발생하는 추가 업데이트 쿼리에 관한 설명이 이루어졌습니다. 허찬욱님의 경우와 유사하게 팀을 나중에 영속화 시켜서 발생하는 UPDATE
쿼리에 대한 상황을 설명하고 있으멀로 매우 유용할 것입니다.
양방향 관계 질문이 있습니다.: 이 글에서는 팀과 멤버 사이의 관계 설정 시 발생할 수 있는 INSERT
와 UPDATE
쿼리에 대한 깊은 논의가 이루어졌습니다. 특히, 엔티티 간의 연관관계를 설정하는 순서에 따라 발생하는 쿼리의 차이와, 하이버네이트가 왜 이러한 쿼리를 발생시키는지에 대한 설명이 포함되어 있습니다.
이러한 내용을 바탕으로, 허찬욱님의 질문에 대한 답변은 팀과 멤버의 저장 순서와 그들 간의 관계가 데이터베이스에 어떻게 반영되는지에 크게 의존합니다. 즉, 멤버와 팀 사이의 관계를 설정한 후 적절한 순서로 저장(영속화)하면 추가적인 UPDATE
쿼리를 최소화할 수 있습니다. 하이버네이트는 객체 상태를 관리하기 위해, 연관관계가 설정되어 있는 객체가 영속화 될 때 해당 관계를 데이터베이스에 반영하기 위해 추가 쿼리를 실행합니다. 설계 단계에서 이러한 동작을 고려하여, 가능한 한 효율적인 쿼리 실행을 유도하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.