• 방향
    • 단방향: 객체의 한 쪽만 참조하는 것
    • 양방향: 객체가 서로 참조하는 것
  • 다중성: N:1, 1:N, 1:1, N:M
  • 연관관계 주인: 객체를 양방향 영관관계로 만들면 연관관계의 주인을 정해야 한다.

단방향 연관관계

  • 객체는 참조(주소)로 연관관계를 맺는다.
  • 테이블은 외래 키로 연관관계를 맺는다.
  • 참조를 사용하는 객체의 연관관계는 단방향이다.
    • A -> B (a.b)
  • 외래 키를 사용하는 테이블의 연관관계는 양방향이다.
    • A JOIN B가 가능하면 반대로 B JOIN A 도 가능하다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
    • A -> B (a.b)
    • B -> A (b.a)

순수한 객체 연관관계

  • 객체는 참조를 사용해서 연관관계를 탐색할 수 있는데 이것을 객체 그래프 탐색이라 한다.

테이블 연관관계

  • @ManyToOne: 다대일 관계라는 매핑 정보다.
  • @JoinColumn(name="TEAM_ID"): 조인 컬럼은 외래 키를 매핑할 때 사용한다. 이 어노테이션은 생략할 수 있다.

@JoinColumn

  • @JoinColumn을 생략하면 기본 전략을 사용한다.
    • 기본 전략: 필드명 + _ + 참조하는 테이블의 컬럼명

@ManyToOne

연관관계 사용

조회

  • 연관관계가 있는 엔티티를 조회하는 방법은 2가지다.
    • 객체 그래프 탐색(객체 연관관계를 사용하는 조회)
    • 객체지향 쿼리 사용(JPQL)
  • JPQL은 객체를 대상으로 하고 SQL보다 간결하다.

연관관계 제거

  • 연관관계가 있는 필드를 null로 설정하면 연관관계가 제거 된다.

연관된 엔티티 삭제

  • 연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다.
    • 그렇지 않으면 외래 키 제약조건으로 인해, 데이터베이스에서 오류가 발생한다.

양방향 연관관계

  • JPA는 List를 포함해서 Collection, Set, Map 같은 다양한 컬렉션을 지원한다.

양방향 연관관계 매핑

  • mappedBy 속성은 양방향 매핑일 때 사용하는데 반대쪽 매핑의 필드 이름을 값으로 주면 된다.

연관관계의 주인

  • 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인이라 한다.

양방향 매핑의 규칙: 연관관계의 주인

  • 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있다.
    • 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.
  • 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.
  • 연관관계의 주인을 정한다는 것은 외래 키 관리자를 선택하는 것이다.
    • Member.team을 주인으로 선택하면 자기 테이블에 있는 외래 키를 관리하면 된다.
    • Team.members를 주인으로 선택하면 물리적으로 전혀 다른 테이블의 외래 키를 관리해야 한다.

연관관계의 주인은 외래 키가 있는 곳

  • 연관관계의 주인만 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있다.
    • 주인이 아닌 반대편은 읽기만 가능하고 외래키를 변경하지는 못한다.
  • 테이블의 다대일, 일대다 관계에서 항상 다 쪽이 외래 키를 가진다.
    • 다 쪽인 @ManyToOne은 항상 연관관계의 주인이 되므로 mappedBy를 설정할 수 없다.
    • @ManyToOne에는 mappedBy 속성이 없다.

양방향 연관관계의 주의점

  • 양방향 연관관계를 설정하고 가장 흔히 하는 실수는 연관관계의 주인에는 값을 입력하지 않고, 주인이 아닌 곳에만 값을 입력하는 것이다.

순수한 객체까지 고려한 양방향 연관관계

  • 순수 객체 관점에서는 양쪽 방향에 모두 연관 관계 값을 입력해주는 것이 가장 안전하다.

연관관계 편의 메소드

  • 양방향 연관관계의 실수를 줄이기 위해서 연관관계 편의 메소드를 만든다.
    • 연관관계 편의 메소드: 한 번에 양방향 연관관계를 설정하는 메소드

연관관계 편의 메소드 작성 시 주의사항

  • 수정할 때 기존 연관관계를 제거하도록 수정해야 된다.