Develop/Java

[Java] JPA 엔티티 관계 매핑 : @OneToOne, @ManyToOne, @ManyToMany

DevPi 2024. 8. 15. 16:18
반응형

자바 개발자라면 데이터베이스와의 상호 작용이 필수적인데, JPA(Java Persistence API)는 이를 간소화하며 객체 지향적으로 데이터베이스를 관리할 수 있게 해줍니다. 특히, 엔티티 간의 관계를 매핑하는 것은 JPA를 사용하는 데 있어 중요한 부분입니다. 본 글에서는 JPA의 세 가지 주요 관계 매핑 타입인 @OneToOne, @ManyToOne, @ManyToMany에 대해 자세히 살펴보겠습니다.


@OneToOne 관계

@OneToOne 관계는 엔티티 간에 1:1 관계를 나타냅니다. 각 엔티티 인스턴스는 다른 엔티티의 단 하나의 인스턴스와 연결됩니다. 예를 들어, 한 사람이 하나의 여권을 소유하는 관계가 이에 해당합니다.

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

    @OneToOne
    private Passport passport;
}

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

    @OneToOne(mappedBy = "passport")
    private Person person;
}

 

@ManyToOne 관계

@ManyToOne 관계는 한 엔티티가 다른 엔티티의 여러 인스턴스와 관계를 맺을 수 있음을 나타냅니다. 이는 주로 "다수의 자식이 하나의 부모를 공유할 때" 사용됩니다. 예를 들어, 여러 주문이 한 고객에게 속하는 경우가 여기에 해당합니다.

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

    @ManyToOne
    @JoinColumn(name = "customer_id") // 외래 키 지정
    private Customer customer;
}

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

    @OneToMany(mappedBy = "customer")
    private List<Order> orders = new ArrayList<>();
}

 

@ManyToMany 관계

@ManyToMany 관계는 두 엔티티 간에 서로 다수의 인스턴스를 참조할 수 있는 관계를 설명합니다. 이 관계는 복잡하며, 보통 연결 테이블을 사용하여 구현됩니다. 예를 들어, 여러 학생이 여러 과목을 수강할 수 있는 관계가 이에 해당합니다.

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

    @ManyToMany
    @JoinTable(
        name = "enrollment",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses = new ArrayList<>();
}

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

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

결론

JPA의 관계 매핑 어노테이션은 데이터베이스 관계를 객체 지향적으로 표현하는 강력한 도구입니다. 각 관계 타입은 특정 상황에 적합하며, 개발자는 애플리케이션의 데이터 모델을 설계할 때 이러한 관계들을 적절히 활용해야 합니다. 올바르게 사용된 JPA 관계 매핑은 데이터 관리의 복잡성을 줄이고, 개발 프로세스를 효율적으로 만들어 줍니다. 이를 통해 개발자는 보다 집중적으로 비즈니스 로직의 구현에 초점을 맞출 수 있습니다.

반응형