Player, Team(多:1)라는 2개의 Table이 있다고 하자.
DB는 Foreign Key(FK) 하나로만 Table들의 연관 관계를 만든다.(FK로 JOIN연산을 통해서)
그러나 클라이언트 코드에서는 2개의 객체 사이의 연관 관계를 맺기 위해서는
Player 객체에 Team객체를 가리키는 참조 변수와
Team 객체에 Player 객체를 가리키는 참조 변수(List<Player> players),
즉 2개의 참조변수가 선언돼서, 서로가 서로를 가리키도록 해줘야 한다.
==========================================================
DB의 Table : Foreign Key(FK) 하나로만 Table들의 연관 관계를 만든다
객체 : 2개의 참조변수가 선언돼서, 서로가 서로를 가리키도록 해줘야 한다.
==========================================================
위 2가지 특징 때문에 딜레마가 생긴다.
DB의 Table은 FK를 하나만 가진다(이 글에서는 Player Table에서 FK를 가지고 있고, Team Table을 가리키고 있다고 하자. 그리고 보통 1:多의 관계에서는 多쪽의 객체의 참조변수를 FK로 설정을 하므로, Player 객체의 Team 참조 변수를 @JoinColumn으로 설정했다고 하자.)
그러면 참조 변수는 2개인데, 어느 참조 변수를 기준으로 FK를 업데이트시켜야 하는가?
솔직히, 어느 쪽을 기준으로 하여도 DB 입장에서는 상관이 없다. ( JOIN 연산을 해버리면 되기 때문 )
그러나 실무에서는 이 딜레마에 대한 1가지 가이드 라인이 존재한다.
-> FK를 가지고 있는 객체의 참조변수를 기준으로 해서 FK값을 업데이트 시킨다.(Player의 team 참조변수를 연관관계의 주인으로 정함)
고로, 이 예제에서는 Player Table이 연관관계의 주인이며, 이를
@OneToMany(mappedBy = "player")을 Team객체의 List players 참조변수에 붙여 줘서, 연관 관계의 주인이 아님을 나타냄과 동시에 Team 객체의 List<Players> 참조 변수에 변화가 있어도, DB Table의 FK값에는 아무런 영향을 주지 않게 된다.
@JoinColumn(name= "TEAM_ID")을 Player 객체의 Team 참조 변수에 붙여 주므로, 연관 관계 주인을 Player 객체의 Team 참조변수로 하여, DB의 FK값은 Team 참조 변수를 기준으로 변경이 된다.
연관 관계의 주인은, @JoinColumn으로 설정을 한다. 고로, DB Table은 Player 객체의
Team객체의 List<Player> players 참조변수에 붙여 줌으로써
연관 관계의 주인을 설정한다)
참고로, 연관 관계의 주인의 설명을 쉽게 하기 위하여, 양방향의 예시를 들었지만, 단방향에서도 연관 관계의 주인은 존재
한다.
연관 관계의 주인은 단지, DB Table의 하나 있는 FK값을 어느 참조 변수를 기준으로 UPDATAE시키는지에 대한 문제이다.
'CS 과목(CS科目) > 데이터 베이스(データベース)' 카테고리의 다른 글
페이징(Paging) (0) | 2023.04.21 |
---|---|
DB 설계 시, 多 관계에 있는 Table에 FK가 있어야 하는 이유 (0) | 2023.04.12 |
ORM 프레임워크를 사용하는 이유(ex. JPA..) (0) | 2023.04.04 |
28. NoSQL( MongoDB, Redis, etc ) (0) | 2023.03.09 |
27.DBCP(DB Connection Pool) (0) | 2023.03.09 |