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