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

'JPA' 카테고리의 다른 글

@MappedSuperclass  (0) 2022.06.13
다대일 양방향 [N:1, 1:N] 관계  (0) 2022.06.13
연관관계 편의 메소드(part.1)  (0) 2022.06.12
고아 객체(feat. orphanRemoval)  (0) 2022.06.12
영속성 전이에 관해(부제 : CASCADE)  (0) 2022.06.11