본문 바로가기

JPA 프로그래밍

[자바 ORM 표준 JPA 프로그래밍] 다양한 연관관계 매핑 - 다대일, 일대다 ( 1/4 )

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

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

 

- 다중성

  • 데이터베이스 관점에서 매핑하기 위한 어노테이션 이다.
  • 대칭성이 있으므로 역으로 생각하면 편하다.
  • 다대다
    • @ManyToOne
  • 일대다
    • @OneToMany
  • 일대일
    • @OneToOne
  • 다대다
    • @ManyToMany
    • 실무에서 쓰면 안된다.

 

- 단방향, 양방향

  • 테이블
    • 외래 키는 하나로 양쪽 조인 가능
    • 사실 방향이라는 개념이 없음
  • 객체
    • 참조용 필드가 있는 쪽으로만 참조 가능
    • 한쪽만 참조하면 단방향
    • 양쪽이 서로 참조하면 양방향
      • 사실 양방향이라는건 없다.
      • 단방향이 두개가 있는 것이다.

 

- 연관관계의 주인

  • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음
  • 객체 양방향 관계는 A -> B, B -> A 처럼 참조가 2군데
  • 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래키를 관리할 곳을 지정해야함
  • 연관관계의 주인 : 외래 키를 관리하는 참조
  • 주인의 반대편 : 외래 키에 영향을 주지 않음, 단순한 조회만 가능

 

1. 다대일 [ N : 1 ]

  • 가장 많이 사용한다.
  • '다'가 연관관계의 주인이다.

  • 관계형 DB에서는 항상 '다'쪽에 외래키가 들어간다.
  • 아닐 경우에는 설계가 잘못된 것이다.
    • Team에 TEAM_ID가 외래키일 경우 Team을 여러번 Insert할 수 있게 되므로 이상해 진다.

 

2. 일대다 [ 1 : N ]

1) 일대다 단방향

  • '일'이 연관관계의 주인이다.

  • 실무에서는 이 모델을 가져가지 않는다고 한다.
    • 비즈니스 로직을 모두 모른 상태일 때 원치않은 update가 실행되서 고민이 된다.
    • 테이블이 수십개가 엮여 있는 운영에서 힘들다.
    • 필요할 경우 양방향 매핑관계로 설정한다.(다 : 다)
      • 강제로 매핑 추가(객체지향적으로 손해를 본다, 트레이드 오픈)
        • ex. Member에서 Team으로 갈 일이 없지만, 연관관계 추가
  • update 쿼리가 추가로 실행된다.
    •  
      성능상의 단점이 약간 있다.

- 일대다 단방향 정리

  • 일대다 단방향은 일대다( 1:N )에서 일(1)이 연관관계의 주인
  • 테이블 일대다 관계는 항상 다(N) 쪽에 외래키가 있음
  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조
  • @JoinColumn을 꼭 사용해야 함, 그렇지 않으면 조인 테이블 방식을 사용함( 중간에 테이블을 하나 추가함 )
    • 중간에 테이블이 하나 더 들어가니까 운영이 힘들어 진다.
  • 단점
    • 엔티티가 관리하는 외래 키가 다른 테이블에 있음
    • 연관관계 관리를 위해 추가로 UPDATE SQL 실행
  • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자

 

2) 일대다 양방향

  • 스펙상 되는게 아닌 비정상적으로 된다고 한다.
    • insert, update 막아준다.( 읽기전용 )
    • ... // insertable, updatable를 안넣을 경우 연관관계 주인이 양쪽에 설정이 되어 있으므로 // 운영이 힘들어 진다. @ManyToOne @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false) private Team team; ...
  • 다대일 양방향을 사용하자

 

 

출처

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com