amplitude.init("2e2e5a386856efdf3237cf254a9d14d9"

[챗GPT로 코딩 공부] 엔티티 삭제 오류 해결하기

내일배움캠프 수료생들은 챗GPT를 어떻게 개발 공부에 활용할까요?
Jul 09, 2024
[챗GPT로 코딩 공부] 엔티티 삭제 오류 해결하기
✍🏼
챗GPT, 개발 공부에 있어서 든든한 친구 같은 존재이죠. 내일배움캠프의 수강생들도 혼자 공부할 때에는 챗GPT의 도움을 받고 있는데요. 오늘은 내일배움캠프 수료생들의 챗GPT 경험담을 보고, 여러분의 개발 공부에 적용해봅시다.
 

엔티티 삭제 오류 해결하기

CascadeType.REMOVE 를 관련 엔티티에 설정하였음에도 일괄 삭제가 되지 않는 오류를 해결하였습니다.
Card 엔티티가 Comment 엔티티, Todo 엔티티와 일대다 관계를 맺고 있는 상황이었고, Card 엔티티 삭제 시에 관련 엔티티들도 자동으로 삭제되게끔 하려고 하였습니다.
이를 위해 Card 엔티티 필드에 아래와 같이 적어주었습니다.
@OneToMany(mappedBy = "card", cascade = CascadeType.REMOVE) private Set<Comment> commentList; @OneToMany(mappedBy = "card", cascade = CascadeType.REMOVE) private Set<Todo> todoList;
이런 식으로 적어주었습니다.
그러나 기대와 다르게 엔티티 삭제를 진행하여도 관련 엔티티들은 DB 상에 남아있었고 GPT에게 문제 해결을 요청하였습니다.
 
프롬프트: 위 코드처럼 cascade 옵션 설정했는데도 해당 엔티티를 삭제했을 때 디비에 남아있어
GPT는 네 가지 가능성을 알려주었습니다.
  1. DB 외래 키 제약 조건 - 외래 키 제약 조건으로 삭제가 제한될 가능성 ex) ON DELETE RESTRICT
  1. 트랜잭션 설정 확인 - @Transactional 썼니?
  1. 엔티티 상태 확인 - 컬렉션(Set)이 제대로 초기화되어있는지
  1. 삭제 코드 확인 - 엔티티 삭제 코드를 확인해 보시오. ‘올바르게 EntityManager 또는 JpaRepository를 통해 삭제가 이루어지고 있는지 확인합니다. 예를 들어, EntityManager.remove() 또는 JpaRepository.delete()를 사용하여 삭제합니다.’
1, 2, 3 번 경우는 코드 상에 이상은 없다고 판단할 수 있었지만 4번의 경우 제 코드와는 약간 달랐습니다.
해당 프로젝트에서는 QueryDSL을 도입했었기 때문에 Repository 메소드 내부에서 JPAQueryFactory.delete() 메소드를 통해 엔티티를 삭제하였기 때문입니다.
 
프롬프트: em.remove() 말고 queryDSL 상에서 지우고 있어
그 이후 다시 GPT에게 위와 같이 질문하였습니다.
GPT는 queryDSL에서 연관 엔티티를 삭제하는 방법과 이 오류가 발생하게 된 근본적인 원인에 대해 말해주었습니다.
  1. CascadeType.REMOVE와 QueryDSL의 조합: JPA의 CascadeType.REMOVE는 EntityManager의 remove() 메서드를 사용할 때만 자동으로 동작합니다. QueryDSL로 삭제할 경우 직접 연관된 엔티티를 삭제해 주어야 합니다.
이 답변과 추가적인 공부를 통해 Cascade 옵션은 JPA 상에서만 처리해 주는 것임을 알게 되었고 EntityManager을 사용할지 혹은 QueryDSL 상에서 연관 엔티티를 직접 delete할지 고민을 하게 되었습니다.
 
프롬프트: 연관 엔티티를 직접 삭제하는 것은 QueryDSL의 단점 아니야?
그러면서 또 하나의 의문이 생긴 것이 이건 QueryDSL의 단점이 아닌가? 하는 것이었습니다. 이 고민을 GPT에게 물어보니 또 하나의 명답을 내어주었습니다.
바로 QueryDSL의 주목적은 쿼리 작성을 편리하게 하는 것이지, 엔티티 라이프사이클 관리 기능을 대체하는 것은 아니라는 것이었습니다. 이 명답에 머리를 탁 치고 QueryDSL과 JPA를 함께 사용하는 방식으로 오류를 해결하였습니다.
 
운이 좋게도 삭제 코드에서의 문제인 것을 한 번에 알아챘습니다.
그러나 운이 없었다면은 제가 QueryDSL을 사용하고 있다는 것을 모르는 GPT 입장에서는 같은 질문에 대한 같은 대답을 계속하면서 무한 루프에 빠졌을 것 같습니다.
다음에는 엔티티 코드뿐만 아니라 서비스 단의 삭제 메서드, 레포지토리 단의 삭제 메서드를 같이 첨부한다면 GPT가 더 명쾌한 해답을 줄 것이라 생각합니다.
 

내일배움캠프가 여러분의 러닝메이트가 되어드리겠습니다

내일배움캠프의 많은 수강생들이 부트캠프 생활을 수료하고 현업에서 개발자로 활약하고 있습니다. 내일배움캠프는 모든 운영진이 교육, 특강, 12시간 밀착 케어, 찐한 관리, 인재 채용까지 열과 성을 다해 수강생들의 꿈을 지원하고 있습니다. 수많은 장애물을 넘을 수 있도록 내일배움캠프가 든든한 러닝메이트가 되어드리겠습니다. 내일배움캠프과 함께 여러분의 개발자 여정을 시작하세요.
 
 
CREDIT
글 | 장동하 내일배움캠프 수료생 편집 | 김진원 팀스파르타 객원 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
Share article
Subscribe to our newsletter
RSSPowered by inblog