JPA - 다대일, 일대다, 다대다 매핑

2023. 5. 11. 20:52·Back-End/JPA

참고

해당 글은 김영한님의 자바 ORM 표준 JPA를 공부하며 작성한 글입니다.

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

 

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

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

www.inflearn.com

 

다대일[N:1]

다대일 단방향

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

다대일 양방향

  • ‘다(many)’ 쪽에 외래 키가 가게되고, 연관관계의 주인이 된다.
  • 양쪽을 서로 참조하도록 개발한다.

일대다[1:N]

일대다 단방향

  • 테이블 일대다 관계는 항상 항상 다(N)쪽에 외래키가 있으므로, 객체와 테이블의 차이때문에 반대편 테이블의 외래 키를 관리하게 되는 특이한 구조가 생겨나게 된다.
  • @JoinColumn 을 꼭 사용해야 한다. 그렇지 않으면 조인 테이블 방식을 사용한다.
    → 테이블과 테이블 사이의 중간테이블이 생성됨

단점

  • 엔티티가 관리하는 외래 키가 다른테이블에 존재하게 되고, 이로 인한 연관관계 관리를 위해 UPDATE SQL이 추가로 실행되게 되므로 성능 저하가 일어날 수 있다.
  • 일대다 단방향 매핑보다 다대일 양항뱡 매핑을 사용할 것.

일대다 양방향

  • 공식적으로 존재 하지 않는 매핑
  • @JoinColumn(insertable=false, updatable=false) → 다른 컬럼과 조인을 하되, 값을 넣거나 업데이트를 막아서 읽기 전용 속성으로 만들어 강제적으로 연관관계의 주인이 되지 못하게 하는 방법이다.
  • 다대일 양방향을 사용할 것

일대일[1:1]

특징

  • 일대일 관계는 그 반대도 일대일 인 대칭적인 관계이다. → 일대다, 다대일과 다르게 주 테이블과 대상 테이블 중 아무대나 외래키가 존재 해도 된다.
    • 주 테이블에 외래키가 있는경우
    • 대상 테이블에 외래 키가 있는경우
  • 보통 외래 키애 데이터베이스 유니크(UNI) 제약조건이 있어야 일대일 관계가 성립이 가능하다. (유니크 제약조건이 없는경우 관리가 매우 어렵기 때문)

일대일 : 주 테이블에 외래키 단방향 및 양방향

  • 다대일(@ManyToOne) 매핑과 매우 비슷하다.
  • 다대일과 마찬가지로 반대편은 mappedBy를 적용한다.

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

  • 단방향 관계는 JPA에서 지원하지 않는다.
  • 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같다.

일대일 매핑 정리

주 테이블에 외래 키가 있는 경우

  • 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾는다.
  • 객체지향 개발자 선호
  • JPA 매핑 편리
  • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
  • 단점 : 값이 없으면 외래 키에 null 허용

대상 테이블에 외래 키가 있는 경우

  • 대상 테이블에 외래 키가 존재
  • 전통전인 데이터베이스 개발자 선호
  • 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경시 테이블 구조가 유지된다.
  • 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨

다대다 [N:M]

관계형 데이터베이스에서는 정구화된 테이블 2개로 다대다 관계를 표현할 수 없으므로, 중간에 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내게 된다.

  • @ManyToMany 를 사용하고, @JoinTable로 연결 테이블을 지정한다.

다대다 매핑의 한계

  • 연결 테이블에서는 단순히 연결만 하고 끝나지 않고, 멤버와 상품간 매핑시 주문시간, 수량같은데이터가 들어 갈 수 있다.

한계 극복

  • 연결 테이블용 엔티티를 추가 (연결 테이블을 엔티티로 승격)
  • @ManyToMany → @OneToMany, @ManyToOne

정리

@JoinColumn

  • 왜래키 매핑시 사용
     
속성 설명 기본값
name 매핑할 외래 키 이름 필드명
referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본키 컬럼명
foreignKey(DDL) 외래 키 제약조건을 직접 지정
테이블을 생성할때만 사용
 
unique
nullable insertable
updatable
columnDefinition
table
@Column의 속성과 같음  

@ManyToOne

  • 다대일 관계 매핑
     
속성 설명 기본값
optional false로 설정시 연관 엔티티가 항상 존재해야 함 TRUE
fetch 글로벌 페치 전략을 설정 - @ManyToOne : FetchType.EAGER
- @OneToMany : FetchType.Lazy
cascade 영속성 전이 기능을 사용  
targetEntity 연관된 엔티티의 타입 정보 설정  
거의 사용하지 않음    

@OneToMany

  • 일대다 관계 매핑
     
속성 설명 기본값
mappedBy 연관관계의 주인 필드를 선택 TRUE
fetch 글로벌 페치 전략을 설정 - @ManyToOne : FetchType.EAGER
- @OneToMany : FetchType.Lazy
cascade 영속성 전이 기능을 사용  
targetEntity 연관된 엔티티의 타입 정보 설정
거의 사용하지 않음
 

다대다 매핑은 일대다, 다대일로 풀어내자

  • 중간테이블 대신 중간 엔티티를 만들어서 사용
  • @ManyToMany 대신 중간테이블에 @OneToMany, @ManyToOne 를 이용해서 매핑하기
반응형
저작자표시 (새창열림)
'Back-End/JPA' 카테고리의 다른 글
  • JPA - @MappedSuperclass, BaseEntity란?
  • JPA - 상속관계 매핑
  • JPA - DB에 JSON 및 List값 넣기
  • JPA 활용 - 엔티티 매핑 대신 DTO를 사용하는 이유
LightSource
LightSource
어제보단 발전한 오늘의 나를 위한 블로그
    반응형
  • LightSource
    LightSourceCoder
    LightSource
  • 전체
    오늘
    어제
    • 분류 전체보기 (152)
      • Git (4)
      • Language (6)
        • Java (6)
      • Back-End (63)
        • Spring Boot (4)
        • MyBatis (1)
        • Oracle (1)
        • PL SQL (3)
        • JPA (26)
        • Spring Data JPA (5)
        • Spring MVC (8)
        • Spring (12)
        • Spring Security (2)
        • Redis (1)
      • Front-End (38)
        • 아이오닉 (2)
        • JSP (7)
        • JavaScript (4)
        • React (16)
        • TypeScript (3)
        • Angular (6)
      • AWS (1)
      • CI & CD (1)
      • 개발지식 (13)
        • 네트워크 (9)
        • CS 지식 (4)
      • 데이터모델링 (2)
      • Tool (1)
      • 프로젝트 (5)
      • 독후감 (2)
      • 잡생각 (0)
      • 면접 준비 (1)
      • 알고리즘 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배요소열추가
    리액트
    react
    배열요소삭제
    배열요소수정
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
LightSource
JPA - 다대일, 일대다, 다대다 매핑
상단으로

티스토리툴바