Search

80. 스프링부트 포토그램 유효성검사 자동화 AOP처리 2탄

ValidationAdvice.java에 이어서 aop 작업을 해준다
함수의 매개변수에 어떤게 있는지 알아볼수있는 작업을 해준다
Object[] args = proceedingJoinPoint.getArgs(); for(Object arg : args) { System.out.println(arg); }
Java
복사
다시 타임라인에 가볼려니까
2023-10-14 17:56:37.646[0;39m [31mERROR[0;39m [35m2041[0;39m [2m---[0;39m [2m[nio-8080-exec-5][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.cos.photogramstart.domain.user.User.images, could not initialize proxy - no Session] with root cause org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.cos.photogramstart.domain.user.User.images, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final] at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:621) ~[hibernate-core-5.4.30.Final.jar:5.4.30.Final] at java.base/java.lang.String.valueOf(String.java:2951) ~[na:na]
Java
복사
User.images 관련해서 무한참조 오류가 다시 터졌다
User오브젝트를 sysout으로 찍으면서
User 안에 images를 호출하면서 Image 호출하고 계속 무한참조하게 되는데 이건 @JsonIgnoreProperties로도 막을수가없다
그래서
User.java에서
@Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + ", name=" + name + ", website=" + website + ", bio=" + bio + ", email=" + email + ", phone=" + phone + ", gender=" + gender + ", profileImageUrl=" + profileImageUrl + ", role=" + role + ", images=" + images + ", createDate=" + createDate + "]"; }
Java
복사
이 상태에서
이 부분만 삭제
그러면
@Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + ", name=" + name + ", website=" + website + ", bio=" + bio + ", email=" + email + ", phone=" + phone + ", gender=" + gender + ", profileImageUrl=" + profileImageUrl + ", role=" + role + ", createDate=" + createDate + "]"; }
Java
복사
이제 오류없이 잘 들어와진다
web 컨트롤러 =============================== web api 컨트롤러 ============================ PrincipalDetails(user=User [id=1, username=ssar, password=$2a$10$aF4k0ktQ6PzzZ7tXsUX53OO9AbVi9pbW2jHXGhjIeedunIABQNOmC, name=, website=null, bio=null, email=ssar@nate.com, phone=null, gender=null, profileImageUrl=20edb7bc-eadd-49ed-bfc3-96853ccdf497_피카츄프로필1.png, role=ROLE_USER, createDate=2023-10-07T21:49:52.961881]) Page request [number: 0, size 3, sort: UNSORTED]
Java
복사
해당 함수의 매개변수들도 잘 로그에 찍혔다 (밑에 이미지가 해당 함수의 매개변수)
댓글을 남기고 로그를 보면은
validation에 BindingResult타입이 있으면 ValidationAdviced에서 처리할수있다
Object[] args = proceedingJoinPoint.getArgs(); for(Object arg : args) { if(arg instanceof BindingResult) { System.out.println("유효성 검사를 하는 함수 입니다. "); } }
Java
복사
댓글쓰면은
잘찍힘~
CommentApiController에서 선처리로 했던 부분을 참고해서 추가해준다
@Around("execution(* com.cos.photogramstart.web.api.*Controller.*(..))") public Object apiAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("web api 컨트롤러 ============================"); Object[] args = proceedingJoinPoint.getArgs(); for(Object arg : args) { if(arg instanceof BindingResult) { System.out.println("유효성 검사를 하는 함수 입니다. "); BindingResult bindingResult = (BindingResult) arg; //에러가 존재한다면 if(bindingResult.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); for(FieldError error :bindingResult.getFieldErrors()) { errorMap.put(error.getField(), error.getDefaultMessage()); System.out.println("=============================="); System.out.println(error.getDefaultMessage()); System.out.println("=============================="); } throw new CustomValidationApiException("유효성 검사 실패함", errorMap); } } } // proceedingJoinPoint => profile 함수의 모든 곳에 접근할 수 있는 변수 // profile 함수보다 먼저 실행 return proceedingJoinPoint.proceed(); }
Java
복사
그리고 api폴더 안에 있는 ApiController에 작업해준 선처리 부분들을 지워준다.
CommentApiController
UserApiController
요렇게 두군데만 지워줬고 테스트를 해봐야한다
댓글같은 경우는 빈값으로 날려줘서 테스트 해야하기때문에
story.js에
해당 부분 주석
web api 컨트롤러 ============================ 유효성 검사를 하는 함수 입니다. ============================== 공백일 수 없습니다 ==============================
Java
복사
로그도 잘 찍힌다!
이제 advice함수 부분에 선처리 부분 추가해준다
AuthController함수에서 signup 부분 참고해서
@Around("execution(* com.cos.photogramstart.web.*Controller.*(..))") public Object advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //System.out.println("web 컨트롤러 ==============================="); Object[] args = proceedingJoinPoint.getArgs(); for(Object arg : args) { if(arg instanceof BindingResult) { BindingResult bindingResult = (BindingResult) arg; //에러가 존재한다 if(bindingResult.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); for(FieldError error :bindingResult.getFieldErrors()) { errorMap.put(error.getField(), error.getDefaultMessage()); } throw new CustomValidationException("유효성 검사 실패함", errorMap); } } } return proceedingJoinPoint.proceed(); }
Java
복사
이제 AuthController 에 작업했던 부분을 지워준다
회원가입부터 테스트를 할건데
signup.jsp 에서
요부분만 잠깐 테스트를 위해 지워주자
username 만 비워서 가입하면은
이것도 잘 처리된다

*참고