JAVA/SPRING
[Spring] AOP (Aspect Oriented Programming)
KMSEOP
2023. 6. 11. 15:43
728x90
1. AOP 란?
자바에서는 다중 상속이 불가능하여 상속을 통한 공통 메소드를 구성에 한계가 있지만 AOP를 통해 핵심 관심 사항(Core Concern)과 공통 관심 사항(Cross-Cutting Concern)을 분리하고 모듈화 할 수 있습니다.
(ex. 주문 API: 핵심 관심사(주문 로직), 공통 관심사(로깅))
AOP의 장점
- 공통 관심사를 핵심 관심사로부터 분리하여 핵심 로직의 변경없이 공통 관심사를 변경 가능
- 공통 로직을 적용할 대상을 선택 가능
주요 개념
- Aspect: 공통적인 관심사를 모듈화
- Target: Aspect가 적용될 대상(메소드, 클래스...)
- Join point: Aspect가 적용될 수 있는 시점
- Advice: Aspect의 기능
- Point cut: Advice를 적용할 메소드의 범위
주요 어노테이션
- @Aspect: 해당 클래스가 Aspect임을 정의
- @Before: Target이 실행되기 전에 Advice 실행
- @After: Target이 실행된 이후에 Advice 실행
- @AfterRunning: Target이 정상적으로 실행되고 반환된 이후에 Advice 실행
- @AfterThrowing: Target에서 예외가 발생했을 때 Advice 실행
- @Around: Target이 실행 전, 후 또는 예외 발생 시 Advice 실행
2. AOP 사용 방법
AOP를 사용하기 위해서 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-aop'
AOP를 활성화하기 위해 어플리케이션 클래스에 어노테이션 추가
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@EnableAspectJAutoProxy
@SpringBootApplication
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ForderApplication.class, args);
}
}
로깅 AOP
RestController, Service 어노테이션이 추가된 클래스에서 실행되도록 설정
@Aspect
@Component
@Slf4j
public class LoggingAspect {
@After("@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Service)")
public void logAfter(JoinPoint joinPoint) {
log.info("Executed: " + joinPoint.getSignature().getName());
}
}
728x90