연관관계_일대다(1:N)

Soo·2024년 6월 20일

Spring Data JPA

목록 보기
12/13

일대다(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에서 외래키를 관리하고 있다.

그럼 teammember를 추가할 때 이상한 일이 벌어진다.

insert 두 번은 team과 member를 저장하는 쿼리이고, 그런데 갑자기 이상한 update 쿼리가 하나가 보인다.

외래키를 "다"쪽에서 관리했다면 insert 쿼리 두 번만 나가고 끝났을 텐데 "일"쪽에서 외래키를 관리하기 때문에 어쩔 수 없이 옆 Member테이블에 update를 해서 외래키를 업데이트해줘야 하는 상황이 생긴 것이다.

일대다 단방향 정리

일대다 단방향 매핑의 단점

  • 외래 키 관리의 어려움: 외래 키가 자식 테이블에 존재하기 때문에 부모 엔티티의 삽입, 삭제, 업데이트 시에 외래 키 관리가 어려울 수 있습니다.

그래서 일대다보다는 다대일 양방향으로 풀어서 연관관계를 맺어주는 것이 좋다.

0개의 댓글