다양한 연관관계 매핑

이상훈·2022년 10월 4일
0

Jpa

목록 보기
5/17

김영한님의 인프런 강의 '자바 ORM 표준 JPA 프로그래밍'을 참고했습니다.

다대일 [N:1]

다대일 단방향

가장 많이 사용하는 연관관계 👍


다대일 양방향

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

@ManyToOne

속성설명기본값
Optionalfalse로 설정하면 연관된 엔티티가 항상 있어야 한다.TRUE
fetch글로벌 페치 전략을 설정한다.FetchType.EAGER
cascade영속성 전이 기능을 사용한다.

일대다[1:N]

일대다 단방향

  • 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인

  • 테이블 일대다 관계는 항상 다(N) 쪽에 외래 키가 있음

  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하
    는 특이한 구조

  • 엔티티가 관리하는 외래 키가 다른 테이블에 있어서 추가로 UPDATE SQL을 실행하므로 성능이 떨어짐

일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자.


일대다 양방향

  • JPA에서 공식적으로 지원 안함

  • 야매로 하는 법 (insertable, updatable 활용)이 있지만 권장 X

    다대일 양방향을 사용하자


OneToMany

속성설명기본값
mappedBy연관관계의 주인 필드를 선택한다.
fetch글로벌 페치 전략을 설정한다.FetchType.LAZY
cascade영속성 전이 기능을 사용한다.

일대일[1:1]

주 테이블이나 대상 테이블 중에 외래 키 선택 가능.
여기서 주 테이블이란 주로 access하는 테이블을 의미.
외래 키에 데이터베이스 유니크(UNI) 제약조건 추가.

주 테이블에 외래 키 단방향

  • 다대일 단방향 매핑과 유사

주 테이블에 외래 키 양방향

  • 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인

대상 테이블에 외래 키 단방향

단방향 관계는 JPA가 지원 안함


대상 테이블에 외래 키 양방향

  • 사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같음

주 테이블 VS 대상 테이블

  • 주 테이블에 외래 키
    • 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음
    • 객체지향 개발자 선호
    • 장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능, JPA 매핑 편리
    • 단점: 값이 없으면 외래 키에 null 허용
  • 대상 테이블에 외래 키
    • 대상 테이블에 외래 키가 존재
    • 전통적인 데이터베이스 개발자 선호
    • 장점: 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
    • 단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨(프록시는 뒤에서 설명)

김영한 선생님께서는 주 테이블에 외래 키 단방향 선호. BUT 정답은 없음. DBA분과 잘 협의해야 함🤝.


다대다[N:M]

관계형 데이터베이스는 객체와 달리 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.


JPA는 중간에 연결 테이블을 자동으로 처리해 주는 @ManyToMany를 지원해 주지만

* @ManyToMany연결 테이블에 컬럼을 추가할 시 매핑이 깨진다는 단점이 있어서 실무에서는 사용하지 않는다.

🤔 why -> 주문 엔티티나 상품 엔티티에는 추가한 컬럼들을 매핑할 수 없어서.



따라서 위 그림처럼 연결 테이블을 매핑하는 연결 엔티티를 만들고 다대다에서 일대다, 다대일 관계로 풀어야 한다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글