[JPA] 연관관계 매핑

yookyungmin·2023년 8월 24일
0

연관관계 매핑

  • 객체의 참조와 테이블의 외래키를 매핑하는 것을 말한다.

연관관계 고려할 점

  • 방향 : 단방향(한 객체에서 다른 객체만 참조), 양방향(두 객체가 서로 참조하는 관계)
  • 다중성 : 일대다(1:N, OneToMany), 다대일(N:1, ManyToOne), 일대일(1:1, OneToOne),
    다대다(N:N, ManyToMany)
  • 연관관계의 주인 : 두 객체 중 하나를 외래 키를 관리해야 한다. 외래키를 관리하는 객체를 연관관계의 주인이라 한다. (양방향)

단방향, 양방향

  • DB 테이블은 외래키 하나로 양쪽 테이블 조인이 가능하지만 객체는 참조용 필드가 있는 객체만 참조가 가능하다.
  • 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면양방향
  • @JoinColumn 에 해당하는 컬럼은 FK 가 있는 컬럼을 의미한다.
    따라서 name = "FK컬럼명" 을 매핑해주면 된다
  • 일대다 : 다대일 -1:N, N:1 - 에서 연관관계의 주인은 항상 '다' 쪽이 외래키를 갖고,
    '다' 쪽이 연관관계의 주인이 된다

다대일 N:1

단방향

  • 가장 흔하고, 가장 많이 사용되는 다중성
  • 다대일의 반대는 일대다 N:1 -> 1:N

양방향

  • 외래키가 있는 쪽이 양방향의 연관관계 주인
  • 관계가 N인 쪽에서 항상 연관관계 주인
  • 양쪽을 서로 참조 하도록 개발 - > 단방향이 2개

일대다 1:N

단방향

  • 일대다 단방향은 일대에서 일(1) 쪽이 연관관계의 주인이 됨.
  • 테이블 일대다 관계는 항상 다(N) 쪽에 외래키가 있음
  • 객체와 테이블 차이 대문에 반대편에서 테이블의 외래키를 관리하는 특이한 구조
    -@JoinColumn 을 꼭 사용해야함(중간에 테이블이 하나 추가됨)

  • 엔티티가 관리하는 외래키가 다른 테이블에 존재
  • 연관관계 관리를 위해 추가로 update SQL이 실행됨
  • 따라서 일대다 단방향보다는 다대일 양방향 매핑을 사용이 권장된다.

양방향

  • 사실 양방향 일대다 매핑은 공식적으로 존재하지 않는다.
  • 연관관계의 주인이 아닌 쪽에서 @JoinCoulum(insertable = false, updatetable=false)를 사용 => 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법
  • 다대일 양방향을 사용합시다

일대일 1:1

단방향

  • 일대일 관게는 반대도 일대일
  • 주 테이블이나 대상 테이블 중 외래키 선택가능 => 외래키가 있는곳이 연관관계 주인
  • DB에 외래키 제약조건에 유니크 제약조건이 꼭 필요함 => 다대일에서 FK에 유니크 제약조건이 추가된 경우
    회원-회원 사물함의 관계 1:1

양방향

  • 다대일 양방향 매핑과 동일하게 FK가 있는 곳이 연관관계의 주인
  • 반대편은 mappedBy 적용

다대다 N:M(실무에서 사용X)

@ManyToMany를 를 사용하면 편리한점

  • 도메인 모델이 단순, 연결 테이블을 자동으로 생성 및 설정

실무에서의 한계점

  • 연결 테이블은 단순히 연결만 하고 끝나지 않습니다.
  • 연결 테이블에 추가 정보를 필요로 할때가 있습니다.

한계 극복

  • @ManyToMany를 @ManyToOne가 @OneToMany를 활용하여 일대다, 다대일 관계로 풀어준다

출처 : 자바 ORM 표준 jpa 프로그래밍 기초

0개의 댓글