자바 ORM 표준 JPA 프로그래밍(인프런)

Ch06. 다양한 연관관계 매핑 - 일대다 [1:N]

webmaster 2021. 12. 13. 09:58
728x90

일대다 단방향

일대다 단방향 연관관계

  • Team을 중심으로 연관관계를 설정한다
  • Team의 members를 변경해 주었을 때 다른 테이블에 있는 Member의 Team_ID가 변경이 된다(좋지 않다)

Team의 일대다 단방향 연관관계 ( 일쪽에서 외래키를 관리)

  • Member에는 Team을 참조하는 변수가 없고 Team에만 Member를 참조하는 변수가 있다

Test

Test

  • 실행을 하게 되면, 쿼리 3번 실행
    • insert member
    • insert team 
    • update member
    • member와 Team의 Insert 후 연관관계를 Update쿼리를 동작시켜 넣어준다(성능상 더 안 좋다)
  • 내 테이블에 외래키가 없기 때문에 member테이블에 update를 해주어야 하고, 관리하기도 힘들어진다.
  • 일대다 단방향을 사용하지 말고 차라리 다대일 양방향을 사용하자
  • 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인
  • 테이블 일대다 관계는 항상 다(N) 쪽에 외래 키가 있음
  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조
  • @JoinColumn을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용함(중간에 테이블을 하나 추가함)

@JoinColume의 하지 않을 경우 mapping 테이블이 생긴다.

  • 중간에 테이블이 생기므로 운영하기가 힘들어진다.

일대다 단점

  • 엔티티가 관리하는 외래 키가 다른 테이블에 있음
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행
  • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자

일대다 양방향

일대다 양방향 연관관계
Member Entity의 team 컬럼을  Insertable 옵션과 updatable 옵션을 false 로 주어 연관관계 주인을 Team의 team 속성이 되도록 한다.

  • insertable = false, updateable = false를 설정해 insert와 update를 안 하는 읽기 전용으로 만든다.
  • 결국 다대일 양방향과 차이가 없다.
  • 이런 매핑은 공식적으로 존재 X
    • @JoinColumn(insertable=false, updatable=false)
  • 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법
  • 다대일 양방향을 사용하자
728x90