1. 들어가며
JPA에서 양방향 연관관계를 매핑할때, 객체관점에서 편의 메서드
를 작성하는 방법에 대해서 알아보자.
이번에는 양방향 매핑을 할때, 객체 관점에서 어떻게 처리할지?를 고민해보자.
2. 예제 코드
Member (N) : Team(1) 의 관계를 생각해보자
public class Member {
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
public class Team {
@OneToMany(mappedBy="team")
private List<Member> members = new ArrayList<>();
}
다음과 같이 team.getMembers() 컬랙션을 가지고 와서, 저장한 member를 add하면 어떻게 될까?
Member member = new Member();
member.setName("andrew");
member.setAge(32);
memberRepository.save(member);
Team team = new Team();
team.setName("teamA");
team.getMembers().add(member);
teamRepository.save(team);
System.out.println(memberRepository.findById(member.getId()));
다음과 같이 team에 null 값이 나온다.
Optional[Member(id=1, name=andrew, age=32, team=null)]
왜 이런 현상이 나올까?
연관관계의 주인은 Member.team이다. 즉, Team.members(연관관계의 주인이 아닌)에 값을 저장 하면 안된다.
3. 어떻게 하나?
정답은 연관관계의 주인쪽에만 값을 저장하냐? 안하냐? 이런 여부를 묻고 따지지 말고, 객체 관점에서 양쪽 방향에 모두 값을 입력해 주는 것이 실수를 미연에 방지할 수 있다.
public void setTeam(Team team) {
// 기존의 team과 member의 관계를 끊는다.
if (this.team != null) {
this.team.getMembers().remove(this);
}
this.team = team; // member -> team
team.getMembers().add(this); // team -> member
}
📚 Related Posts
- JPA - 값 타입(6)
- JPA - 프록시와 연관관계(5)
- JPA - 다양한 연관관계 매핑(4)
- JPA - 연관관계 매핑(기초)(3)
- JPA - 엔티티 매핑(2)
- JPA - 영속성 관리(1)
- [JPA] 연관관계 매핑 (연관관계 편의 메서드)
- [JPA] 엔티티 설계시 주의사항들
- [JPA] Auditing 사용하기
- [JPA]@Transactional를 통한 Optimization
- [JPA] 엔티티 일부 데이터만 조회하는 Projection
- [JPA] save메서드로 살펴보는 persist와 merge 개념
- [JPA] 쿼리메서드(Lookup 전략)
- [JPA] QueryDSL 설정방법
- [JPA] null 처리
- [JPA] 연관관계 매핑 기초(다대일, 연관관계 주인)
- SpringBoot, JPA, H2를 이용한 간단한API 작성
- [JPA] proxy, fetch 전략
- [JPA] 도메인 클래스 컨버터란?
- [JPA] Custom Repository 만들기
- [JPA] Casecade 옵션