- 웹 페이지의 대부분의 기능을 구현해보았으니 이번에는 메인 코드와 섞여 있는 유효성 검사 부분을 따로 뽑아내어 코드를 간결하고 보기 좋게 만들기 위해 AOP 처리를 진행해보겠습니다.
📝 의존성 추가
- AOP 처리를 위해서는 우선 아래와 같이 라이브러리를 추가해주어야 합니다.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.7.0</version>
</dependency>
📝 ValidationAdvice
- 이후 따로 패키지를 생성하여 아래와 같은 클래스를 구현해주었습니다.
- 해당 클래스는 대상 메서드의 파라미터 정보에
BindingResult
가 존재할 경우 유효성 검사를 수행하도록 구현되어있습니다.
package com.cos.photogram.handler.aop;
...
@Component
@Aspect
public class ValidationAdvice {
@Around("execution(* com.cos.photogram.web.*Controller.*(..))")
public Object advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
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();
}
@Around("execution(* com.cos.photogram.web.api.*Controller.*(..))")
public Object apiAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
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 CustomValidationApiException("유효성 검사에 실패하였습니다.", errorMap);
}
}
}
return proceedingJoinPoint.proceed();
}
}
@Aspect
: Aspect 역할을 할 클래스 선언@Around
: 대상 객체의 메서드 실행 전, 후 또는 예외 발생 시점에 공통 기능을 수행(이 외에도@Before
,@After
가 있음)ProceedingJoinPoint
: 개발 도중 호출되는 대상 객체에 대한 정보, 실행되는 메서드에 대한 정보, 메서드를 호출할 때 전달된 인자에 대한 정보에 접근할 수 있도록 하는 인터페이스getArgs()
: 파라미터의 목록을 구함
📝 Result
- 이후 기존에 컨트롤러에서 메인 코드와 섞여 있었던 유효성 검사 코드 부분을 모두 제거하고 결과를 살펴보면 여전히 잘 동작하는 것을 확인할 수 있습니다.
'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글
[Photogram] 검색 기능 구현 (0) | 2022.12.22 |
---|---|
[Photogram] OAuth2 페이스북 로그인 (0) | 2022.07.19 |
[Photogram] 댓글 구현 (0) | 2022.07.17 |
[Photogram] 프로필 사진 변경 (0) | 2022.07.16 |
[Photogram] 인기 페이지 구현 (2) | 2022.07.16 |