Spring Boot JPA/이론정리

JPA에서 @OneToMany와 @ManyToOne의 관계

qoeka 2025. 1. 10. 12:15

@OneToMany와 @ManyToOne 이란?

 

@OneToMany이란?

  • 하나의 엔티티여러 개의 엔티티를 참조할 때 사용.
  • 예: 회원(1) → 주문(N)

@ManyToOne이란?

  • 여러 개의 엔티티하나의 엔티티를 참조할 때 사용.
  • 예: 주문(N) → 회원(1)

두 관계는 양방향 매핑을 구성할 때 함께 사용되며, 외래 키를 기준으로 데이터베이스와 객체 관계를 매핑한다.

 

 

 

1. @OneToMany (일대다 관계)

 

@OneToMany 어노테이션은 한 엔티티가 여러 엔티티를 참조할 때 사용한다. 예를 들어, '회원'이 여러 개의 '주문'을 가질 수 있는 관계를 표현할 수 있다.

 

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

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}
  • mappedBy: 반대쪽 엔티티에서 이 관계를 관리하는 필드를 지정한다. (Order 엔티티의 member 필드)
  • CascadeType.ALL: 부모 엔티티에 대한 변경 사항이 자식 엔티티에도 반영되도록 설정할 수 있다.
  • FetchType.LAZY: 기본적으로 지연 로딩이 적용된다.

 

2. @ManyToOne (다대일 관계)

 

 

@ManyToOne 어노테이션은 여러 엔티티가 하나의 엔티티를 참조할 때 사용한다. 예를 들어, 여러 개의 '주문'이 하나의 '회원'을 참조하는 관계를 표현할 수 있다.

 

 

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

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;
}

 

 

설명:

  • @JoinColumn: 외래 키를 명시하는 데 사용되며, 데이터베이스의 member_id 열과 매핑된다.
  • FetchType.EAGER: 기본적으로 즉시 로딩이 적용된다.

 

 

3. 양방향 관계 설정 시 주의사항

 

@OneToMany와 @ManyToOne은 함께 사용되어 양방향 관계를 형성할 수 있다. 그러나 양방향 관계 설정 시, mappedBy를 정확히 지정하고, 양쪽 엔티티에서 데이터 일관성을 유지하기 위해 addOrder와 같은 헬퍼 메서드를 사용할 수 있다.

public void addOrder(Order order) {
    orders.add(order);
    order.setMember(this);
}

 

 

 

4. 데이터베이스 구조

  • Member 테이블: id (PK)
  • Order 테이블: id (PK), member_id (FK)

5. 요약:

  • @OneToMany: 한 엔티티가 여러 엔티티를 참조할 때 사용한다.
  • @ManyToOne: 여러 엔티티가 하나의 엔티티를 참조할 때 사용한다.
  • 올바른 mappedBy 설정과 헬퍼 메서드 활용이 중요하다.

이렇게 JPA의 @OneToMany와 @ManyToOne을 사용하여 관계를 설정하고 데이터의 일관성을 유지할 수 있다.

 

 

 

6. @OneToMany와 @ManyToOne 장단점

 

JPA에서 @OneToMany와 @ManyToOne은 객체 관계 매핑에서 자주 사용되는 관계이다.

@OneToMany 관계는 하나의 엔티티가 여러 개의 엔티티를 가질 때 사용한다. 예를 들어, 회원이 여러 개의 주문을 가질 수 있을 때 사용된다.

장점:

  • 객체 지향적인 데이터 모델링 가능
  • 컬렉션(List, Set 등)을 통해 직관적으로 데이터 접근 가능

단점:

  • 연관된 데이터가 많을 경우 성능 문제가 발생할 수 있음
  • 일방향 매핑 시 조회 성능이 떨어질 수 있음

@ManyToOne 관계는 여러 개의 엔티티가 하나의 엔티티에 속할 때 사용한다. 예를 들어, 주문이 하나의 회원에 속할 때 사용된다.

장점:

  • 데이터베이스 설계와 일치하는 직관적인 관계
  • 외래 키 기반으로 조회 성능이 우수함

단점:

  • N+1 문제 발생 가능성
  • 관계를 설정하는 쪽에서 외래 키 관리 필요

@OneToMany와 @ManyToOne 관계를 적절히 사용하여 데이터베이스와 객체 모델을 일치시킬 수 있으며, 성능 및 유지보수를 고려하여 설계하는 것이 중요하다.