@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 관계를 적절히 사용하여 데이터베이스와 객체 모델을 일치시킬 수 있으며, 성능 및 유지보수를 고려하여 설계하는 것이 중요하다.
'Spring Boot JPA > 이론정리' 카테고리의 다른 글
네트워크로 API 통신하는 라이브러리 (0) | 2025.01.11 |
---|---|
Java에서 벨리데이션 사용 방법 정리 (0) | 2025.01.09 |
JPA기초 이론 정리 (0) | 2025.01.09 |