spring jpa에서는 영속성 전이를 통해 객체를 좀 더 쉽게 관리할 수 있다.

자주 사용하는 기능으로는 CASCADE 옵션이 있는데,

@Entity
public class Company {
    @OneToMany(mappedBy = "company",cascade = CascadeType.ALL)
    private List<Image> images;
}

Company 클래스에서는 Image 객체를 연관된 리스트로 가지고 있다.

옵션 값으로 CascadeType.All로 영속성 전이를 설정해주었다.

company.getImages().remove(image);
companyRepository.save(company);

처음에 나는 image 리스트를 비워주고 이를 save 했으니까, 해당 company의 image 객체들이 전부 제거가 될 줄 알았다.

하지만 이 경우, 영속성 컨텍스트에서만 해당 엔티티가 제거 되고, 실제 DB에서는 제거되지 않는다. 그렇게 되면 바로 외래키 제약 위반으로 오류가 발생할 수 있다.(나의 경우는 아무런 쿼리가 날아가지 않았다.)

한 가지 생각할 점은 부모 - Company 엔티티 객체 자체가 삭제되는 경우에는 자식도 영속성 전이로 제거가 된다는 점이다. 컬렉션에서 연관관계 객체를 제거할 때만 위 이슈가 발생한다.

해당 이슈를 해결하기 위해서는 추가로 orphanRemoval = true 옵션을 걸어주어야 한다.

해당 옵션을 추가하면 jpa에서 고아객체를 자동으로 삭제하게 된다.

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Image> images;