JPA
연관관계 편의 메소드 작성 시 주의사항(part.2)
쿠카이든
2022. 6. 12. 21:55
728x90
- 사실 setTeam() 메소드에는 버그가 있다.
member1.setTeam(teamA); //1
member2.setTeam(teamB); //2
Member findMEmber = teamA.getMember(); //member1이 여전히 조회된다.
- teamB로 변경할 때 teamA -> member1 관계를 제거하지 않았다.
- 연관관계를 변경할 때는 기존 팀이 있으면 기존 팀과 회원의 연관관계를 삭제하는 코드를 추가해야 한다.
- 따라서 다음 코드처럼 기존 관계를 제거하도록 코드를 수정해야 한다.
public void setTeam(Team team) {
//기존 팀과 관계를 제거
if (this.team != null) {
this.team.getMembers().remove(this); //this는 member 자신을 의미함
}
this.team = team;
team.getMembers().add(this);
}
- 이 코드는 객체에서 서로 다른 단방향 연관관계 2개를 양방향인 것 처럼 보이게 하려고 얼마나 많은 고민과 수고가 필요한지 보여준다.
- 반면에 관계형 데이터베이스는 외래 키 하나로 문제를 단순하게 해결한다.
- 정리하자면 객체에서 양방향 연관 관계를 사용하려면 로직을 견고하게 작성해야 한다.
출처 : 자바 ORM 표준 JPA 프로그래밍 (저자 김영한)
728x90