JPA

JPA 연관관계 정리 (단방향, 양방향 관계 포함)

초코너무조코 2025. 4. 29. 15:28
728x90

JPA(Java Persistence API)에서는 엔티티 간의 관계를 정의할 때 단방향양방향 관계를 설정할 수 있습니다. 이 관계들은 Many-to-One, One-to-Many, One-to-One, Many-to-Many 등 다양한 매핑 관계와 함께 설정할 수 있으며, 각 방향에 따라 데이터 흐름과 관계 관리 방식이 달라집니다.

이번에는 단방향양방향 관계를 포함한 JPA 관계 설정을 정리해 보겠습니다.


1. 단방향 관계 (One-Way Relationship)

단방향 관계는 한 엔티티에서만 다른 엔티티를 참조하는 관계입니다. 즉, 한 쪽에서만 연관된 엔티티를 관리하고, 다른 쪽에서는 해당 관계를 알지 못하는 형태입니다. 이 경우, 양쪽 엔티티에서 연관된 객체를 조회하거나 수정할 수 없습니다.

예시: Many-to-One 단방향 관계

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

    private String name;

    @ManyToOne
    @JoinColumn(name = "professor_id") // 외래키 설정
    private Professor professor; // 교수 객체 참조 (단방향)

    // Getter and Setter
}

위의 예시에서 Student 클래스는 Many-to-One 관계로 Professor 객체를 참조하고 있습니다. 하지만 Professor 클래스는 Student와의 관계를 전혀 알지 못하고 있습니다. 이 관계는 단방향입니다.


2. 양방향 관계 (Bi-Directional Relationship)

양방향 관계는 두 엔티티가 서로를 참조하는 관계입니다. 즉, 양쪽 엔티티에서 서로를 알 수 있게 됩니다. 이는 단방향 관계를 확장한 형태로, 양쪽 엔티티 모두 연관된 데이터를 조회하고 수정할 수 있습니다.

양방향 관계에서는 연관관계의 주인(Owner)과 주인이 아닌 쪽(Inverse Side)을 명확히 해야 하며, 이를 mappedBy 속성을 통해 설정합니다.

예시: Many-to-One / One-to-Many 양방향 관계

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

    private String name;

    @ManyToOne
    @JoinColumn(name = "professor_id") // 외래키 설정
    private Professor professor; // 교수 객체 참조

    // Getter and Setter
}
@Entity
public class Professor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long professorId;

    private String name;

    @OneToMany(mappedBy = "professor") // 학생이 교수에 대한 참조를 관리
    private List<Student> students = new ArrayList<>(); // 교수의 학생들

    // Getter and Setter
}

설명

  • Student 엔티티는 Many-to-One 관계로 Professor를 참조하고 있습니다.
  • Professor 엔티티는 One-to-Many 관계로 Student들을 참조합니다.
  • mappedBy 속성은 반대편 관계의 주인 엔티티를 지정합니다. 여기서는 Student의 professor 필드를 지정하고 있습니다.

이렇게 하면 양방향 관계에서 양쪽 엔티티가 서로를 참조할 수 있습니다.


3. 연관관계의 주인 (Owning Side)과 반대편 (Inverse Side)

양방향 관계에서는 연관관계의 주인반대편을 명확히 구분해야 합니다.

  • 주인 (Owning Side): 실제로 외래키를 관리하는 쪽입니다. Many-to-One, One-to-Many 관계에서 Many-to-One 쪽이 주인입니다.
  • 반대편 (Inverse Side): 외래키를 관리하지 않지만, 관계를 양방향으로 유지하기 위해 연관된 객체를 참조하는 쪽입니다. One-to-Many, Many-to-Many 관계에서 One-to-Many 쪽은 주인이 아니며 반대편입니다.

예시: Many-to-Many 관계

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

    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<>();

    // Getter and Setter
}
@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long courseId;

    private String name;

    @ManyToMany(mappedBy = "courses") // 반대편 관계 설정
    private List<Student> students = new ArrayList<>();

    // Getter and Setter
}

설명

  • Student와 Course 간의 Many-to-Many 관계에서, Student는 @JoinTable을 사용하여 연결 테이블을 정의합니다.
  • Course 엔티티에서는 mappedBy 속성을 사용하여 연관관계의 주인이 아닌 반대편임을 지정합니다.

4. 연관관계 설정 시 고려해야 할 사항

외래키 관리

  • 주인 엔티티에서는 외래키를 관리합니다. 예를 들어, Many-to-One 관계에서는 자식 엔티티가 외래키를 관리하며, 반대편에서는 외래키를 관리하지 않습니다.

mappedBy 속성

  • mappedBy는 양방향 관계에서 연관관계의 주인을 지정하는 속성입니다. 주인이 아닌 쪽에서는 mappedBy 속성을 사용해 관계를 관리합니다.

@JoinColumn 사용

  • @JoinColumn은 외래키를 정의하는 데 사용됩니다. 주인 엔티티에서 외래키 컬럼을 지정할 때 사용합니다.

결론

  • 단방향 관계: 한 쪽 엔티티만 관계를 관리하는 방식입니다. 한 쪽에서만 참조할 수 있습니다.
  • 양방향 관계: 두 엔티티가 서로를 참조할 수 있는 방식입니다. 양쪽에서 관계를 관리하고 조회할 수 있습니다.
  • 연관관계의 주인반대편을 명확히 구분하고, mappedBy와 @JoinColumn을 통해 관계를 정의해야 합니다.

JPA에서는 이러한 관계들을 잘 설정하여 객체 간의 데이터를 관리하고, 데이터베이스와의 매핑을 효율적으로 처리할 수 있습니다. 각 관계를 언제, 어떻게 사용해야 할지 이해하고 실제 프로젝트에서 적절히 적용하는 것이 중요합니다.

728x90