포토그램 인증 구현하기
회원정보 수정 구현
이번에는 뒷단에서 막아줄거다.
예를 들면 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로 바꿔주자.