본문 바로가기
✨ Back-end/Spring-Boot

[Spring] 부트에서 AOP 의존성 추가하고 사용하기 @Aspect

by 환풍 2023. 9. 18.
728x90

 

 

[Spring] AOP 개념과 용어 8가지

AOP란? 관점지향 프로그래밍으로, 문제를 바라보는 관점을 기준으로 프로그래밍 하는 방법론 what when where 횡단관심사(cross-cutting-concerns) 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스

bright-landscape.tistory.com

AOP에 대해 알아보고 싶다면 위 포스팅으로.

 

build.gradle

 

1
2
3
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-aop'
}
cs

위 코드를 build.gradle에 추가시켜준다.

 

application.properties에 가서 나는 로깅 레벨을 info로 찍을 것이기 때문에 위와 같이 코드를 짰다.

 

LoggingAspect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.bit.bitduzon.aop;
 
import java.util.Arrays;
 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
@Aspect
public class LoggingAspect {
 
    private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
    @Before(value = "execution(* com.bit.bitduzon.service.*Service*.*(..))")
    public void loggin(JoinPoint joinPoint) {
        logger.info("메서드 선언부 BEFORE : {} 전달 파라미터 : {}", joinPoint.getSignature(), Arrays.toString(joinPoint.getArgs()));
    }
 
    @AfterReturning(value = "execution(* com.bit.bitduzon.service.Board*.*(..))", returning = "obj")
    public void afterReturningMethod(JoinPoint joinPoint, Object obj) {
        logger.info("afterReturning call method : {} ", joinPoint.getSignature());
        logger.info("return value : {}", obj);
    }
}
cs

현재 위 코드에서는 @Before과 @AfterReturning 만 지정해주었다.

@Component를 통해 스프링 컨테이너에 의해 관리되는 빈으로 등록하고, @Aspect는 Aspect로 사용됨을 나타낸다.

Aspect란?

Spring AOP에서 사용되는 개념으로, 애플리케이션의 여러 위치에서 공통적으로 사용되는 부가적인 기능을 하나의 모듈로 추상화한 것이다.

 

@Before : 지정된 패키지의 모든 서비스클래스의 모든 메서드 실행 전에 실행된다. 
@AfterReturning : 메서드의 반환 값을 받아오기 위해 사용한다.
value : 어드바이스를 적용할 Pointcut을 지정한다.
JoinPoint : 어드바이스가 적용된 메서드에 대한 정보를 제공하는 객체이다. 해당 메서드의 시그니처 등 정보를 얻기 위해 사용된다.

로깅을 찍어보면 이렇게 해당 Service가 실행될 때 마다 데이터가 찍히는 것을 확인할 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
    @AfterThrowing(value = "execution(* com.bit.bitduzon.service.Board*.*(..))", throwing = "exception")
    public void afterThrowingMethod(JoinPoint joinPoint, Exception exception) {
        logger.info("afterThrowing call method : {}", joinPoint.getSignature());
        logger.info("exception : {}", exception);
    }
 
    @After(value = "execution(* com.bit.bitduzon.service.Board*.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        logger.info("after call method : {}", joinPoint.getSignature());
    }
cs

위 두 메소드들을 추가해줬다.

@AfterThrowing : 메서드 실행 중 예외가 발생했을때 실행된다.
throwing = "exception" 은 Advice 메서드의 파라미터로 예외 객체를 받는다.
@After : 메서드 실행 후 항상 실행된다.

예외는 발생하지 않았고, @After가 정상적으로 실행된 것을 확인할 수 있다.

반응형

댓글