인프런 커뮤니티 질문&답변

영후이님의 프로필 이미지

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

26강. Spring Data JPA를 이용해 다양한 쿼리 작성하기

26강 삭제 기능관련 질문입니다..!!

해결된 질문

작성

·

318

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)

이런식으로 하면 대상을 특정할때 범위를 줄일수 있겟군요..