spring

[Spring] AOP와 @EnableAspectJAutoProxy

moonsiri 2022. 4. 27. 18:26
728x90
반응형

Spring AOP (Aspect Oriented Programming)

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불립니다.

쉽게 말해 관점에 따라 각각 모듈화(어떤 공통된 로직이나 기능을 하나의 단위로 묶음)하겠다는 것입니다.

소스 코드에서 여러 코드에서 반복해서 사용하는 코드를 발견할 수 있는데 이것을 흩어진 관심사(Crosscutting Concerns)라고 합니다. 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비지니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지입니다.

 

AOP 주요 개념

  • Aspect : 흩어진 관심사를 모듈화 한 것
  • Target : Aspect를 적용하는 곳 (ElementType 등)
  • Advice : 실질적인 부가기능을 담은 구현체 (@Before, @After, @AfterReturning, @AfterThrowing, @Around)
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점.
  • PointCut : JointPoint의 상세한 스펙을 정의한 것.

 

package com.moonsiri.common.annotation.service;

@Target(ElementType.METHOD)	// (1)
@Retention(RetentionPolicy.RUNTIME)	// (2)
@Inherited	// (3)
@Documented	// (4)
public @interface EnableMoonsiri {	// (5)
}
  1. Aspect를 메서드에만 적용하도록 설정
  2. 유효성 검사는 런타임시에 진행되어야하기 때문에 RetentionPolicy를 런타임으로 정의
  3. Inherited
  4. Documented
  5. 인터페이스

 

@Aspect		// (1)
@Component	// (2)
public class EnableMoonsiriAspect {

	@Around("@annotation(com.moonsiri.common.annotation.service.EnableMoonsiri)")	// (3)
	public Object enableMoonsiriAspect(ProceedingJoinPoint joinPoint) throws Throwable {	// (4)
		Object proceed;
        
		// (5)
        
		try {
			proceed = joinPoint.proceed();	// (6)
		} catch(Exception e) {
			throw e;	// (7)
		}
        
		// (8)
        
		return proceed;	// (9)
	}
}
  1. Aspect 객체
  2. @Component 어노테이션 추가 하여 모듈화
  3. @EnableMoonsiri 어노테이션이 붙은 부분에서 Around(AOP가 적용될 메서드의 시작부터 끝까지 전박적인 시스점을 모두 관리) advice 실행
  4. Around Advice를 사용하면 ProceedingJoinPoint를 사용할 수 있음
  5. 메서드가 시작하기 전 실행될 코드 (Before advice)
  6. 메서드가 실행되는 부분
  7. 메서드에서 에러가 발생하면 처리될 부분 (After throwing advice)
  8. 메서드가 에러없이 종료된 후 실행될 코드 (After returning advice)
  9. return

 

@Component
public class clazz {

	@EnableMoonsiriAspect
	public Object method() {
		// ...
	}

}

@AOP를 사용하기 위해서는 두가지 방법이 있습니다.

 

방법1. pom.xml에 spring-boot-start-aop dependency 추가

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

 

방법2. @EnableAspectJAutoProxy 설정

@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
}

 

 

[Reference]

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/EnableAspectJAutoProxy.html

728x90
반응형