Spring Boot

[Spring] AOP

어코링 2024. 4. 17. 14:10

AOP란

- Spring AOP는 스프링 프레임워크에서 제공하는 기능 중 하나로 관점 지향 프로그래밍을 지원하는 기술입이다.

 Spring AOP는 로깅, 보안, 트랜잭션 관리 등과 같은 공통적인 관심사를 모듈화 하여 코드 중복을 줄이고 유지 보수성을 향상하는데 도움을 준다.

 

관점 지향 프로그래밍(Aspect-Oriented Programming, AOP) 이란?

- 객체 지향 프로그래밍 패러다임을 보완하는 기술로 메소드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것을 말한다. “핵심 관심사”는 각 객체가 가져야 할 본래의 기능이며, “공통 관심사”는 여러 객체에서 공통적으로 사용되는 코드를 말한다.

 

Spring 공부를 하면 한번쯤은 들어봤을법한 AOP

관점 지향 프로그래밍을 지원하는 것.. 이론적인 것은 알고 있지만 

이걸 어떻게 활용할지는 몰랐다. 

 

그런데 메서드들을 시간을 측정해야하는 일이 생겨,

메서드들을 하나씩 시간소요를 측정하다보니 공통된 모듈을 만들어서 반복적인 코드 사용을 줄이고, 

하나의 모듈을 따로 모듈화 시켜서 필요한 부분에 적용시키는 것이 낫겠다는 판단에 AOP를 활용해보기로 했다.

 

 

 


Spring AOP 적용하기

1. 주요 용어

용어 설명
Aspect 공통적인 기능들을 모듈화 한 것을 의미
Target Aspect가 적용될 대상을 의미하며 메소드, 클래스 등이 이에 해당됩니다.
Join point Aspect가 적용될 수 있는 시점을 의미하며 메소드 실행 전, 후 등이 될 수 있습니다
Advice Aspect의 기능을 정의한 것으로 메서드의 실행 전, 후 예외 처리 발생 시 실행되는 코드를 의미
Point cut Advice를 적용할 메소드의 범위를 지정하는 것을 의미

 

2. 주요 어노테이션

메서드 설명
@Aspect 해당 클래스를 Aspect로 사용하겠다는 것을 명시
@Before 대상 "메서드"가 실행되기 전에 Advice를 실행
@AfterReturning 대상 "메서드"가 정상적으로 실행되고 반환된 후에 Advice를 실행
@AfterThrowing 대상 "메서드에서 예외가 발생"했을 때 Advice를 실행
@After 대상 "메서드"가 실행된 후에 Advice를 실행
@Around 대상 "메서드" 실행 전, 후 또는 예외 발생 시에 Advice를 실행

 

3. Spring AOP 환경설정하기

3-1. pom.xml에 dependency (의존성) 설정하기

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
	<version>4.2.4.RELEASE</version>
</dependency>

jar파일들이 lib에 추가된것을 확인할 수 있다

3-2. 패키지와 파일 구성하기

4. @Aspect어노테이션 추가

 

aop 디렉토리 구성

config 파일을 만들기

 

ExeTimer 인터페이스 만들기

ExeTimerImp 구현체 만들기

여기에 @Aspect 어노테이션을 사용

시간을 측정하는 메서드

@Aspect
@Component
public class ExeTimerImpl {
	 private static final Logger logger = LoggerFactory.getLogger(ExeTimerImpl.class);
	 @Around("@annotation(com.newriver.toyota.component.aop.annotation.ExeTimer)")
	 //@Around("execution(* com.newriver.toyota..*(..))")
	    public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
	      
	        long startTime = System.currentTimeMillis();
	        String methodName = joinPoint.toLongString();
	        System.out.println("@@@@@@@@@@@@"+ methodName + ": 시간 측정 시작 @@@@@@@@@@@@");
	        
	        try {
	           
	           return joinPoint.proceed();
	           
	        } finally {
	            long endTime = System.currentTimeMillis();
	            long executionTime = endTime - startTime;
	            System.out.println("@@@@@@@@@@@@@@@"+ methodName + ": 종료 / 측정된 시간 => " + executionTime + " ms");
	        }

	      
	   }
}

 

그리고 이렇게 어노테이션을 추가하면 해당메서드가 호출되고 실행되는 시간을 로그에 찍어볼수 있는 AOP를 생성하였다.