728x90
일대다(1:N)
한 엔티티의 인스턴스가 다른 엔티티의 여러 인스턴스와 연관되는 관계
예) 한 명의 작가가 여러 권의 책을 쓸 수 있는 경우
'일' 쪽에서 외래키를 관리
객체입장에서 TEAM에서 외래키를 관리, 데이터베이스는 '다' 쪽에서 외래키를 관리한다.
Team
@Entity
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
위 코드를 보면 일대다 관계에서 '일'인 TEAM에서 @JoinColumn(name = "TEAM_ID")
을 통해서 외래키를 관리한다.
그렇게 되면 어떤 문제가 발생하는가?
JPA를 사용해서 Team에서 외래키를 관리한다고 해도, DB의 정책상 '다'인 곳에서 외래키를 관리하게 되어있다. 위 그림을 보면 Member에서 외래키를 관리하고 있다.
그럼 team
에 member
를 추가할 때 이상한 일이 벌어진다.
insert 두 번은 team과 member를 저장하는 쿼리이고, 그런데 갑자기 이상한 update 쿼리가 하나가 보인다.
외래키를 "다"쪽에서 관리했다면 insert 쿼리 두 번만 나가고 끝났을 텐데 "일"쪽에서 외래키를 관리하기 때문에 어쩔 수 없이 옆 Member테이블에 update를 해서 외래키를 업데이트해줘야 하는 상황이 생긴 것이다.
일대다 단방향 정리
일대다 단방향 매핑의 단점
- 외래 키 관리의 어려움: 외래 키가 자식 테이블에 존재하기 때문에 부모 엔티티의 삽입, 삭제, 업데이트 시에 외래 키 관리가 어려울 수 있습니다.
그래서 일대다보다는 다대일 양방향으로 풀어서 연관관계를 맺어주는 것이 좋다.
728x90