본문 바로가기
mybatis

springboot with mybatis - foreign key로 연결된 행 삭제

by khds 2023. 4. 9.

이 글은 JPA로만 프로젝트를 진행하다가 mybatis를 사용할 때 발생하는 문제중 고아객체에 관한 내용을 담고 있다.

 

저번 프로젝트에서 스프링부트와 JPA로 진행을 하였는데 delete 쿼리를 날릴 때 고려한 것은 고아객체였다.

외래키로 연관관계에 있는 두 엔티티 부모를 삭제하면 부모의 외래키를 가지고 있는 자식은 어떻게 되는가? 에 대한 내용이 고아객체 내용이다.

JPA에서는 부모객체가 삭제되어 없는 상황일 때  자식객체를 고아객체로 표현하였고 이를 객체 내의 어노테이션을 달아서 해결했었다. 그렇다면 Mybayis에서 어떻게 해결할까?

처음에는 고아객체가 데이터베이스 전체에서 쓰이는 말인줄 알았지만 알고보니 JPA에서만 사용되는 말이었다. 그렇기에 Mybatis 고아객체라고 검색을 해도 인터넷에는 나오지가 않았다.

알아본 바로는 Mybatis에서 직접적으로 설정하지 않고 데이터베이스 상에서 해결한다고 한다.

Mysql에서는 외래키를 생성할 때 ON DELETE CASCADE 속성을 추가하면 해결할 수 있다고 한다.

아래의 코드처럼 말이다.

alter table article
add constraint article_member_id_foreign_key
foreign key (member_id)
references member (id)
on delete cascade;

 

 

참고 

https://velog.io/@eensungkim/ON-DELETE-CASCADE-feat.-row-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%A7%80%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-TIL-78%EC%9D%BC%EC%B0%A8

 

ON DELETE CASCADE (feat. foreign key 로 연결된 row 한 번에 지우는 방법) (TIL 78일차)

DELETE 는 테이블 내의 레코드를 삭제할 때 사용하는 명령어입니다. 학생에 관한 정보를 모아둔 위와 같은 테이블이 있다고 할 때, DELETE 를 활용하면 조건에 따라 개별 학생의 정보가 담긴 row 를

velog.io