Ep5. 다양한 연관관계 매핑

yumyeonghan·2023년 2월 5일
0

JPA

목록 보기
5/10

🍃이 글은 inflearn에서 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵을 학습하고 작성한 것입니다.🍃

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

  • 다중성 (양방향에서 앞 글자에 해당하는 엔티티가 연관관계 주인, 외래키 매핑이 된다.)

    • 대일: @ManyToOne
    • 대다: @OneToMany
    • 대일: @OneToOne
    • 대다: @ManyToMany
  • 단방향, 양방향

  • 양방향 연관관계의 주인

다대일 [N:1]

  • 다대일 단방향

    • 외래키가 있는 쪽에 @ManyToOne, @JoinColumn을 설정한다.
  • 다대일 양방향

    • 외래키가 있는 쪽이 연관관계의 주인이다.
    • 반대편은 mappedBy 적용한다.

일대다 [1:N]

  • 단점

    • 엔티티가 관리하는 외래 키가 다른 테이블에 있다.
    • 연관관계 관리를 위해 다른 테이블에서 추가 UPDATE SQL이 실행된다.
  • 일대다 단방향, 양방향 매핑보다는 참조가 필요 없더라도 추가해서 다대일 양방향 매핑을 사용하자.

일대일 [1:1]

  • 일대일 관계는 그 반대도 일대일

  • 1:1이므로 외래키에 데이터베이스 유니크 제약조건 추가해야한다.

  • 일대일 단방향

    • 외래키가 있는 쪽에 @OneToOne, @JoinColumn을 설정한다.
  • 일대일 양방향

    • 외래키가 있는 쪽이 연관관계의 주인이다.
    • 반대편은 mappedBy 적용한다.
  • 대상 테이블에 외래키가 존재할 수 있다.

    • 매핑 방법은 주 테이블에 외래키가 존재하는 것과 같다.
    • 주 테이블에 외래키가 존재하는 것이 객체지향적이다.

다대다 [N:M]

- @ManyToMany는 테이블을 단순히 연결할 뿐, 필요한 컬럼들을 추가할 수 없어서 사용하지 않는다.

그러면 다대다 상황에서는 어떻게 해야 할까?

    1. 연결 테이블용 엔티티를 추가한다.
    1. @ManyToMany -> @OneToMany, @ManyToOne
@Entity
public class MemberProduct {

  @Id @GenerateValue
  private Long id;

  @ManyToOne
  @JoinColumn(name = "MEMBER_ID")
  private Member member;

  @ManyToOne
  @JoinColumn(name = "PRODUCT_ID")
  private Product product;

  // 원하는 컬럼 추가 가능
}
  • 연결 테이블용 엔티티
  • @ManyToOne
  • pk는 의미 없는 값을 사용한다. (유연성)

@Entity
public class Product {

  @Id @GenerateValue
  private Long id;

  @OneToMany(mappedBy = "product")
  private List<MemberProduct> memberProducts = new ArrayList<>();
}
  • @OneToMany

@Entity
public class Member {

  @Id @GenerateValue
  private Long id;

  @OneToMany(mappedBy = "member")
  private List<MemberProduct> memberProducts = new ArrayList<>();
}
  • @OneToMany

참고: 실무에서 엔티티를 생성할 때 생성자 패턴이나 자바 빈 패턴(setter)을 사용하지 않고, 빌더 패턴을 사용한다.

profile
웹 개발에 관심 있습니다.

0개의 댓글