* AOP (Aspect Oriented Programming)

  • 스프링의 대표적인 특징 중 하나로, DI, IoC, POJO와 같이 언급되는 특징이다. 직역하면 관점 지향 프로그래밍인데, 의미가 크게 와닿지 않는다.

  • 흩어진 관심사를 공통적으로 관리하는 것인데, 보통 로깅, DB 연결, 보안 등에서 사용된다. 일종의 모듈화인 듯 하다.

* AOP 주개념

  • Aspect : 흩어진 관심사를 모듈화한 것
  • Advice : 실질적으로 어떤 일을 해야하는지의 정보
  • Pointcut : 어디에 적용해야하는지의 정보
  • Target : Aspect의 적용 대상
  • Join point : Advice가 적용될 위치, 끼어들 지점. (메서드 진입·종료, 생성자 호출 등)

* AOP 적용

  • AOP는 스프링 프로젝트 내에서, 스프링 설정 파일(gradle, xml …)에 의존성을 추가하여 사용한다.

  • 다음과 같은 Annotation을 사용한다.

  1. @Aspect : AOP로 정의하는 클래스 지정
  2. @PointCut : AOP 기능을 메소드, Annotation 등 어디에 적용시킬지 지점을 설정
  3. @Before : 메소드 실행하기 이전
  4. @After : 메소드가 성공적으로 실행 후
  5. @Around : 메소드 호출 전,후 기능 수행(After + Before)
@Aspect
@Component
public class LogingAop {

    // com.example.test.conteroller 하위 모두 적용
    @Pointcut("execution(* com.example.test.controller..*.*(..))")
    private void logingPointCut() {}


    // loginPointCut 메소드 실행 이전에 before() 실행
    @Before("loginPointCut()")
    public void before(JoinPoint joinPoint) {


        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        System.out.println(method.getName() + " 메소드 실행");

        // 메소드 호출 시 사용되는 파라미터 ex) localhost:8080?get10 -> 10 반환
        Object[] args = joinPoint.getArgs();
        for(Object obj : args) {
            System.out.println("Type : " + obj.getClass().getSimpleName());
            System.out.println("Value : " + obj);
        }

    }

    // loginPointCut 메소드 종료 때 afterReturning 실행
    // 메소드 종료시 반환값 출력
     @AfterReturning(value = "loginPointCut()", returning = "obj")
    public void afterReturn(JoinPoint joinPoint, Object obj) {
        System.out.println("return obj : " + obj);
    }


}