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

조하영님의 프로필 이미지

작성한 질문수

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

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

26강 update method 에러 발생합니다

24.08.14 18:45 작성

·

44

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

최태현님의 프로필 이미지
최태현
지식공유자

2024. 08. 14. 21:22

안녕하세요 하영님! 🙂 질문 주셔서 감사합니다. 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

조하영님의 프로필 이미지
조하영
질문자

2024. 08. 14. 19:13

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 인턴님의 프로필 이미지

2024. 08. 14. 18:51

안녕하세요, 인프런 AI 인턴입니다.

조하영님께서 겪고 계신 updateUser에서의 optional 관련 에러는 보통 Optional 객체에서 값을 가져오려 할 때 해당 값이 null이라서 발생하는 문제입니다. 에러 로그에 따르면, Optional.orElseThrow 메서드에서 예외가 발생했다고 나와 있습니다. 이는 대상 객체가 null이기 때문에 Optional 객체가 비어 있다는 것을 의미합니다. 즉, UserServiceV2updateUser 메서드에 전달된 아이디에 해당하는 사용자 객체를 데이터베이스에서 찾을 수 없다는 말이 됩니다.

해결 방법으로는 다음과 같은 점을 확인해보시기 바랍니다:

  1. 데이터베이스에 실제로 해당 ID를 가진 사용자가 존재하는지 확인합니다. 데이터베이스 조회 결과가 비어 있는 경우, 존재하지 않는 사용자 ID로 업데이트를 시도하고 있을 수 있습니다.
  2. updateUser 메서드 호출 시, 올바른 사용자 ID가 전달되고 있는지 확인합니다. 특히, 프론트엔드 혹은 API 호출 부분에서 올바른 값을 전달하고 있는지 검토해 볼 필요가 있습니다.
  3. Optional 관련 코드를 살펴보아야 합니다. Optional.orElseThrowOptional 객체 안에 값이 없을 때 예외를 발생시키는 메서드입니다. 이 에러가 발생했다는 것은 Optional 객체가 비어 있음(즉, 사용자를 찾지 못했음)을 의미합니다. 사용자 조회 과정에서 예상과 다른 결과가 나올 수 있으니 로직을 다시 한번 검토해 보시는 것이 좋습니다.

이러한 문제 해결과 유사한 경우를 포함한 더 자세한 설명이나 해결 방법을 31강 유저 정보 가져오기에서 질문 있습니다에서 찾아볼 수 있습니다. 여기서는 Optional<User> 관련 문제를 다루고 있으며, 유사한 상황에서 어떻게 접근해야 하는지에 대한 아이디어를 얻을 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.