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

준영님의 프로필 이미지
준영

작성한 질문수

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

32강. 반납 기능 개발하기

스스로 찾고싶었지만 이 이상 찾을 수가 없습니다..

작성

·

221

·

수정됨

0

안녕하세요 이번강의에서 후반부까지는 잘 되었다가 마지막 과정에서 막혀서 질문 드립니다.

우선 오류가 났다고 생각하는곳은 Id와 BookName으로 대출기록을 불러오고 doReturn을 불러오는 과정에서

예외가 발생되었고 예외가 발생되었기때문에 아이디와 책 이름이 일하는기록이 없어서 예외가 나왔다고 생각했습니다.

하지만 터미널로 sql문을 이용해 찾아봐도

user_loan_history의 user_id와

user의 id가 같았습니다.

이 이상 Id대신 이름을 getName을 해봐도 오류가 나서 진행을 못하는 상황입니다.. 오류의 원인이 뭔지 알 수 있을까요sql.pngBookRepository.pngreturnBook.png

2024-03-22 17:03:37.674 ERROR 84411 --- [nio-8080-exec-1] 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.book.BookService.returnBook(BookService.java:71) ~[classes/:na]
	at com.group.libraryapp.Service.book.BookService$$FastClassBySpringCGLIB$$1faa236c.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.24.jar:5.3.24]
	at com.group.libraryapp.Service.book.BookService$$EnhancerBySpringCGLIB$$892e8bee.returnBook(<generated>) ~[classes/:na]
	at com.group.libraryapp.controller.book.BookController.returnBook(BookController.java:32) ~[classes/:na]
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.24.jar:5.3.24]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:699) ~[tomcat-embed-core-9.0.69.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar:5.3.24]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.69.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.69.jar:9.0.69]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar:5.3.24]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar:5.3.24]

답변 3

0

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

안녕하세요 준영님!

데이터베이스 상황과 API를 호출할 때 파라미터로 들어온 값들을 알면 보다 정확한 진단이 가능할 것 같은데요, 우선 보내주신 로그로 가장 먼저 의심해 볼 수 있는 상황은 Optional.orElseThrow() 로 인해 에러가 발생하는 상황입니다!

즉, 보내주신 에러를 기준으로 BookService.java:71 에서 데이터베이스에서 데이터를 가져오려 했으나 조건에 맞는 데이터가 없어 실패한거죠!

 

따라서

  1. 애플리케이션에서 어떤 SQL이 DB로 보내졌고,

  2. 해당 SQL을 만족하는 데이터가 DB에 있는지

확인해보시면 좋을 것 같습니다.

감사합니다! 🙏

0

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

AI가 말 한 대로 불러오질못해서 일단 자동으로 올라가는값을 잡지 못하는건가 싶어서 자동으로올라가는값도 초기화 시켜봤지만 동일하게 안되었습니다.

0

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

준영님의 질문과 관련된 오류는 java.lang.IllegalArgumentException: null에 관한 것으로, 특히 returnBook 메서드 실행 중 발생한 것으로 보입니다. 이는 주로 Optional.orElseThrow() 메서드가 null 값을 반환할 때 발생하는 문제와 연관이 있습니다. 이는 특정 객체나 데이터를 찾으려 했으나 찾지 못했음을 의미합니다.

준영님의 코드나 오류 메시지를 기반으로, 정확한 문제의 원인을 알려드리기 어렵지만, 비슷한 상황에서 발생한 오류를 다룬 내용을 찾았습니다. 이는 “대출 기록이 없어 예외가 발생하는 경우”에 대한 것으로, returnBook 기능에서 대출 기록을 찾거나 처리하는 과정에서 예외가 발생할 수 있음을 언급합니다.

  • ”[31강]오류를 찾아 내지 못하겠습니다.” - 이 게시물에서는 유사한 java.lang.IllegalArgumentException: null 오류를 겪은 다른 수강생의 질문에 대해 강사님이 제공한 답변을 확인할 수 있습니다. 강사님은 Optional.orElseThrow()에서 발생하는 예외가 주로 DB에서 예상하는 데이터를 찾지 못했을 때 발생한다고 설명합니다. 디버깅 팁으로는, API 호출 시 넘긴 데이터나 대출 기록 조회 로직을 다시 검토해 볼 것을 권장합니다.

비록 이 답변이 준영님의 코드에서 발생한 구체적인 문제를 해결하지 못할 수도 있지만, 문제 해결을 위한 일반적인 방향을 제시할 수 있을 것입니다. 대출 기록을 조회하고, 처리하는 로직 내부에서 발생할 수 있는 예외 상황(예: DB에서 대출 기록을 정상적으로 찾지 못하는 경우)을 다시 한 번 점검해 보실 것을 추천드립니다.

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

준영님의 프로필 이미지
준영

작성한 질문수

질문하기