본문 바로가기
Back-End/자바 ORM 표준 JPA 프로그래밍

[JPA] 자바 ORM 표준 JPA 프로그래밍_6장

by ChaSso 2023. 6. 20.

6장 다양한 연관관계 매핑

∘ 엔티티의 연관관계를 매핑할 때 고려할 것

  - 다중성 : 다대일, 일대다, 일대일, 다대다

  - 단방향, 양방향

  - 연관관계의 주인 : 외래 키 

 

6.1 다대일

∘ 데이터베이스 테이블의 일, 다 관계에서 외래 키는 항상 다쪽에 있음 ⇒ 연관관계의 주인은 다쪽

 

6.1.1 다대일 단방향 [N:1]

∘ 회원은 팀 참조 가능 & 팀은 회원 참조 불가능 ⇒ 다대일 단방향

@JoinColumn으로 외래키 관리

 

6.1.2 다대일 양방향 [N:1, 1:N]

양방향은 외래 키가 있는 쪽이 연관관계의 주인

  - 주인이 아닌 필드는 조회와 객체 그래프 탐색에 사용됨

양방향 연관관계는 항상 서로를 참조함

  - 편의 메소드 작성

    - 양쪽에 편의 메소드를 작성하는 경우 무한루프에 빠지지 않도록 주의

 

 

6.2 일대다

∘ 엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션 Collection, List, Set, Map 중 하나를 사용

 

6.2.1 일대다 단방향 [1:N]

∘ 하나의 팀은 여러 회원을 참조할 수 있음

∘ 일대다 단방향 관계를 매핑할 때는 조인으로 매핑하지 않도록 @JoinColumn을 명시해야 됨

∘ 매핑한 객체가 관리하는 외래 키가 다른 테이블이 있다는 단점이 있음

  ⇒ 엔티티 저장하고 연관관계를 처리하려면 UPDATE SQL이 추가로 필요

∘ 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하는 것이 좋음

  - 관리하는 키가 본인 테이블에 있도록

 

6.2.2 일대다 양방향 [1:N, N:1]

∘ 일쪽이 연관관계의 주인인 일대다 양방향 매핑은 없음

∘ 다쪽이 연관관계의 주인인 다대일 양방향 매핑 사용

∘ @One to Many는 연관관계의 주인이 될 수 없음

∘ 일대다 단방향 매핑 반대편에 다대일 단방향 매핑을 읽기 전용으로 추가해서 일대다 양방향처럼 보이도록 만들 수는 있지만, 일대다 단뱡향 매핑의 단점은 보완되지 않음

 

 

6.3 일대일 [1:1]

∘ 일대일 관계는 주 테이블이 외래 키를 가질 수도 있고 대상 테이블이 외래 키를 가질 수도 있음

 

∘ 주 테이블이 외래 키를 가지는 경우

  - 외래 키를 객체 참조와 비슷하게 사용할 수 있음

  - 주 테이블만 확인해도 대상 테이블과의 연관관계를 알 수 있음

∘ 대상 테이블이 외래 키를 가지는 경우

  - 테이블 관계를 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있음

 

6.3.1 주 테이블에 외래 키

∘ 일대일 관계를 구성할 때 객체지향 개발자들이 선호하는 방식

 

∘ 단방향

  - @OneToOne 사용

∘ 양방향

  - 주 테이블의 Member.locker를 연관관계의 주인으로 설정

  - 대상 테이블에 mappedBy 표시

 

6.3.2 대상 테이블에 외래 키

∘ 단방향

  - 대상 테이블에 외래 키가 있는 일대일 단방향은 JPA에서 지원하지 않음

∘ 양방향

  - 양방향을 만들고 대상 엔티티를 연관간계의 주인으로 만듦

 

 

6.4 다대다 [N:N]

∘ 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음

∘ 다대다는 일대다와 다대일을 사용해서 표현

  - 두 테이블 사이에 연결 테이블을 추가

 

6.4.1 다대다: 단방향

∘ @ManyToMany와 @JoinTable을 사용해서 연결 엔티티 없이 매핑 가능

∘ @JoinTable의 속성 : name, joincolumn, inverseJoinColumns

 

6.4.2 다대다: 양방향

∘ 역방향도 @ManyToMany를 사용하므로 한 쪽에 mappedBy를 적어서 연관관계의 주인 설정

∘ 편의 메소드를 추가해서 관리하는 것이 편리함

 

6.4.3 다대다: 매핑의 한계와 극복, 연결 엔티티 사용

∘ @ManyToMany는 편리함을 제공하지만 실무에서 사용되기에는 한계가 있음

  - 연결 테이블에 담기는 데이터, 컬럼이 많기 때문

∘ 컬럼을 추가하면 @ManyToMany는 더이상 사용 불가

∘ 연결 엔티티를 만들고 다대다를 일대다와 다대일로 풀어야 됨

 

∘ 복합 기본 키

  - 별도의 식별자 클래스로 만들어야 됨

  - Serializable을 구현해야 됨

  - equals와 hashCode 메소드를 구현해야 함

  - 기본 생성자가 있어야 함

  - 식별자 클래스는 public

  - @IdClass를 사용하는 방법 외에 @EmbeddedId를 사용하는 방법도 있음

 

∘ 식별 관계 : 부모 테이블의 기본 키를 받아서 자신의 기본 키 + 외래 키로 사용하는 것

∘ 복합 기본 키를 사용하면 ORM 매핑에서 처리할 일이 많아짐

 

6.4.4 다대다: 새로운 기본 키 사용

∘ 데이터베이스에서 자동으로 생성해주는 대리 키를 Long 값으로 사용하는 것이 좋음

  - 간편, 거의 영구히 사용 가능, 비즈니스에 의존하지 않음

  - ORM 매핑할 때 복합 기본 키를 만들지 않아도 됨

 

6.4.5 다대다 연관관계 정리

∘ 식별 관계 : 받아온 식별자를 기본 키 + 외래 키로 사용

∘ 비식별 관계 : 받아온 식별자를 외래 키로만 사용하고 새로운 식별자 추가

  - 복합 기본 키를 위한 식별자 클래스를 만들지 않아도 됨, 편리함