소나무나무 2021. 7. 24. 18:34

다대일(N:1) 관계

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

일대다(1:N) 관계

  • 일(1)이 연관관계 주인
  • 일대다 관계는 항상 다 쪽에 외래키가 존재
  • 객체와 테이블의 차이 때문에 반대편 테이블에서 외래키를 관리하는 구조
  • @JoinColumn을 꼭 사용해야함. 그렇지 않으면 중간에 테이블을 하나 추가함
  • 단점
    • 엔티티가 관리하는 외래키가 다른 테이블에 있음
    • 추가로 Update sql를 실행해야함
  • 다대일 양방향 매핑을 사용하자

일대다 양방향 매핑

  • 공식적으로 존재하지 않는 매핑
  • @ManyToOne에는 mappedBy가 없어서 대신 @JoinColumn(insertable=false, updatable=false)를 사용하여 읽기 전용 필드 만듬
  • 그냥 다대일 양방향 사용하자

일대일(1:1) 관계

  • 일대일 관계는 그 반대도 일대일
  • 주 테이블이나 대상 테이블 중에 외래키 선택 가능
  • 외래키에 유니크 제약조건 추가한 것
  • 주 테이블 외래키 단방향 관계 O, 대상 테이블 외래키 단방향 관계 X

주테이블에 외래키


  • 주 객체가 대상 객체의 참조를 가지는 것처럼, 주 테이블에 외래키를 두고 대상테이블 찾음
  • 외래키가 있는 곳이 연관관계 주인이고 반대편은 mappedBy 적용
  • 객체지향 개발자가 선호
  • 장점
    • 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능(성능)
    • JPA 매핑 편리
  • 단점
    • 값이 없으면 외래키에 NULL 허용

대상 테이블에 외래키

  • 대상 테이블에 외래키가 존재
  • 대상 테이블에서 외래키 단방향을 사용하려면 양방향이 필수
  • DBA가 선호
  • 장점
    • 주 테이블과 대상 테이블을 일대일에서 일대다로 변경할 때 테이블 구조 유지(확장 용이)
  • 단점
    • 지연 로딩으로 설정해도 항상 즉시 로딩됨

다대다(N:M)

  • RDB는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음
  • 객체는 컬렉션을 이용해서 객체 2개로 다대다 관계 가능함
  • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어야함
  • @ManyToMany 사용, @JoinTable 로 연결 테이블 지정
  • 실무에선 사용 X
    • 연결 테이블이 단순 연결만 해서 끝낼 일이 아님(JPA에서 만들어주는데 한계가 있음)
    • 주문시간, 수량 같은 연결 엔티티에만 사용할 수 있는 데이터가 들어갈 수 있음

Member_Product처럼 외래키를 묶어서 기본키로 사용하면 제약조건 추가할 땐 편하지만 유연성이 떨어지고 JPA 매핑이 간결하지 않다. 비즈니스적으로 의미없는 값을 만들어서 기본키로 사용하는 것을 권장한다.