empty result data access exception no class entity with id 1 exists

SaGo_MunGcci·2022년 8월 8일
0

스프링

목록 보기
16/31

Definition Access

  • 문제의 발단

좋아요 생성, 삭제, 생성하고 2번째 삭제때 사용하고 싶은 코드였다.

likesRepository.deleteById(member.getId());

그러나 삭제시 아래와 같이 오류가 발생했다.

  • org.springframework.dao.EmptyResultDataAccessException: No class com.sparta.jwt_refreshToken_Like_ReReply_AssignMent.domain.Likes entity with id 1 exists


Mechanism

  • 오류코드를 구글링해봤다.

1.deleteById

  • deleteById 코드를 하나씩 살펴보면 아래와 같은 내용이 구현되어있다.

  • deleteById 내부적으로 delete를 호출하고있다.
    넘어온 id값으로 findById를 사용하여 delete에 인자로 넘겨줄 데이터를 조회하고있다.

  • 넘어온 id 값이 null 인 경우는 EmptyResultDataAccessException 을 발생시키고 있다.

2.delete

  • delete 코드는 위 이미지에 보이는대로 넘어온 entity에 대해 null체크를 한 후 EntityManager를 통해 삭제를 진행하고있다.

  • deleteById와 delete의 차이점을 비교하는게 주된 목적이기 때문에 실제 삭제는 어떤 과정을 통해 진행하는지는 이 포스트에서는 분석하지 않고 넘어가도록 하겠다.

  • 두 메소드의 구현부를 분석해본 결과 deleteById와 delete는 완전 다른게 아니라 최종적으로는 delete를 호출하여 삭제를 하는걸 확인 할 수 있었다.

출처 : https://hwanchang.tistory.com/7

  1. 해결한 방법
  • 아래 코드가 문제였다.
likesRepository.deleteById(member.getId());
  • 이거 like 엔티티의 인덱스 값을 검색하는 것이다. member.getId()도 계속 1을 가지고 있어서 당연히 like엔티티의 인덱스 값은 1이 없는데
    인덱스 값을 1을 삭제하라고 하니까 발생한 오류였다.

  • 해결한 방법

  • likesRepository.deleteByMember_Id(member.getId());



Retrospection

  • 구글링도 좋지만 내 스스로 로직을 생각하는 것도 매우 중요하다고 깨달았다. 당연히 오류코드를 보고 문제접근을 생각하는 것도 오류를 해결하는 좋은 접근법이지만 오류를 처리하기 위해 오늘 내가 배운것 처럼 깊은?! 내용에 접근하게 되면 중간에 끊지 못하고 계속 공부하게 되어서 결국에는 내가 해결하고자 하는 오류가아닌 다른 것을 공부하고 있어서 길을 해매는 것이었다.

  • 어찌됐던 내가 이해한대로 위에 것을 오류나는 곳에 적용을 했으나 전혀 해결되지 않아서 잠깐 코딩을 멈추고 로직을 생각해보았다. 그리고도 문제가 없어서 같은 팀원분께 질문드렸는데 위와 같은 설명을 해주셔서 내가 놓쳤던 부분을 알게되었다.

  • 생각해보면 당연한게 likesRepository.deleteById(member.getId()); 이 코드는
    like엔티티의 id를 조회해서 삭제하는 것이고 따라서 당연히 삭제된 id를 검색하면 오류가 발생하는데 해당 코드의 로직과 이해를 하지않아서 오류와 조금 벗어난 것을 공부하고 오류는 즉각적으로 해결하지 못했다.

  • 앞으로도 항상 코딩과 개발공부를 할때 로직과 스스로 생각하는 것을 습관화 해야겠다.



profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글