728x90
320x100
📌 유효성 검사 자동화
- AOP : Aspect Orientied Programing - 관점 지향 프로그래밍
- 관점 지향 프로그래밍 + 객체 지향 프로그래밍 함께 사용할 것
✅ 로그인
- 전처리 : 유효성 검사, 보안처리
- username, password 입력 ➡️ DB select ➡️ 로그인(세션)
- 후처리 : 몇시 몇분에 로그인 했는지 정보 남기기
✅ 회원가입
- 전처리 : 유효성 검사, 보안처리
- username, password, address 등 입력받음 ➡️ DB insert
- 후처리 : 몇시 몇분에 회원가입 했는지 정보 남기기
⭐️ 공통 기능(전처리, 후처리)과 핵심 기능이 있음
- 공통 기능 : 필터 처리 ➡️ AOP 처리
- 핵심 기능 : 직접 구현
⚡️ gradle에 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-aop'
⚡️handler.aop.ValidationAdvice.class
package yerong.InstagramCloneCoding.handler.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import yerong.InstagramCloneCoding.handler.exception.CustomValidationApiException;
import yerong.InstagramCloneCoding.handler.exception.CustomValidationException;
import java.util.HashMap;
import java.util.Map;
@Component
@Aspect
@Slf4j
public class ValidationAdvice {
@Around("execution(* yerong.InstagramCloneCoding.web.api.*Controller.*(..))")
public Object apiAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("===web api controller===");
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
if(arg instanceof BindingResult){
log.info("유효성 검사를 하는 함수입니다.");
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();
}
@Around("execution(* yerong.InstagramCloneCoding.web.controller.*Controller.*(..))")
public Object advice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("===web controller===");
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
if(arg instanceof BindingResult){
log.info("유효성 검사를 하는 함수입니다.");
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();
}
}
- proceedingJoinPoint : 해당 파일에 있는 클래스들 함수의 모든 곳에 접근할 수 있는 변수
- 해당 함수들보다 여기가 먼저 실행됨
- 다른 컨트롤러에서 BindingResult 관련 if문 코드를 지우고 여기에 옮겨놓음 -> 전처리
PREV
NEXT
728x90
반응형
'프로젝트 > 인스타그램 클론 코딩' 카테고리의 다른 글
[인스타그램 클론 코딩][Spring boot] 13. 페이스북 소셜 로그인 구현 (0) | 2024.03.02 |
---|---|
[인스타그램 클론 코딩][Spring boot] 11. 댓글 구현 (0) | 2024.03.01 |
[인스타그램 클론 코딩][Spring boot] 10. 좋아요 및 인기 페이지 구현 (0) | 2024.02.23 |
[인스타그램 클론 코딩][Spring boot] 9. 스토리(메인) 페이지 (0) | 2024.02.22 |
[인스타그램 클론 코딩][Spring boot] 8. 구독 정보 뷰 렌더링 (0) | 2024.02.21 |