아라보자.
@JoinColumn은 JPA (Java Persistence API)에서 사용되는 애노테이션으로, 관계형 데이터베이스에서 엔터티 간의 외래 키(Foreign Key) 관계를 매핑하는 데 사용됩니다. 이를 통해 특정 필드를 데이터베이스의 특정 컬럼에 매핑할 수 있습니다.
예시를 들어볼까요?
두 개의 엔티티 클래스 Student와 Address가 있고, Student 엔티티가 Address 엔티티를 참조한다고 가정해봅시다.
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Address {
@Id
private Long id;
private String street;
private String city;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class Student {
@Id
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "address_id") // 외래 키로 사용할 컬럼 명 지정
private Address address;
// getters and setters
}
위의 예제에서 @JoinColumn(name = "address_id")는 Student 엔티티의 address 필드가
Address 엔티티의 id 필드와 매칭됨을 의미한다. name을 안 써도 address_id를 자동으로 참조하긴하는데
그래도 명시적으로 써주는 게 맞다고 들었다.
그리고 1:1이기 때문에 OneToOne을 써준다.(내 아이디에는 하나의 주소만)
이제 다대일 관계에서의 @JoinColumn 예시도 봐야겠죠?
하나의 부서(Department)에는 여러 명의 직원분(Employee)들이 계시는 걸로 예시를 들어볼게요.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id") // 외래 키로 사용할 컬럼 명 지정
private Department department;
// getters and setters
}
단뱡항만 원한다면 mappedBy를 쓸 필요는 없고
참조하는 엔티티에서만 외래키를 주입시켜주면 된다.
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
나는 이렇게 외웠다. Many는 위에 있는 엔티티를 가리키고
One은 밑에 있는 department를 가리키는 걸로.
복잡한 조인 조건이 필요없는 경우는 @JoinColumn을 사용하는 것이 좋지만
복잡한 조건부 조인이나 특정 데이터를 효율적으로 조회해야 할 때는 JPQL을 사용하는 것이 좋은데 이건 나중에..
그리고 다대다(N:M) 매핑은 다대일 + 일대다로 하자.
웬만하면 @ManyToMany는 사용하지않는다.
중간 엔티티를 만들고 양방향 매핑해서 사용하자!