작성
·
87
0
선생님이 해주신것과 똑같이 코드를 작성했는데 도서관리에서 사용자 이름을 수정하려고 하니 updateUser에서 optional 관련 에러가 발생합니다.
Hibernate:
select
user0_.id as id1_0_0_,
user0_.age as age2_0_0_,
user0_.name as name3_0_0_
from
user user0_
where
user0_.id=?
2024-08-14 18:42:17.084 ERROR 37216 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException] with root cause
java.lang.IllegalArgumentException: null
at java.base/java.util.Optional.orElseThrow(Optional.java:403) ~[na:na]
at com.group.libraryapp.service.user.UserServiceV2.updateUser(UserServiceV2.java:34) ~[main/:na]
at com.group.libraryapp.controller.user.UserController.updateUser(UserController.java:32) ~[main/:na]
db도 한번 삭제 후 다시 실행했는데 같은 에러가 발생하네요.. 이유와 해결방법이 궁금합니다..!
답변 3
0
안녕하세요 하영님! 🙂 질문 주셔서 감사합니다. where id = ?
로 되어 있는 것이 맞습니다!
아마 name을 기준으로 검색하는 것은 삭제하는 기능
으로 생각되어요.
현재 발생하고 있는
java.lang.IllegalArgumentException: null
at java.base/java.util.Optional.orElseThrow(Optional.java:403) ~[na:na]
에러는 인프런 AI 인턴이 말해준 것처럼 DB에 원하는 데이터가 없기 때문에 그렇습니다.
예를 들어, DB에 다음과 같은 데이터가 있다고 해보죠
유저 - id : 1 / name : 태현
그런데 제가 업데이트 요청을 (3, 김밥) 이라고 보냅니다. 3번 id를 가진 유저의 이름을 김밥으로 업데이트 하라는 의미이죠.
그럼 DB에 select * from user where id = 3;
라고 요청을 보내게 되는데 DB에는 3번 id를 가진 유저가 없으니 userRepository.findById(request.getId())
코드는 null이 들어 있는 Optional
을 반환하게 되고 orElseThrow
에 의해 예외가 터지게 됩니다.
즉 의도된 동작인거죠! 없는 유저를 업데이트 할 때는 예외가 발생하는게 맞으니까요! 🙂
답변이 도움이 되었으면 좋겠습니다. 감사합니다!
0
public void updateUser(UserUpdateRequest request){
User user = userRepository.findById(request.getId())
.orElseThrow(IllegalArgumentException::new);
user.updateName(request.getName());
userRepository.save(user);
}
Service2에서 작성한 update 코드입니다.
얼핏 지나가기로 봤는데 선생님 hibernate sql 코드로는 id가 아닌 name을 찾고 있는 것 같은데 저는 where id=? 로 작성되는 것 같아서 질문 드립니다 !
0
안녕하세요, 인프런 AI 인턴입니다.
조하영님께서 겪고 계신 updateUser
에서의 optional 관련 에러는 보통 Optional
객체에서 값을 가져오려 할 때 해당 값이 null
이라서 발생하는 문제입니다. 에러 로그에 따르면, Optional.orElseThrow
메서드에서 예외가 발생했다고 나와 있습니다. 이는 대상 객체가 null
이기 때문에 Optional
객체가 비어 있다는 것을 의미합니다. 즉, UserServiceV2
내 updateUser
메서드에 전달된 아이디에 해당하는 사용자 객체를 데이터베이스에서 찾을 수 없다는 말이 됩니다.
해결 방법으로는 다음과 같은 점을 확인해보시기 바랍니다:
updateUser
메서드 호출 시, 올바른 사용자 ID가 전달되고 있는지 확인합니다. 특히, 프론트엔드 혹은 API 호출 부분에서 올바른 값을 전달하고 있는지 검토해 볼 필요가 있습니다.Optional
관련 코드를 살펴보아야 합니다. Optional.orElseThrow
는 Optional
객체 안에 값이 없을 때 예외를 발생시키는 메서드입니다. 이 에러가 발생했다는 것은 Optional
객체가 비어 있음(즉, 사용자를 찾지 못했음)을 의미합니다. 사용자 조회 과정에서 예상과 다른 결과가 나올 수 있으니 로직을 다시 한번 검토해 보시는 것이 좋습니다.이러한 문제 해결과 유사한 경우를 포함한 더 자세한 설명이나 해결 방법을 31강 유저 정보 가져오기에서 질문 있습니다
에서 찾아볼 수 있습니다. 여기서는 Optional<User>
관련 문제를 다루고 있으며, 유사한 상황에서 어떻게 접근해야 하는지에 대한 아이디어를 얻을 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.