ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring, Spring Boot] 관점 지향 프로그래밍 AOP (Aspect-Oriented Programming)
    Spring 2024. 11. 28. 14:17

    AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 애플리케이션의 횡단 관심사(Cross-Cutting Concerns)를 모듈화하기 위한 프로그래밍 패러다임입니다. 횡단 관심사로깅, 트랜잭션 관리, 보안, 예외 처리여러 모듈에서 반복적으로 사용되는 로직을 의미합니다. AOP는 이러한 공통 기능을 코드의 핵심 비즈니스 로직과 분리하여 코드의 가독성유지보수성높이기 위해 사용됩니다.

    스프링 프레임워크는 AOP를 간편하게 사용할 수 있도록 지원하며, 이를 통해 애플리케이션의 코드 중복을 줄이고 핵심 로직에 집중할 수 있습니다.

     

    AOP의 주요 개념

    AOP를 이해하려면 몇 가지 핵심 개념을 이해해야 합니다:

    • Aspect: 횡단 관심사를 모듈화한 것을 Aspect라고 합니다. 보통 하나의 기능, 예를 들어 로깅이나 보안 처리가 하나의 Aspect가 됩니다.
    • Join Point: 애플리케이션에서 AOP가 적용될 수 있는 위치를 의미합니다. 예를 들어 메서드 호출, 예외 처리 등이 Join Point가 됩니다.
    • Advice: Aspect가 수행할 작업을 정의합니다. Advice는 언제 실행되느냐에 따라 다양한 유형으로 나뉩니다 (Before, After, Around 등).
    • Pointcut: Join Point를 특정하기 위해 사용하는 표현식입니다. 즉, 어떤 Join Point에 Advice를 적용할지 결정하는 필터링 기능을 수행합니다.
    • Weaving: Aspect를 실제로 코드에 적용하는 과정을 의미합니다.
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class LoggingAspect {
    
        // 메서드 실행 전에 로그 출력
        @Before("execution(* com.example.service.*.*(..))")
        public void logBefore() {
            System.out.println("메서드 실행 전 로그 출력");
        }
    
        // 메서드 실행 후에 로그 출력
        @After("execution(* com.example.service.*.*(..))")
        public void logAfter() {
            System.out.println("메서드 실행 후 로그 출력");
        }
    
        // 메서드 실행 전후를 둘러싸며 실행하는 로그
        @Around("execution(* com.example.service.*.*(..))")
        public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("메서드 실행 전");
            Object result = joinPoint.proceed(); // 실제 대상 메서드 호출
            System.out.println("메서드 실행 후");
            return result;
        }
    }

     

    코드 설명

    • @Aspect: 이 클래스가 Aspect임을 나타냅니다.
    • @Before, @After: 대상 메서드 실행 전후에 Advice를 적용하기 위해 사용됩니다. execution(* com.example.service.*.*(..))는 com.example.service 패키지의 모든 메서드를 대상으로 합니다.
    • @Around: 메서드 실행 전과 후를 둘러싸며 동작하는 Advice입니다. ProceedingJoinPoint는 실제 메서드를 실행하기 위해 사용됩니다.

    위 코드는 com.example.service 패키지 내 모든 메서드 호출 전후에 로깅을 수행하도록 설정된 Aspect입니다. 이를 통해 서비스 계층의 모든 메서드에 대해 중복되는 로깅 코드를 일일이 작성하지 않고도 손쉽게 로깅을 적용할 수 있습니다.

     

    결론

    AOP횡단 관심사핵심 비즈니스 로직과 분리함으로써 코드의 모듈화를 높이고, 유지보수성을 향상시킵니다. 로깅, 보안, 트랜잭션 관리 등과 같은 공통 관심사를 별도의 Aspect로 관리함으로써 코드를 더 읽기 쉽게 만들고, 핵심 로직이 보다 명확하게 드러나도록 합니다. 스프링에서 AOP는 @Aspect와 같은 어노테이션을 사용해 간편하게 적용할 수 있으며, 이를 통해 애플리케이션의 구조를 깔끔하고 효율적으로 유지할 수 있습니다.

    댓글

Designed by Tistory.