해결된 질문
작성
·
322
0
UpdateUser
사용시
deleteUser
사용시
2024-02-10 21:46:30.786 ERROR 10012 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] :
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is org.springframework.dao.IncorrectResultSizeDataAccessException:
query did not return a unique result: 2;
nested exception is javax.persistence.NonUniqueResultException:
query did not return a unique result: 2] with root cause
오류코드를 보니 updateUser는
findById의 결과값이 고유하므로 문제가 일어나지않는데,
deleteUser는 findByName으로 유저를 찾기때문에
같은 이름이 존재하면 결과값이 고유하지않으므로
오류가 발생하는거 같은데, (엄준식이 2명존재)
처음부터 Id 값을 받아오거나
생성시에 같은 이름을 못만들게 막는거 말고는
해결할 방법이 없을까요?
답변 2
1
안녕하세요 영후이님!! 정말 좋은 질문이십니다~~ 👍
이 부분은 사실 "교육적인 측면"이 크게 작용한 기능입니다. 말씀해주신 것처럼 기본적으로 delete
를 할때 "동명이인"이 있을 수 있는 상황에서 name
을 기준으로 제거하는 로직을 작성하면 안되기 때문이죠.
하지만 JpaRepository
에 있는 기본 기능인 deleteById()
외에 Spring Data JPA를 이용해서 쿼리를 만드는 방법을 쉽고 자연스럽게 알려드리기 위해 이름을 기준으로 삭제하는 기능을 넣은것입니다!
실제로는 다음과 같은 방법을 사용하는 것이 일반적입니다! 👍
특정 데이터에 대한 수정 / 삭제는 unique한 key를 기준으로 일어납니다.
예를들어 id
와 같은 PK는 unique하니 보통은 id
를 이용해 수정이나 삭제를 진행하게 됩니다.
따라서 엄준식 님이 2명 계시다면, 1번 엄준식님과 2번 엄준식님을 구분해서 삭제하게 되죠!
물론 지금 프로젝트에 이를 적용하려면 클라이언트 쪽 (화면 쪽) 코드도 같이 변경되어야 합니다.
답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙇
1
강의 뒷부분에 추가내용이 있군요 머쓱머쓱...;
근본적인 해결방법은 안되겠지만
findByNameAndAge(string name, int age)
이런식으로 하면 대상을 특정할때 범위를 줄일수 있겟군요..
답변 감사합니다!! 강의 너무 재밌어요 😊