Search

34. 스프링부트 포토그램 인증 회원정보수정 Optional 처리하기

포토그램 인증 구현하기

회원정보 수정 구현

이번에는 뒷단에서 막아줄거다.
예를 들면 1번 유저를 수정해달라고 2번까지 진행되서 DB에 들어왔는데
DB에 1번유저에 대한 데이터가 없으면 문제가 생긴다. 그 부분을 잡아줄거다.
UserService.java 에서 id값을 10으로 변경하고 잠깐 진행해보면 (10번 유저에 대한 데이터가 현재 없다)
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException: No value present] with root cause java.util.NoSuchElementException: No value present at java.base/java.util.Optional.get(Optional.java:148) ~[na:na] at com.cos.photogramstart.service.UserService.회원수정(UserService.java:22) ~[classes/:na] at com.cos.photogramstart.service.UserService$$FastClassBySpringCGLIB$$2c07e270.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.6.jar:5.3.6] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.6.jar:5.3.6] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.6.jar:5.3.6] at com.cos.photogramstart.service.UserService$$EnhancerBySpringCGLIB$$6c1f53e7.회원수정(<generated>) ~[classes/:na] at com.cos.photogramstart.web.api.UserApiController.update(UserApiController.java:52) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
Java
복사
IllegalArgumentException을 사용하면서 존재 하지 않는 10번 데이터를 잘못 넣으면 "찾을 수 없는 id입니다. "라고 보내주면 된다
//1. 무조건 찾았다. 걱정마 get() 2. 못찾았어 익센션 발동시킬께 orElseThrow() User userEntity = userRepository.findById(10).orElseThrow(new Supplier<IllegalArgumentException>() { @Override public IllegalArgumentException get() { return new IllegalArgumentException("찾을 수 없는 id입니다. "); } });
Java
복사
다시 사이트에서 변경된 데이터를 제출하면은
java.lang.IllegalArgumentException: 찾을 수 없는 id입니다. at com.cos.photogramstart.service.UserService$1.get(UserService.java:28) ~[classes/:na] at com.cos.photogramstart.service.UserService$1.get(UserService.java:1) ~[classes/:na] at java.base/java.util.Optional.orElseThrow(Optional.java:408) ~[na:na] at com.cos.photogramstart.service.UserService.회원수정(UserService.java:25) ~[classes/:na] at com.cos.photogramstart.service.UserService$$FastClassBySpringCGLIB$$2c07e270.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.6.jar:5.3.6] . . . .
Java
복사
이런 식으로 오류가 찍힌다.
근데 이부분을 람다식으로 다시 수정하면은
User userEntity = userRepository.findById(10).orElseThrow(() -> { return new IllegalArgumentException("찾을 수 없는 id입니다. ");});
Java
복사
이렇게 변경해주면 된다
근데 이거를 글로벌 익셉션에서 낚아 채서 처리하면 좋다
ControllerExceptionHandler.java에서 IllegalArgumentException을 처리해줄 함수가 따로 없어서 CustomValidationApiException 부분을 재사용할거다. 낚아채서 공통으로 처리할거다.
CustomValidationApiException 변경해주면 에러가 나는데 그 이유는
CustomValidationApiException이 message와 errorMap을 받기로 되어있어서 그렇다.
그래서 생성자를 수정해주면 된다.
public CustomValidationApiException(String message) { super(message); }
Java
복사
message 한개만 받는 생성자를 추가해주면 된다.
이제 오류가 안뜬다.
없는 10번 유저의 데이터로 던져졌는데 null이라 뜬다.
ExceptionHandlerExceptionResolver[0;39m [2m:[0;39m Resolved [com.cos.photogramstart.handler.ex.CustomValidationApiException: 찾을 수 없는 id입니다. ]
Java
복사
update.js의 ajax의 실패 부분에서
error.responseJSON.data에가 null이라 뜨고 있다.
if(error.data == null)로 분기를 태워준다.
}).fail(error=>{ //HttpStatus 상태가 200번대가 아닐 때 console.log("update 실패", error.responseJSON.data) if(error.data == null){ alert(error.responseJSON.message); }else{ alert(JSON.stringify(error.responseJSON.data)); } });
Java
복사
지금까지 테스트하면서 꼬인 데이터가 있을 수 있어서
application.yml에 jpa의 create로 저장했다가 다시 update로 바꿔주자.

*참고