JPA 다양한 연관관계 매핑

이상민·2021년 11월 9일
0

JPA

목록 보기
5/8
post-thumbnail

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

  • 다중성

    • 다대일
    • 일대다
    • 일대일
    • 다대다 : 실무에서 쓰면 안된다
  • 단방향 양방향

    • 테이블 : 외래 키로 조인하기에 방향 개념이 없다
    • 객체 : 객체의 양방향 참조는 사실 두개의 단방향 참조이다
  • 연관관계 주인

    • 외래 키를 관리하는 참조. 반대편은 외래 키에 영향을 주지 않는다

일대다

  • 일대다 단방향 관계를 맺고 싶다면?

    • 가능하다. 아래처럼 연관관계를 설정해야한다

    • 하지만 외래키가 멤버에 있어 멤버 테이블에 대한 쿼리가 발생하기 때문에 헷갈릴 수 있다

    • 단뱡향만 필요해도 그냥 양방향으로 설정하자

@Entity
public class Team {
    ...
    
    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members = new ArrayList<>();
    
    ...
}
  • 일대다 양방향 관계는 스펙 상 지원하지 않는다. 억지로 아래처럼 할 수는 있다
    • 그냥 다대일 양뱡향을 이용하자
@Entity
public class Team {
    ...
    
    @ManyToOne
    // JoinColumn이 양쪽에 연결돼 JPA가 연관관계 주인을 알 수 없기 때문에 
    // insertable, updatable을 false로 설정한다 
    @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false)
    private Team team;
    
    ...
}

일대일

  • 외래 키를 아무 테이블에나 넣을 수 있다

  • 외래 키에 유니크 제약을 추가해 보장할 수 있다

  • 다대일 단뱡향과 비슷하다

@Entity
public class Member {
    ...
    
    @OneToOne
    @JoinColumn(name = "LOCKER_ID)
    private Locker locker;
    
    ...
}
  • 대상 테이블에 외래키 단방향 관계를 설정할 수는 없다. 무조건 연관관계 주인과 외래 키를 가진 테이블을 일치 시키자

  • 주 테이블에 외래 키 vs 대상 테이블에 외래 키

    • 주 테이블에 외래 키

      • 더 객체지향 적이다
      • 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
      • 단점 : 값이 없으면 외래 키에 null 허용
    • 대상 테이블에 외래키

      • 더 관계형 스럽다
      • 장점 : 관계를 일대다로 변경해도 테이블 구조 유지
      • 단점 : 프록시 기능 한계로 지연 로딩이 불가

다대다

  • 쓰면 안된다. RDB는 매핑 테이블 없이는 다대다 관계를 표현할 수 없다. 따라서 중간 테이블이 필요한데, 실제로 테이블이 단순히 연결만 하는 경우는 없기 때문에 (하다 못해 생성일자라도 들어간다) 실무에서 사용하기 부적합하다.
@Entity
public class Member {
    ...
    
    @ManyToMany
    @JoinTable(name = "MEMBER_PRODUCT")
    private List<Product> products = new ArrayList<>();
    
    ...
}

@Entity
public class Product {
    ...
    
    @ManyToMany(mappedBy = "products")
    private List<Member> members = new ArrayList<>();
    
    ...
}
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글