[Java] JPA - 객체와 테이블 연관관계
1. 객체와 테이블 연관관계
-
객체 양방향 연관관계는 관리 주인이 필요함.
-
단방향 : 한 엔티티에서 다른 엔티티를 참조할 수 있지만, 참조된 엔티티는 참조를 통해 역으로 접근할 수 없다. 예를 들어, 부서(Department) 엔티티가 직원(Employee) 엔티티를 참조하는 경우 부서는 직원을 알지만, 직원은 부서를 모르는 단방향 관계가 된다.
-
양방향 : 양방향 관계에서는 두 엔티티 간에 서로를 참조할 수 있다. @OneToMany와 @ManyToOne 어노테이션을 사용하여 양방향 관계를 설정하고, mappedBy 속성은 양방향 관계에서 역방향 관계의 필드를 지정한다. 이를 통해 두 엔티티 간에 서로를 참조할 수 있게 된다. 양방향 관계를 설정하면 데이터베이스 테이블 간에 외래 키(Foreign Key) 관계가 설정되어 데이터베이스에서도 관련된 정보를 쉽게 조회할 수 있다. mappedBy 속성은 주인이 아닌 쪽에서 사용 되며, 주인 쪽에는 mappedBy가 아닌 @JoinColumn 어노테이션을 사용한다.
-
양방향 관계에서 왜 주인 관계를 설정해야 하나? 데이터베이스의 테이블 구조에서 외래키 관리를 누가 담당할 지 정해야 해서 주인 관계를 결정한다. 주인 엔티티는 외래키 관리와 갱신을 할 수 있으며 주인이 아닌 엔티티는 그러한 기능을 가지고 있지 않다. 예를 들어, 주인으로 설정한 Department 엔티티의 경우 Department의 필드인 employees에 의해 외래 키 관계 관리가 가능하다. 따라서 Department 엔티티에서 employees 필드를 통해 직원을 추가하거나 삭제할 수 있고, 이에 따라 데이터베이스의 외래 키도 관리된다. 그러나 반대로 Employee 엔티티에서는 department 필드를 통해 부서를 추가하거나 삭제할 수 있지만, 이러한 변경은 데이터베이스의 외래 키에 영향을 주지 않는다.
즉, Employee 엔티티에서 department 필드를 수정해도, 이는 영속성 컨텍스트 내에서만 변경이 이루어 지며, 데이터베이스에 영향을 주지 않는다. 주인 관계는 주로 일대다, 다대일 관계에서 FK가 있는 쪽의 엔티티에 설정한다.
@Entity
public class Department {
@Id
private Long id;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
}
@Entity
public class Employee {
@Id
private Long id;
@ManyToOne
private Department department;
}