728x90

JPA(Java Persistence API)에서 엔티티 간의 관계를 매핑하는 방법에는 여러 가지가 있습니다. 이 중에서 JoinColumn과 MappedBy는 매우 중요한 개념입니다.

  • JoinColumn JoinColumn은 연관 관계를 맺고 있는 테이블에서 외래 키를 매핑할 때 사용합니다. 즉, 연관 관계의 주인(owning side)에서 외래 키를 관리하는 방법입니다.

예를 들어, 다음과 같은 두 개의 엔티티가 있다고 가정해보겠습니다.

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;
    
    // ...
}

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "author")
    private List<Book> books = new ArrayList<>();

    // ...
}

여기서 Book과 Author 엔티티는 ManyToOne 단방향 연관 관계를 맺고 있습니다. Book 엔티티에서는 @JoinColumn 어노테이션을 사용하여 author_id 외래 키를 매핑하고 있습니다. 이를 통해 Book 엔티티가 연관된 Author 엔티티의 id 값을 참조할 수 있습니다.

  • MappedBy MappedBy는 연관 관계의 주인이 아닌 엔티티에서 관계를 매핑할 때 사용합니다. 즉, 양방향 연관 관계에서 연관 관계의 주인이 아닌 엔티티에서 매핑 정보를 제공하는 방법입니다.

예를 들어, 위에서 사용한 Book과 Author 엔티티에서는 OneToMany 양방향 연관 관계를 맺고 있습니다. 이 때, Book 엔티티에서는 mappedBy 속성을 사용하여 Author 엔티티의 books 필드와 매핑할 수 있습니다.

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    // ...
}

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "author")
    private List<Book> books = new ArrayList<>();

    // ...
}

위의 코드에서는 Author 엔티티에서 mappedBy 속성을 사용하여 Book 엔티티의 author 필드와 매핑하고 있습니다. 이를 통해 양방향 연관 관계를 구현할 수 있습니다.

JoinColumn과 MappedBy 매핑 방식

JoinColumn vs MappedBy

JoinColumn과 MappedBy는 둘 다 엔티티 간의 연관 관계를 매핑하는 방식입니다. 하지만 다음과 같은 차이점이 있습니다.

  1. 연관 관계의 주인

JoinColumn은 연관 관계의 주인에서 사용되고, MappedBy는 연관 관계의 주인이 아닌 엔티티에서 사용됩니다.

  1. 매핑 방향

JoinColumn은 단방향 연관 관계에서 사용되며, 외래 키를 매핑합니다. MappedBy는 양방향 연관 관계에서 사용되며, 양쪽 엔티티 간에 서로를 참조할 수 있도록 매핑합니다.

  1. 관리하는 쪽의 변경 가능성

JoinColumn은 연관 관계의 주인에서 외래 키를 관리하므로, 외래 키 값이 변경될 때는 항상 관리하는 쪽에서 변경해야 합니다. MappedBy는 연관 관계의 주인이 아닌 엔티티에서 관계를 매핑하므로, 관리하는 쪽이 아닌 다른 쪽에서 연관 관계를 변경할 수 있습니다.

  1. 필드 이름

JoinColumn은 외래 키의 컬럼 이름을 지정하는 데 사용되므로, 필드 이름과 다를 수 있습니다. MappedBy는 필드 이름을 그대로 사용하므로, 필드 이름과 매핑되는 엔티티의 필드 이름이 같아야 합니다.

위에서 예시로 사용한 코드에서는 Book 엔티티에서 JoinColumn을 사용하여 ManyToOne 단방향 연관 관계를 매핑하고, Author 엔티티에서 MappedBy를 사용하여 OneToMany 양방향 연관 관계를 매핑했습니다. 이를 통해 JPA를 사용하여 데이터베이스의 테이블과 엔티티를 매핑할 때 JoinColumn과 MappedBy를 적절히 사용하여 연관 관계를 설정할 수 있습니다.

사용할 때 주의해야 할 점

@Entity
public class Department {
    @Id
    private Long id;

    // 하나의 부서에는 여러 명의 직원이 속해있다.
    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees = new ArrayList<>();

    // getter and setter methods
}

@Entity
public class Employee {
    @Id
    private Long id;

    // 여러 명의 직원은 하나의 부서에 속한다.
    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;

    // getter and setter methods
}
  • JoinColumn을 사용할 때 주의할 점:
    • @JoinColumn은 일대다, 다대일 관계에서 사용합니다.
    • JoinColumn을 사용하여 연관관계의 주인을 정의합니다. 따라서 OneToMany 또는 ManyToOne의 주인이 됩니다.
    • name 속성을 반드시 지정해야 합니다.
    • referencedColumnName 속성을 생략할 경우 기본값은 참조하는 엔티티의 기본키입니다.
  • MappedBy를 사용할 때 주의할 점:
    • @OneToMany, @OneToOne에서 사용합니다.
    • mappedBy 속성을 사용하여 양방향 연관관계를 설정할 수 있습니다. mappedBy 속성에는 연관관계의 주인 필드 이름을 지정합니다.
    • 연관관계의 주인은 외래 키를 관리합니다. 연관관계의 주인이 아닌 쪽에서는 읽기 전용으로 설정해야 합니다.
    • mappedBy를 사용하는 엔티티는 데이터베이스 테이블에 외래 키를 생성하지 않습니다.

따라서 위 예제에서는 Department 엔티티에서 mappedBy 속성을 사용하여 Employee 엔티티와의 양방향 연관관계를 설정하고, Employee 엔티티에서 JoinColumn을 사용하여 Department 엔티티와의 일대다 관계에서 외래 키를 설정합니다.


내저장소 바로가기 luxury515

+ Recent posts