@JoinColumn이란?

한민욱·2024년 6월 4일

아라보자.

@JoinColumn이란?

@JoinColumn은 JPA (Java Persistence API)에서 사용되는 애노테이션으로, 관계형 데이터베이스에서 엔터티 간의 외래 키(Foreign Key) 관계를 매핑하는 데 사용됩니다. 이를 통해 특정 필드를 데이터베이스의 특정 컬럼에 매핑할 수 있습니다.

예시를 들어볼까요?

두 개의 엔티티 클래스 Student와 Address가 있고, Student 엔티티가 Address 엔티티를 참조한다고 가정해봅시다.

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
}

Student

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)들이 계시는 걸로 예시를 들어볼게요.

Department

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
}

Employee

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
}
  • @OneToOne 관계: 한쪽 엔터티에만 설정할 수 있지만, 양방향 관계를 원한다면 양쪽 엔터티에 설정합니다.
  • @ManyToOne 관계: 일반적으로 참조하는 엔터티에만 설정합니다.
  • @OneToMany 관계: 양방향 관계를 원한다면 @OneToMany와 @ManyToOne을 각각 양쪽 엔터티에 설정합니다.

단뱡항만 원한다면 mappedBy를 쓸 필요는 없고
참조하는 엔티티에서만 외래키를 주입시켜주면 된다.

@ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;

나는 이렇게 외웠다. Many는 위에 있는 엔티티를 가리키고
One은 밑에 있는 department를 가리키는 걸로.

복잡한 조인 조건이 필요없는 경우는 @JoinColumn을 사용하는 것이 좋지만
복잡한 조건부 조인이나 특정 데이터를 효율적으로 조회해야 할 때는 JPQL을 사용하는 것이 좋은데 이건 나중에..

그리고 다대다(N:M) 매핑은 다대일 + 일대다로 하자.
웬만하면 @ManyToMany는 사용하지않는다.
중간 엔티티를 만들고 양방향 매핑해서 사용하자!

profile
나날이 성장하고 싶은 백엔드 개발자

0개의 댓글