☕ JPA 영속성 & 엔티티 관계 정리
🧩 [ JPA (Java Persistence API) ]
🔒 [ 영속성 (Persistence) ]
- Java 객체와 데이터베이스 데이터를 연결하는 개념
- 영속성 컨텍스트에 포함된 객체는 DB와 동기화된다.
| 상태 | 설명 |
|---|
| 영속 상태 | Java 객체가 영속성 컨텍스트에 포함되어 DB 데이터와 연결된 상태 |
| 비영속 상태 | Java 객체가 영속성 컨텍스트에 포함되지 않아 DB와 연동되지 않음 |
| 준영속 상태 | 영속성이 일시적으로 해제된 상태 (detach 등으로 관리 중단) |
💡 영속 중이라면, Java 객체의 데이터를 수정하면 DB 데이터도 자동으로 수정된다.
🔗 [ 엔티티 관계 (Entity Relationship) ]
🔹 [ 단방향 연결 (Unidirectional) ]
- 하위 엔티티가 상위 엔티티를 참조하는 관계
- N : 1 (ManyToOne) 구조 — 여러 개의 FK가 하나의 PK를 참조한다.
📘 설정 방법
@ManyToOne
@JoinColumn(name = "FK_필드명")
private ParentEntity parent;
⚙️ [ ManyToOne 제약 조건 옵션 ]
🧩 cascade (연쇄 작업 설정)
| 옵션 | 설명 |
|---|
CascadeType.ALL | 부모의 삭제/수정/저장 시, 자식도 동일하게 처리 |
CascadeType.PERSIST | 부모 저장 시, 자식도 함께 저장 |
CascadeType.MERGE | 부모 수정 시, 자식도 함께 수정 |
CascadeType.REMOVE | 부모 삭제 시, 자식도 함께 삭제 |
CascadeType.REFRESH | 부모 재조회 시, 자식도 함께 재조회 |
CascadeType.DETACH | 부모 영속 해제 시, 자식도 함께 영속 해제 |
⚙️ fetch (조회 전략)
| 옵션 | 설명 |
|---|
FetchType.EAGER | 부모 엔티티를 조회할 때, 자식 엔티티를 즉시 조회 |
| 🔹 기본값 (ManyToOne 기본값은 EAGER) |
| ⚠ 초기 로딩이 느려질 수 있으며, 불필요한 데이터까지 가져올 위험 존재 |
FetchType.LAZY | 부모 엔티티 조회 시, 자식 엔티티는 지연 조회 (필요 시 로드) |
| 🔹 성능 최적화 가능 |
| 🔹 참조엔티티.getXXX() 호출 시 실제 DB 조회 진행 |
⚙️ 권장: 실제 서비스에서는 대부분 fetch = FetchType.LAZY 사용
🔸 [ 양방향 연결 (Bidirectional) ]
- 상위 엔티티가 하위 엔티티를 참조하는 구조
- 1 : N (OneToMany) 관계 — 하나의 PK가 여러 FK를 참조한다.
📘 설정 방법
@OneToMany(mappedBy = "parent")
@ToString.Exclude
@Builder.Default
private List<ChildEntity> childList = new ArrayList<>();
⚙️ [ OneToMany 제약 조건 옵션 ]
| 옵션 | 설명 |
|---|
mappedBy | 상대 엔티티에서 참조하고 있는 변수명을 지정 (FK 보유 측) |
💡 주의: 양방향 연결에서는 mappedBy가 없는 쪽이 FK를 소유하는 주인(Entity Owner) 이 된다.
🧾 요약
| 항목 | 설명 |
|---|
| ☕ 영속성 | Java 객체와 DB 데이터를 동기화하는 상태 관리 메커니즘 |
| 🔗 단방향 연결 | 하위(Entity)가 상위(Entity)를 참조 (@ManyToOne) |
| 🔄 양방향 연결 | 상위(Entity)가 하위(Entity)를 참조 (@OneToMany(mappedBy="")) |
| ⚙️ Cascade 옵션 | 부모 조작 시 자식의 연쇄 처리 설정 |
| 🧠 Fetch 전략 | EAGER: 즉시 로딩 / LAZY: 지연 로딩 (성능 최적화용) |