✅ 영속성 전이(Cascade)란


@Entity
class Parent(
	@Id @GeneratedValue
	var id: Long? = null,
	
	@OneToMany(mappedBy = "parent" cascade = [CascadeType.PERSIST, CascadeType.REMOVE])
	val children: MutableList<Child> = mutableListOf()
) {
	fun addChild(child: Child) {
		children.add(child)
		child.parent = this
	}
}

@Entity
class Child(
	@Id @GeneratedValue
	val id: Long? = null,
	
	@ManyToOne
	var parent: Parent? = null
)

✅ CascadeType 종류와 의미

CascadeType 설명
PERSIST 부모 저장 시 자식도 자동으로 persist()
REMOVE 부모 삭제 시 자식도 자동으로 삭제됨
MERGE 부모 병합 시 자식도 병합됨
REFRESH 부모를 DB 상태로 새로고침할 때 자식도 새로고침됨
DETACH 부모 detach 시 자식도 detach
ALL 위 모든 cascade 동작 포함

✅ 고아 객체 제거(Orphan Removal)

@OneToMany(mappedBy = "parent", orphanRemoval = true)
val children: MutableList<Child> = mutableListOf()

// 이렇게 사용했을 때 해당 child 객체에 대해 DELETE 쿼리 발생
parent.children.remove(child)

✅ 실무에서 자주 사용되는 패턴(집합적 생명주기 - aggregate root)

@OneToMany(mappedBy = "parent", cascade = [CascadeType.ALL], orphanRemoval = true)