ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] AOP (Aspect Oriented Programming)
    JAVA/SPRING 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
Designed by Tistory.