Spring

[Spring] 고아 객체

Paragon53 2025. 4. 17. 10:55

 

minecraft-font

Spring

 

🔥 고아 객체

    

JPA 에서 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 말한다.                                                                                                   

 

   ※ 계시글에서 댓글 하나를 삭제를 했는데 DB에서 연전히 댓글이 남아있다면....고아 객체(외톨이) 발생!!!


📌 고아 객체의 인생 요약 (비극 버전)

태어날 땐 Parent 덕분에 존재감 있었음

하지만 관계가 끊기자…

누구도 참조하지 않음

영속성 컨텍스트에서도 잊혀지고

결국 DB에서도 삭제됨

💀 “그 누구도 관심을 주지 않았다… 그래서 사라졌다.”


@Entity
public class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}
parent.getChildren().remove(child);

 

  •   child 는 parent와의 관계가 끊어짐
  •    orphanRemoval = true가 설정되어 있다. (기본값 false)
       CascadeType.ALL과 orphanRemoval = true를 함께 사용하는 경우 부모 Entity를 통해서 자식 Entity의 생명주기를 관리 할수 있다.
        도메인(Domain Driven Design)에 주로 사용한다.(자식 Entity는 별도의 Repository Layer가 없어도 된다.) 
  •    DB에서도 해당 child 레코드가 삭제된다.

 

⚠️ 주의점

  1. 참조하는 곳이 하나인 경우에만 사용한다.
    ● 단일 Entity에 완전히 종속적인 경우 생명주기가 같다면 사용한다.
  2. @OneToOne, @OneToMany만 사용이 가능하다.
      부모 Entity를 제거하면 자식 Entity는 고아 객체가 된다.
      CascadeType.REMOVE와 비슷하게 동작한다.