- 방향
- 단방향: 객체의 한 쪽만 참조하는 것
- 양방향: 객체가 서로 참조하는 것
- 다중성: N:1, 1:N, 1:1, N:M
- 연관관계 주인: 객체를 양방향 영관관계로 만들면 연관관계의 주인을 정해야 한다.
단방향 연관관계#
- 객체는 참조(주소)로 연관관계를 맺는다.
- 테이블은 외래 키로 연관관계를 맺는다.
- 참조를 사용하는 객체의 연관관계는 단방향이다.
- 외래 키를 사용하는 테이블의 연관관계는 양방향이다.
- A JOIN B가 가능하면 반대로 B JOIN A 도 가능하다.
- 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
순수한 객체 연관관계#


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

@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
속성이 없다.
양방향 연관관계의 주의점#
- 양방향 연관관계를 설정하고 가장 흔히 하는 실수는 연관관계의 주인에는 값을 입력하지 않고, 주인이 아닌 곳에만 값을 입력하는 것이다.
순수한 객체까지 고려한 양방향 연관관계#
- 순수 객체 관점에서는 양쪽 방향에 모두 연관 관계 값을 입력해주는 것이 가장 안전하다.

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


연관관계 편의 메소드 작성 시 주의사항#
- 수정할 때 기존 연관관계를 제거하도록 수정해야 된다.

comments powered by