티스토리 뷰
728x90
JPA에서 1:N(One-to-Many) 관계는 자주 사용되는 개념 중 하나입니다. 이 관계는 하나의 엔티티가 여러 개의 다른 엔티티와 연결되어 있는 경우를 의미합니다. JPA에서 1:N 관계를 설정하는 방법을 기억하기 쉽게 단계별로 설명하겠습니다.
1. 1:N 관계란?
1:N 관계는 한 엔티티가 여러 개의 다른 엔티티와 연결된 관계를 말합니다.
- 예시: 한 명의 부모(Parent)가 여러 명의 자식(Child)을 가질 수 있습니다. 이때 부모와 자식은 1:N 관계를 형성합니다.
2. 어노테이션 설정 방법
JPA에서 1:N 관계를 설정하려면 양쪽 엔티티에 적절한 어노테이션을 사용해야 합니다.
2.1 Parent 엔티티에서 @OneToMany
어노테이션 사용
Parent 엔티티는 여러 개의 Child 엔티티를 포함해야 하므로, 컬렉션(리스트 또는 셋) 형태로 자식 엔티티를 관리합니다.
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 설정
private Long id;
private String name;
// 자식 엔티티와의 관계 설정 (연관된 자식 엔티티들을 가짐)
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> children = new ArrayList<>();
// Getter, Setter 등 추가...
}
@OneToMany
: 하나의Parent
가 여러Child
엔티티를 가질 수 있다는 의미입니다.mappedBy
: Child 엔티티의 어떤 필드가 관계를 맺고 있는지를 명시합니다. 여기서는Child
엔티티의parent
필드가 관계를 정의합니다.cascade = CascadeType.ALL
: 부모가 저장, 삭제될 때 자식 엔티티들도 함께 저장 또는 삭제됩니다.orphanRemoval = true
: 부모 엔티티에서 자식 엔티티가 제거되면, 데이터베이스에서도 해당 자식 엔티티가 삭제됩니다.
2.2 Child 엔티티에서 @ManyToOne
어노테이션 사용
반대로, 자식 엔티티에서는 여러 자식이 하나의 부모를 가리키기 때문에 @ManyToOne
어노테이션을 사용합니다.
@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 설정
private Long id;
private String name;
// 부모 엔티티와의 다대일 관계 설정
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Parent parent;
// Getter, Setter 등 추가...
}
@ManyToOne
: 여러Child
엔티티가 하나의Parent
와 연결될 수 있음을 나타냅니다.fetch = FetchType.LAZY
: 부모 엔티티는 실제로 필요할 때만 로딩되도록 설정해 성능을 최적화합니다.@JoinColumn(name = "parent_id")
:Child
테이블에서Parent
엔티티의 외래 키 컬럼을parent_id
로 설정합니다.
3. 설정 요약
- Parent 엔티티:
@OneToMany
로 자식 엔티티와의 관계 설정.mappedBy
로 자식 엔티티에서 관계를 맺고 있는 필드 지정.cascade
와orphanRemoval
로 자식 엔티티의 생명 주기를 부모와 함께 관리.
- Child 엔티티:
@ManyToOne
으로 부모 엔티티와의 관계 설정.@JoinColumn
으로 외래 키를 지정.
4. 기억하기 쉬운 팁
- Parent 엔티티에서는 "부모가 여러 자식(Children)을 관리한다" →
@OneToMany
사용. - Child 엔티티에서는 "자식이 하나의 부모(Parent)를 가리킨다" →
@ManyToOne
사용. mappedBy
는 부모-자식 관계에서 자식 엔티티에서 부모를 참조하는 필드의 이름을 가리킵니다.
5. mappedBy
는 무엇인가?
mappedBy
는 양방향 관계에서 어느 엔티티가 관계의 주체(Owner)인지 결정하는 데 사용됩니다. 즉, 양방향 관계에서 외래 키를 관리하는 주체는 한쪽 엔티티에만 있고, 반대쪽 엔티티는 외래 키 필드를 갖고 있지 않습니다.
mappedBy
설정 예시
@Entity
public class Parent {
@OneToMany(mappedBy = "parent")
private List<Child> children;
}
@Entity
public class Child {
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent; // Parent에서 mappedBy로 참조되는 필드
}
mappedBy
는 DB 테이블의 컬럼이 아니라, 엔티티 클래스의 필드 이름을 사용합니다. 따라서mappedBy = "parent"
는 Child 엔티티의parent
필드를 참조하고 있습니다.
6. 간단 예시
- 부모(Parent)와 자식(Child) 관계를 생각해보세요. 부모는 여러 명의 자식을 가지고 있고, 각 자식은 부모를 가리키고 있습니다. 이 관계를 설정할 때, 부모는 자식들을 관리하며, 자식은 자신이 어느 부모에 속해 있는지를 명시합니다.
이렇게 하면 JPA에서 1:N 관계를 쉽게 설정할 수 있습니다. 양방향 관계에서는 항상 관계의 주인과 종속을 고려해야 하며, 성능 최적화와 데이터 무결성을 위해 관계 설정을 신중히 해야 합니다.
블로그 글로 활용하기 위해 중요한 개념들을 간단하고 직관적으로 설명했습니다. 필요에 따라 예시 코드와 설정 방법을 더 구체적으로 추가하거나, 각 상황에 맞는 다양한 설정 옵션을 소개할 수 있습니다.
728x90
'프로그래밍 > 스프링부트' 카테고리의 다른 글
Spring Data JPA 핵심 사항 (팟캐스트) (0) | 2025.04.30 |
---|---|
JPA 1차, 2차 캐쉬란? (2) | 2025.04.29 |
코프링 개발을 위한 가이드 (1) | 2025.02.28 |
Spring AI: 인공지능과 스프링 프레임워크의 완벽한 조화 (5) | 2024.09.28 |
JPA의 엔티티 매니저(Entity Manager) (0) | 2023.11.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 타입 안전성
- 코프링
- Java
- react.js
- JVM
- 자바
- springai
- 카프카 개념
- 스프링부트
- 코틀린
- RESTfull
- generated_body()
- 도커
- Stack Area
- 언리얼엔진
- unreal engjin
- First-class citizen
- model context protocol
- vite
- method Area
- 언리얼엔진5
- 디자인패턴
- Heap Area
- 스브링부트
- MCP
- JAVA 프로그래밍
- redis
- 일급 객체
- cqrs
- ai통합
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함