반응형
- 양방향 매핑
- 지금까지 코딩한 부분은 Member에서 Team으로는 갈 수 있지만 반대로 Team에서 Member로는 갈 수 없다.
- 근데 사실, 양 쪽은 왔다갔다 할 수 있어야 한다. 그렇게 만들면 양방향 연관관계라고 한다.
- 테이블의 연관관계는 외래키 하나로 양방향이 다 있는 것이다. 사실, 테이블의 연관관계는 방향이랄 게 없다. 외래키를 넣으면 된다.
- 문제는 객체이다.
- Team에서 Member로 갈 수 없는 문제가 있다.
- 어떻게 해결하나?
- Team에 List members를 넣어주면 된다.
- 어떻게 해결하나?
@OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<Member>();
- @OneToMany일대다
- mappedBy = "team"나는 team으로 매핑이 되어있다.
@ManyToOne //다대일 @JoinColumn(name = "TEAM_ID") private Team team;
- team은 다대일로 되어있다.
List<Member> members = findMember.getTeam().getMembers(); for (Member m : members) { System.out.println("m.getUsername() = " + m.getUsername()); }
- 이제 출력을 하면 m.getUsername() = member1 가 나온다.
- 양방향이 좋나?
- 객체는 단방향이 좋다.
- 양방향은 신경쓸 게 많아진다.
- Team findTeam = findMember.getTeam();
- (mappedBy) 가 중요하다.
- 객체와 테이블간에 연관관계를 맺는 차이를 이해하자.
- 회원 > 팀, 팀 > 회원 이렇게 두 개의 연관관계가 있다. (단방향 연관관계가 두 개가 있다고 볼 수 있다.)
- 테이블 관점에서 보면 외래키를 통해 양방향 연관관계를 유지할 수 있다.
- 객체 관점에서 보면 연관되는 참조값이 양쪽에 다 있어야 한다. 즉, 단방향이 두 개가 있는 것이다.
- 객체의 양방향은 진짜 양방향이 아니라 단방향이 두 개인 것 뿐이다.
- 문제가 생기는 부분?
- 테이블에 걸려있는 FK(외래키)와 참조하기 만든 객체 둘 중 어느 것으로 외래키를 관리해야 하는지에 대한 문제가 생긴다.
- 즉, item 연관관계 매핑 vs members 연관관계 매핑에 대한 문제.
- 테이블에 걸려있는 FK(외래키)와 참조하기 만든 객체 둘 중 어느 것으로 외래키를 관리해야 하는지에 대한 문제가 생긴다.
- 둘 중 하나로 외래키를 관리하긴 해야 한다.
- 이때 사용되는 게 연관관계 주인(Owner)이다.
- 연관관계의 주인(Owner)
- 양방향 매핑 규칙
- 객체의 두 관게 중 하나를 연관관계의 주인으로 지정한다.
- Owner만이 외래키를 관리한다.
- 등록 및 수정
- Owner가 아니라면 읽기만 가능하다.
- Owner는 mappedBy 속성을 사용하지 않는다.
- mappedBy 자체가 내가 ~에 대해 매핑 되었어.라는 뜻이라 주인이 안 된다.
- Owner가 아니면 mappedBy 속성으로 주인을 지정해 줘야한다.
- 누구를 주인으로 해야 하나?
- 외래키가 있는 곳을 주인으로 해야 한다.
- DB 입장에서 보면 외래키가 있는 곳(Owner)이 무조건 다(ManyToOne), 없는 곳이 일(OneToMany)로 다대일이 된다.
- 연관관계 주인은 비즈니스적으로 중요하지는 않다.
- 이해가 잘 안 되는 부분이 있어 질문을 남겼다.
Team 테이블에서 @GeneratedValue 를 통해 pk를 설정하고, Member 테이블에서 mappedBy로 Team team에 fk를 준 뒤 Team에서도 단방향으로 연관관계를 맺을 수 있게 List members를 생성해서 양방향 연관관계를 형성했고, 그 중심은 mappedBy로 fk를 설정해 준 Team team이다.
- 양방향 매핑 규칙
반응형
'Data Base > JPA' 카테고리의 다른 글
[JPA] : 연관관계 매핑 시작하기 (0) | 2022.04.09 |
---|---|
[JPA] : 양방향 연관관계와 연관관계의 주인(Owner)에 대한 주의점 (0) | 2022.04.08 |
[JPA] : 연관관계 매핑 기초 (0) | 2022.04.06 |
[JPA] : 기본 매핑하기 (0) | 2022.04.06 |
[JPA] : 기본 키 매핑 (0) | 2022.04.05 |
댓글