SpringBoot AOP 설정 1-1. AOP 설정

jeonbang123·2023년 3월 22일
0

springboot

목록 보기
4/14

AOP를 설정해보자

애스펙트(Aspect)란?

  • 애스펙트는 부가기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용하지를 결정하는 포인트컷(PointCut)을 합친 개념이다.

Advice + PointCut = Aspect

  • AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분해 낼수 있다.
  • 구분된 부가기능 애스펙트를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다.

어드바이스(Advice)

  • 어드바이스는 타겟에 제공할 부가기능을 담고 있는 모듈이다.

애스펙트(Aspect)

  • 애스펙트는 AOP의 기본 모듈이다.
  • 애스펙트 = 어드바이스 + 포인트컷
  • 애스펙트는 싱글톤 형태의 객체로 존재한다.

어드바이저(Advisor)

  • 어드바이저 = 어드바이스 + 포인트컷
  • 어드바이저는 Spring AOP에서만 사용되는 특별한 용어이다.

1. dependency 추가

<!--3. AOP -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. LoggerAspect 추가

package com.codesign.base.common.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


@Slf4j
@Aspect
@Component
public class LoggerAspect {

    private final String EXECUTION = "execution(* com.codesign.base..service..*(..))";


    @Around(EXECUTION)
    public Object printLog(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("@Around start");
        String name = joinPoint.getSignature().getDeclaringTypeName();
        log.info("@Around name : {}", name); // >>> com.codesign.base.member.service.impl.MemberServiceImpl

        long beforeTime = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long afterTime = System.currentTimeMillis();

        long secDiffTime = (afterTime - beforeTime);
        log.info("시간차이(m) : {}", secDiffTime);
        log.info("@Around end");
        return proceed;
    }

    @Before(EXECUTION)
    public void printBeforeLog() throws Throwable {
        log.info("@Before <<<<<<<<<<<<<<<<<<<<<<<<<<<< ");
    }

    @After(EXECUTION)
    public void printAfterLog() throws Throwable {
        log.info("@After >>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
    }

    @AfterReturning(EXECUTION)
    public void printAfterReturningLog() throws Throwable {
        log.info("@AfterReturning >>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
    }

    @AfterThrowing(EXECUTION)
    public void printAfterThrowingLog() throws Throwable {
        log.info("@AfterThrowing >>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
    }


}
  1. @Aspect
    Aspect 모듈화 선언

  2. AOP 표현식 - execuation()
    * com.codesign.base..service..*(..)

  • com.codesign.base.. : com.codesign.base 패키지 및 하위 패키지
  • service..: service 서비스 패키지 하위
  • *(..) 0개 이상의 인자를 받는 모든 메서드

    com.codesign.base 패키지 아래, service패키지 안에 있는 0개 이상의 인자를 받는 모든 메서드

  1. AOP Annotaion
속성
설명
@Around@Around 어노테이션에서만 ProceedingJoinPoint 를 인자로 받을 수 있다.
joinPoint.proceed();가 메서드를 실행하는 부분이고, 이 로직 실행전후 로직을 추가할 수 있다.
void로 만들면 메서드 실행결과가 리턴되지 않아 실행결과를 return 해줘야한다.
@Before메서드 실행전
@After메서드 실행후
@AfterReturning메서드 실행 성공
@AfterThrowing메서드 실행 실패

참고
https://engkimbs.tistory.com/746
https://shlee0882.tistory.com/206

profile
Design Awesome Style Code

0개의 댓글