ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AOP(Aspect Object Programming)
    Spring 2023. 4. 10. 22:07

    AOP란 

    AOP(Aspect-Oriented Programming)는 OOP(Object-Oriented Programming)에서의 모듈성과 재사용성을 증대시키기 위한 프로그래밍 기법 중 하나입니다. AOP는 어떤 시스템에서 발생하는 여러 개의 요구사항들 중에서 핵심적인 기능이 아니라 간섭적인 부분(관심사)들을 분리시켜서 관리하는 기법입니다.

    AOP는 크게 측면(aspect), 조인 포인트(join point), 포인트 컷(pointcut), 어드바이스(advice), 위빙(weaving) 등의 개념으로 이루어져 있습니다.

    측면(aspect)
    관심사의 모듈화를 의미합니다. 예를 들어, 로깅이나 트랜잭션과 같은 공통적인 관심사를 분리하여 모듈화합니다.


    조인 포인트(join point)
    언제 측면이 실행될지를 결정하는 지점입니다. 메서드 호출, 예외 발생, 필드값 변경 등이 조인 포인트에 해당됩니다.

     

    포인트 컷(pointcut)
    조인 포인트의 부분집합으로, 실제로 측면이 적용될 지점을 결정합니다.

     

    어드바이스(advice)
    측면이 실제로 수행할 동작을 정의합니다. 예를 들어, 메서드 실행 전에 로깅을 수행하는 등의 동작을 정의합니다.

     

    위빙(weaving)
    측면을 대상 코드에 적용하는 과정입니다. 컴파일 타임, 클래스 로딩 타임, 런타임 중 언제든지 적용될 수 있습니다.


    AOP를 사용하면 공통적인 기능을 모듈화하여 코드 중복을 방지하고, 코드 가독성과 유지보수성을 높일 수 있습니다. 또한, 핵심 비즈니스 로직과 공통적인 기능이 분리되어 있어 변경사항이 발생했을 때도 유연하게 대처할 수 있습니다. 스프링 프레임워크에서도 AOP를 지원하며, 어노테이션 기반의 AOP 설정을 간편하게 할 수 있습니다.

     

    AOP 대표적인 코드 예시

     

    AOP는 다양한 상황에서 사용될 수 있지만, 대표적인 예시로는 로깅, 보안, 트랜잭션 처리 등이 있습니다.

    다음은 메서드 실행 로깅을 위해 AOP를 사용하는 코드 예시입니다.

     

    @Aspect
    @Component
    public class LoggingAspect {
        
        private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
        
        @Pointcut("execution(* com.example.service.*.*(..))")
        public void serviceMethod() {}
        
        @Before("serviceMethod()")
        public void beforeAdvice(JoinPoint joinPoint) {
            logger.info("Start executing {}", joinPoint.getSignature().getName());
        }
        
        @AfterReturning(pointcut = "serviceMethod()", returning = "returnValue")
        public void afterReturningAdvice(JoinPoint joinPoint, Object returnValue) {
            logger.info("Finish executing {}. Returned value is {}", joinPoint.getSignature().getName(), returnValue);
        }
        
        @AfterThrowing(pointcut = "serviceMethod()", throwing = "ex")
        public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {
            logger.error("Error occurred while executing {}", joinPoint.getSignature().getName(), ex);
        }
    }

    위 코드에서 @Aspect 어노테이션은 해당 클래스가 AOP 측면을 정의한다는 것을 나타내고,

    @Component 어노테이션은 스프링 컨테이너에 해당 클래스를 빈(bean)으로 등록하기 위한 것입니다.

    @Pointcut 어노테이션을 사용하여 com.example.service 패키지의 모든 메서드가 대상이 되도록 포인트 컷을 정의하고, 

    @Before 어노테이션을 사용하여 메서드 실행 전에 로그를 출력하는 어드바이스를 정의합니다.

    @AfterReturning 어노테이션은 메서드가 반환값을 가지는 경우 해당 값을 로그로 출력하고, 

    @AfterThrowing 어노테이션은 메서드가 예외를 던지는 경우 해당 예외를 로그로 출력합니다.

    위 코드에서는 JoinPoint 객체를 이용하여 실행되는 메서드와 인자 정보를 추출하고, LoggerFactory 클래스를 이용하여 로깅을 수행하고 있습니다.

    'Spring' 카테고리의 다른 글

    MockMvc의 사용 이유  (0) 2023.03.20
    @ResponsBody  (0) 2023.03.18
    Controller, ResController 차이  (0) 2023.03.18
    @ControllerAdvice, @ExceptionHanlder  (0) 2023.03.18
    @RequestParam 생략 가능  (0) 2023.03.17
Designed by Tistory.