spring(스프링)

[spring(스프링)] AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)란? _디버깅의 눈물

디버깅의 눈물 2023. 4. 10. 15:58

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)

 

관점 지향 프로그래밍은 애플리케이션의 여러 부분에서 공통적으로 발생하는 기능(관심사)을 분리하여 모듈화하고 필요한 코드에 적용하는 프로그래밍 방식을 말합니다. 관심사는 애플리케이션의 특정 기능이나 부가적인 작업을 의미합니다. 예를 들어 로깅, 보안, 트랜잭션, 캐싱 등이 관심사가 될 수 있습니다.

 

AOP는 이러한 관심사들을 모듈화하고, 핵심 로직에서 분리하여 각각의 모듈로 만들어 놓은 뒤 필요한 시점에 필요한 모듈을 연결해 주는 방식으로 동작합니다. 이를 위해 AOP는 관심사를 모듈화한 것을 "어드바이스(Advice)"라고 부릅니다.

 

 

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LoggingAspect {
    
    private Logger logger = LogManager.getLogger(LoggingAspect.class);
    
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        logger.info("Before " + joinPoint.getSignature().getName() + " method");
    }
    
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        logger.info("After " + joinPoint.getSignature().getName() + " method, Result : " + result);
    }
}

 

 

위 코드는 com.example.service 패키지 내부의 모든 메서드가 실행될 때 로그를 출력하는 Aspect입니다. @Aspect 어노테이션으로 이 클래스가 Aspect 클래스임을 지정하고, @Before 어노테이션으로 메서드 실행 전에 로그를 출력하도록, @AfterReturning 어노테이션으로 메서드 실행 후에 로그를 출력하도록 설정합니다. 'excution'은 pointcut으로, 언제 어디서 메서드가 실행될지 지정하는 역할을 합니다.

 

이 예시에는 Log4j 라이브러리 사용하여 로그를 기록하고 있습니다. getLogger() 메서드를 사용하여 로그를 출력할 Logger 객체를 생성한 뒤, info() 메서드를 사용하여 로그를 출력합니다. 로그 메시지에는 실행되는 메서드의 이름과 결과값이 포함됩니다. 이렇게 AOP를 활용하여 로깅 기능을 구현하면 디버깅이나 오류 추적에 매우 유용합니다.

 

 

관점 지향 프로그래밍은 애플리케이션의 코드 베이스를 깔끔하게 유지하고, 개발자가 특정 기능을 한번에 수정하거나 변경할 수 있도록 합니다. 프록시 패턴을 기반으로 작동합니다. 객체 지향 프로그래밍에서의 관심사 분리를 지원하여 애플리케이션의 모듈성과 유연성을 높이는 것을 목적으로 합니다.