Super Kawaii Cute Cat Kaoani [인스타그램 클론 코딩][Spring boot] 12. AOP 처리

[인스타그램 클론 코딩][Spring boot] 12. AOP 처리

2024. 3. 1. 16:37
728x90
SMALL

📌 유효성 검사 자동화

  • 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

 

[인스타그램 클론 코딩][Spring boot] 11. 댓글 구현

📌 Comment Entity 구현 package yerong.InstagramCloneCoding.domain.comment; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.*; import yerong.InstagramCloneCoding.domain.BaseTimeEntity; import yer

nyeroni.tistory.com

NEXT

 

 

[인스타그램 클론 코딩][Spring boot] 13. 페이스북 소셜 로그인 구현

⚡️ OAuth2-client 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' ⚡️ facebook-developer에 등록 ⚡️ application-oauth.yml 설정 spring: security: oauth2: client: registration: facebook: client

nyeroni.tistory.com

 

728x90
SMALL

 

728x90
LIST

BELATED ARTICLES

more