본문 바로가기

자바 ORM 표준 JPA 프로그래밍

다양한 연관관계 매핑(1) (연관관계 매핑 시 고려사항, 다대일, 일대다)

1) 연관관계 매핑 시 고려사항 3가지

(1) 다중성

- 다중성이란 JPA에서 다양한 연관관계 매핑을 제공하는 것을 의미합니다. 

  JPA에서의 모든 어노테이션은 DB와 매핑하기 위해서 존재합니다. 

  사실 다대다는 실무에서 쓰면 안됩니다. 

  가장 많이 쓰는 것은 다대일 @ManyToOne입니다. 

다대일 @ManyToOne
일대다 @OneToMany
일대일 @OneToOne
다대다 @ManyToMany

(2) 단방향, 양방향

- 테이블

-> 테이블은 외래 키 하나로 양쪽으로 조인이 가능합니다. 

    따라서 사실 방향이라는 개념이 없습니다.

 

- 객체

-> 참조용 필드가 있는 쪽으로만 참조가 가능합니다.

    한 쪽만 참조하면 단방향이고, 양쪽이 서로 참조하면 양방향입니다.      

    사실 객체 입장에서 보면, 양방향은 단방향이 2개가 있는 것입니다. 

 

(3) 연관관계의 주인

- 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺습니다. 

  반면, 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데입니다. 

  객체 양방향 관계는 참조가 2군데 있으므로, 

  둘 중 테이블의 외래키를 관리할 곳을 정해야 합니다. 

 

- 즉, 연관관계의 주인은 외래키를 참조하는 것입니다. 

  주인의 반대편은 외래 키에 영향을 주지 않고, 단순 조회만 가능합니다. 

 

 

2) 다대일(N:1)

- 다대일은 JPA에서 가장 많이 사용하고, 꼭 알아야 합니다. 

  다대일의 반대는 일대다 입니다.

 

[다대일 단방향] 

[다대일 양방향]

- 다대일 양방향은 반대쪽에 추가하면 되고,

  반대쪽에 추가한다고 테이블에 영향을 미치지는 않습니다.

  외래 키가 있는 쪽이 연관관계의 주인이며, 

  양쪽을 서로 참조하도록 개발합니다. 

 

3) 일대다(1:N)

[일대다 단방향]

- 여기서는 1이 연관관계의 주인입니다.

   즉, 다쪽에 외래키가 있습니다. 

   단, DB 입장에서는 다 쪽에 외래키가 들어가야 합니다.  

   또한, JoinColumn을 반드시 사용해야 합니다. 

 

3-1) 일대다 단방향 매핑의 단점

(1) 엔티티가 관리하는 외래 키가 다른 테이블에 있습니다

(2) 연관관계 관리를 위해 추가로 UPDATE SQL을 실행해야 합니다. 

-> 결론적으로, 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용해야 합니다. 

 

참고

김영한 자바 ORM 표준 프로그래밍 기본편