@ManyToOne
JPA(Java Persistence API)의 일부이며 두 엔티티 간의 다대일 관계를 설정하는데 사용됩니다.
예를 들어, 많은 예약이 동일한 객실에 연결될 수 있습니다.
한 엔터티(예: 'BookedRoom')의 여러 인스턴스가 다른 엔터티(예: 'Room')의 한 인스턴스와 연결되어 있음을 나타냅니다.
fetch = FetchType.LAZY
FetchType.LAZY
- 지연 로딩: 엔터티를 느리게 가져오는 경우, 이는 엔터티 데이터가 특별히 요청될 때까지 데이터베이스에서 로드되지 않음을 의미합니다. 이는 상위 엔터티가 검색될 때 관련 엔터티의 데이터가 즉시 로드되는 즉시 로드와 대조됩니다.
- 지연 로딩의 이점:
- 성능: 지연 로딩은 필요할 때까지 관련 엔터티의 로드를 지연함으로써 특히 관련 데이터가 크거나 항상 필요하지 않은 경우 초기 로드 시간과 메모리 사용량을 크게 줄일 수 있습니다.
- 리소스 관리: 필요할 때만 데이터를 가져와 시스템 리소스를 보다 효율적으로 관리하는 데 도움이 됩니다.
예를 들어
- 데이터베이스에서 'BookedRoom' 개체를 검색하면 이와 연결된 'Room' 개체가 자동으로 로드되지 않습니다.
- 'BookedRoom'을 검색한 후 'room' 필드에 액세스하면 JPA는 해당 시점에 데이터베이스에서 'Room' 데이터를 가져옵니다(지연 로딩이라고 함).
@OneToMany
두 엔터티 클래스 간의 일대다 관계를 설정하는 데 사용됩니다. 이는 개체 관계형 매핑(ORM)에서 엔터티가 어떻게 관련되고 이러한 관계가 데이터베이스 작업에 어떤 영향을 미치는지 정의하는 데 사용되는 일반적인 주석입니다.
한 클래스의 엔터티 컬렉션에 사용되어 이 컬렉션의 각 엔터티가 컬렉션을 보유하는 엔터티와 다대일 관계를 가지고 있음을 나타냅니다. 예를 들어 'Room' 엔터티에는 많은 'BookedRoom' 엔터티가 있을 수 있습니다.
cascade = CascadeType.ALL
CascadeType.ALL
상위 엔터티에서 발생하는 모든 계단식 작업(지속, 제거, 새로 고침, 병합, 분리)이 연결된 하위 엔터티에도 적용되어야 한다는 JPA 제공자에 대한 지침입니다.
예를 들어 Room 엔터티가 제거되면 컬렉션의 모든 관련 BookedRoom 엔터티도 데이터베이스에서 제거됩니다.
포함된 작업:
- PERSIST: 상위 엔터티가 지속되면 연결된 모든 하위 엔터티도 지속됩니다.
- REMOVE: 상위 엔터티가 제거되면 연결된 모든 하위 엔터티도 제거됩니다.
- MERGE : 상위 엔터티가 병합되면 연결된 모든 하위 엔터티도 병합됩니다.
- REFRESH : 상위 엔터티가 새로 고쳐지면 연결된 모든 하위 엔터티도 새로 고쳐집니다.
- DETACH: 상위 엔터티가 지속성 컨텍스트에서 분리되면 연결된 모든 하위 엔터티도 분리됩니다.
@ManyToOne, @OneToMany 같이사용해야할까요?
다음과 같은 경우 함께 사용하는 것이 일반적입니다.
- 양방향으로 관계 탐색: 애플리케이션이 하위 항목의 상위 엔터티와 상위 항목의 하위 컬렉션 모두에 액세스하도록 할 수 있습니다.
- 데이터 무결성 보장 및 계단식 작업 관리: 예를 들어 상위 엔터티가 유지되거나 삭제될 때 하위 엔터티를 자동으로 유지하거나 삭제할 수 있습니다.
고려사항
- 필요할 때 함께 사용: 관계에 대한 양방향 액세스 및 관리가 필요할 때 두 주석을 모두 사용합니다. 관계의 한 방향만 필요한 경우 주석 중 하나만 정의하도록 선택할 수 있습니다.
- 성능에 미치는 영향: 양방향 관계는 매우 유용하지만 주의 깊게 관리하지 않으면 특히 지연 및 열성 가져오기 구성 측면에서 성능 저하로 이어질 수 있습니다.
- 단순성 대 복잡성: 때로는 양방향 기능이 필요하지 않은 경우 ORM 계층의 복잡성과 오버헤드를 줄일 수 있으므로 단순한 단방향 관계를 갖는 것이 더 나을 수도 있습니다..
예시
@Entity
public class Room {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "room", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<BookedRoom> bookings;
}
@Entity
public class BookedRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long bookingId;
@ManyToOne
@JoinColumn(name = "room_id")
private Room room;
}반응형
'Java > Spring' 카테고리의 다른 글
| [Spirng] 엔티티 생성, 수정시간 추가 (0) | 2024.05.16 |
|---|---|
| [Spirng] CORS 처리하는 법 (0) | 2024.04.30 |
| [Java] DTO 쉽게 만드는 법 (record) (0) | 2024.04.27 |
| [Spring]Jpa를 이용하여 검색기능 사용하기(pageable 사용) (0) | 2024.04.08 |
| [Spring]@PageableDefault (페이징 처리) (0) | 2024.04.08 |