JPA 연관관계

coldrice99·2024년 10월 20일
0

JPA 연관관계 쉽게 이해하기 (코드 예제 및 테이블 생성 포함)

이번 TIL에서는 JPA에서 엔티티 간의 연관관계를 어떻게 설정하고 사용하는지에 대해 정리해보겠다. 연관관계 설정은 데이터베이스와 엔티티 사이의 관계를 매핑하는 중요한 과정이다. 주로 사용하는 연관관계의 종류는 1:1, 1:N, **N:M**이다. 각 관계의 특징과 사용 방법을 살펴보고, 코드 예제와 데이터베이스 테이블 구조까지 함께 살펴보자.

1. 1:1(일대일) 관계

1:1 관계는 한 엔티티가 다른 엔티티와 딱 하나의 연관을 가질 때 사용한다. 예를 들어, UserProfile 엔티티가 1:1 관계라고 하면, 각 사용자마다 하나의 프로필만 연결된다.

  • 설정 방법:

    @OneToOne@JoinColumn을 사용하여 profile_id 컬럼을 통해 Profile 엔티티와의 1:1 관계를 설정했다. 이 방식으로 User는 하나의 Profile을 소유할 수 있다.

  • 생성된 데이터베이스 테이블 구조:

    User 테이블컬럼
    id기본 키
    profile_id외래 키
    Profile 테이블컬럼
    id기본 키
    bio프로필 내용

    User 테이블에는 profile_id 외래 키 컬럼이 생성되며, 이를 통해 P  1(일대다) & N대 1(다대일) 관계

1:N 관계는 한 엔티티가 여러 개의 다른 엔티티와 연결될 때 사용한다. 예를 들어, ParentChild 관계에서 하나의 부모(Parent)가 여러 자식(Child)을 가질 수 있는 상황이다. 반대로 각 자식은 하나의 부모만 가질 수 있으므로, Child 쪽에서는 N:1 관계가 된다.

  • 설정 방법:

    • 부모 엔티티 (1:N 관계)

      @OneToManymappedBy를 사용해 Child 엔티티와 연결되었음을 알린다. 여기서 mappedBy는 관계의 주인을 지정하는 중요한 요소다. 주인이 아닌 쪽은 단순히 참조만 할 수 있다.

    • 자식 엔티티 (N:1 관계)

      @ManyToOne@JoinColumn을 통해 외래 키를 지정하며, 이 자식 엔티티가 관계의 주인이 된다. 주인 엔티티는 외래 키 값을 설정하거나 변경할 수 있는 역할을 한다.

  • 생성된 데이터베이스 테이블 구조:

    Parent 테이블컬럼
    id기본 키
    Child 테이블컬럼
    id기본 키
    parent_id외래 키

    Child 테이블에는 parent_id 외래 키 컬럼이 생성되며, 이를 통해 각 ChildParent와 연결된다.

N:M(다대다) 관계

N:M 관계는 두 엔티티가 서로 다수를 참조할 수 있는 경우다. 예를 들어, 여러 Student가 여러 Course를 들을 수 있는 경우 N:M 관계다.

  • 설정 방법:
    JPA에서는 N:M 관계를 위해 **중간 테이블(association table)**을 만들어야 한다. 이 중간 테이블은 두 엔티티 간의 관계를 관리하며, 다대다 매핑을 효과적으로 처리한다.

    여기서 @JoinTable을 사용해 중간 테이블을 명시적으로 지정했다. joinColumns는 현재 엔티티(Student)의 외래 키를, inverseJoinColumns는 반대쪽 엔티티(Course)의 외래 키를 의미한다.

  • 생성된 데이터베이스 테이블 구조:

    Student 테이블컬럼
    id기본 키
    Course 테이블컬럼
    id기본 키
    Student_Course 중간 테이블컬럼
    student_id외래 키
    course_id외래 키

    중간 테이블인 Student_Course가 생성되며, student_idcourse_id를 통해 각 StudentCourse가 다대다 관계로 연결된다.

🔑 주인 엔티티란 무엇인가?

JPA에서 **"주인 엔티티(owner)"**는 외래 키를 직접 관리하는 엔티티다. 예를 들어, @ManyToOne 관계에서 외래 키를 실제로 가지는 엔티티가 관계의 주인이다. 이 주인이 외래 키 값을 설정하거나 변경할 수 있으며, 비주인 엔티티는 관계를 단순히 참조만 한다.

  • 주인 엔티티와 비주인 엔티티의 예시:

    여기서 Order 엔티티가 주인 엔티티로, 외래 키(customer_id)를 직접 관리하며, Customer 엔티티는 단순히 참조만 한다.

  • 생성된 데이터베이스 테이블 구조:

    Order 테이블컬럼
    id기본 키
    customer_id외래 키
    Customer 테이블컬럼
    id기본 키

    Order 테이블에 customer_id 외래 키가 생성되어 각 주문이 어떤 고객과 연관되어 있는지 관리하게 된다.

관계의 주인을 정하는 이유는, JPA가 어떤 엔티티를 통해 데이터베이스의 외래 키를 관리할지 명확히 하기 위해서다. 이를 통해 데이터베이스의 일관성을 유지하고, 올바른 관계 설정을 가능하게 한다.

📝 정리하며

JPA에서의 연관관계 매핑은 엔티티 간의 관계를 데이터베이스에 반영하고 관리하기 위한 중요한 과정이다. 각 관계의 특징과 설정 방법을 잘 이해하고 사용하면, 데이터베이스와 엔티티 간의 매핑을 효과적으로 처리할 수 있다. 이번 TIL을 통해 연관관계의 종류와 설정 방법, 그리고 관계의 주인 개념 및 데이터베이스 테이블 구조에 대해 정리해 보았다. ✨

profile
서두르지 않으나 쉬지 않고

0개의 댓글