본문 바로가기
JAVA/JPA

JPA에서 @JoinColumn 어노테이션과 @JoinTable 어노테이션 설명

by GangDev 2024. 3. 29.

 

@JoinColumn 어노테이션은 JPA에서 엔티티 클래스 간의 관계를 매핑할 때 사용되며, 주로 외래 키(foreign key)를 관리하는 데 사용된다.
이 어노테이션은 주로 @ManyToOne 또는 @OneToOne 관계에서 사용되며, 엔티티 클래스 간의 관계를 데이터베이스 스키마의 관계로 정의할 때 중요한 역할을 한다.

 

name: 외래 키 컬럼의 이름을 지정한다. 이 속성을 사용하여 외래 키 컬럼의 이름을 직접 지정할 수 있다.
(예를 들어, @JoinColumn(name = "order_id") 와 같이 사용할 수 있다)
referencedColumnName: 대상 엔티티(포함 엔티티)의 기본 키(primary key)컬럼의 이름을 지정한다. 기본값은 대상 엔티티의 기본 키 컬럼의 이름과 동일하게 설정된다. 대상 엔티티의 기본 키 컬럼과 외래 키 컬럼을 연결할 때 사용된다.
nullable: 기본적으로 true 로 설정되어 있으며, 외래 키 컬럼이 null 값이 허용되는지 여부를 나타낸다. 만약 false 로 설정하면 외래 키 컬럼은 항상 값을 가져야 한다.
unique: 기본적으로 false로 설정되어 있으며, 외래 키 컬럼에 중복 값 허용 여부를 나타낸다. true 로 설정하면 외래 키 컬럼에 고유한(unique) 값만 허용된다.
insertable: 기본적으로 true로 설정되어 있으며, 엔티티를 데이터베이스에 삽입(INSERT)할 때 외래 키 컬럼을 삽입할지 여부를 나타낸다. false 로 설정하면 삽입 시 외래 키 컬럼을 무시한다.
updatable: 기본적으로 true로 설정되어 있으며, 엔티티를 데이터베이스에 업데이트(UPDATE)할 때 외래 키 컬럼을 업데이트할지 여부를 나타낸다. false 로 설정하면 업데이트 시 외래 키 컬럼을 무시한다.

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 다수의 주문 아이템을 관리하는 컬렉션
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();
    
    // 다른 필드와 게터, 세터 등 필수 코드는 생략

}

@Entity
@Table(name = "order_items")
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 주문 아이템의 가격
    @Column(name = "price")
    private BigDecimal price;

    // 주문 아이템의 수량
    @Column(name = "quantity")
    private int quantity;

    // 주문과의 관계 설정
    @ManyToOne
    @JoinColumn(name = "order_id") // 외래 키 컬럼 지정
    private Order order;

    // 다른 필드와 게터, 세터 등 필수 코드는 생략
}

 

위의 코드에서 @JoinColumn(name = "order_id") 어노테이션은 OrderItem 엔티티의 order 필드를 통해 Order 엔티티와의 관계를 매핑하고, order_id 컬럼을 외래 키로 사용하도록 지정한다.
이를 통해 주문 아이템과 주문 간의 관계를 데이터베이스 스키마로 매핑한다.


@JoinTable 어노테이션은 JPA에서 엔티티 클래스 간의 관계를 표현하는 데 사용되며, 이 속성을 사용하여 연결 테이블의 이름을 직접 지정할 수 있다.
joinColumns: 현재 엔티티의 조인 컬럼에 대한 설정을 지정한다. 주로 현재 엔티티의 기본 키 컬럼과 연결 테이블의 조인 컬럼 간의 매핑을 정의한다.
inverseJoinColumns: 연결된 엔티티(대상 엔티티)의 조인 컬럼에 대한 설정을 지정한다. 대상 엔티티의 기본 키 컬럼과 연결 테이블의 역 조인 컬럼 간의 매핑을 정의한다.
uniqueConstraints: 연결 테이블에 대한 고유한 제약 조건을 정의할 수 있다. 이를 통해 중복된 데이터를 방지할 수 있다.

@Entity
@Table(name = "students")
public class Student {
    @Id
    @GeneratedValue(strategy =d GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course", // 연결 테이블의 이름
        joinColumns = @JoinColumn(name = "student_id"), // 현재 엔티티(Student)의 조인 컬럼
        inverseJoinColumns = @JoinColumn(name = "course_id") // 대상 엔티티(Course)의 조인 컬럼
    )
    private List<Course> courses = new ArrayList<>();

    // 다른 필드와 게터, 세터 등 필수 코드는 생략
}

@Entity
@Table(name = "courses")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "title")
    private String title;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students = new ArrayList<>();

    // 다른 필드와 게터, 세터 등 필수 코드는 생략
}

 

위 예제에서 @JoinTable 어노테이션을 사용하여 Student 와 Course 엔티티 간의 관계를 매핑하고, 연결 테이블의 이름은 student_course"로 설정하였다.
joinColumns 와 inverseJoinColumns 를 사용하여 조인 컬럼과 역 조인 컬럼을 명시적으로 지정하였다.
이를 통해 Student 엔티티와 Course 엔티티 간의 다대다 관계를 정의하고 연결 테이블을 활용하여 매핑하였다.

 

---

24년 2월 5일 작성된 글입니다