JPA는 객체와 테이블을 매핑해서 객체 중심으로 데이터를 관리한다. 그래서 객체의 관계와 테이블 관계를 매핑할 수 있어야 하는데 이것을 연관 관계 매핑이라고 한다.
연관 관계를 어떻게 설정하는지에 따라서 불필요한 조인을 줄일 수 있고 필요한 데이터를 가져오는 시점을 정할 수 있다.
JPA의 연관 관계 매핑이 어려운 이유는 참조 변수를 사용하여 매핑을 하기 때문에 테이블의 관계와 객체의 관계가 정확하게 일치하지 않기 때문이다.
연관 관계를 구분하는 기준은 방향성과 다중성, 연관 관계 주인이 있으며 이 세가지를 고려해서 매핑을 한다.
방향성: 단방향, 양방향
객체 관계에서 한 쪽이 반대쪽을 참조 변수를 통해서 객체를 참조하면 단방향
예를 들면 직원 객체가 잠조 변수를 통해서 부서 객체를 참조
반대로 반대쪽 객체도 참조 변수를 통해서 객체를 참조한다면 양방향
예를 들면 부서 객체도 참조 변수를 통해서 직원 객체를 참조
방향은 객체이만 존재하고 테이블은 항상 양방향이다.
연관 관계 주인: 양방향 매핑인 경우 연관 관계의 관리 주체가 누구인지를 정해야 한다.
일반적으로 N:1,1:N 관계에서는 N에 해당하는 객체가 연관 관계의 주인이다.
다중성: 일대일(1:1), 일대다(1:N), 다대일(N:1), 다대다(N:M)
예를 들어 여러 직원이 하나의 부서에 속한다면 직원과 부서의 관계는 다대일 관계이다. 하지만 반대로 부서에 입장에서는 일대다 관계가 된다.
다중성은 비즈니스에 따라서 변경 된다.
@ManyToOne 어노테이션은 다대일(N:1) 관계 매핑이다.
위에 예시처럼 여러 직원이 하나의 부서에 속해있다고 한다면 직원 입장에서는 부서와 다대일 관계이기 때문에 @ManyToOne이 된다.
연관 관계 매핑할 때 다중성을 나타내는 어노테이션을 사용해야 한다.
엔티티 기준으로 다중성을 생각해야 한다.
@OneToMany 어노테이션은 일대다(1:N) 관계 매핑이다.
@JoinColumn 어노테이션은 FK(외래키)를 매핑할 때 사용한다.
name 속성에 매핑할 FK 이름을 지정한다.