[JAVA] AOP

Posted by 신희준 on February 27, 2023


2023 - 02 - 27 (월)


AOP(Aspect Oriented Programming)

  • 관점지향 프로그래밍이라고 한다. (공통의 관심사[기능]을 모듈화하여 공통의 관심사를 필요로 하는 부분에 적용)

  • 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 방법론 중 하나

  • 결론적으로 중복코드를 줄이기위해서 사용한다.

AOP 용어

Aspect

  • 공통의 관심사를 모듈화 한 것

Target

  • 어떤 대상에 부가 기능을 부여할것인가? (공통의 관심사를 필요로 하는 메소드)

Advice

  • 어떤 부가 기능을 제공할 것인가?

    • Before (메소드 실행 전)
    • AfterReturning (메소드 실행 후 정상 리턴했을 때)
    • AfterThrowing (메소드 실행 후 예외발생)
    • After (메소드 실행 후)
    • Around (메소드 실행 전 후)

Join Point

  • 어디에 적용할 것인가? (메서드, 필드, 객체, 생성자)

Point cut

  • 실제 advice가 적용될 지점

//예시 1

@Aspect
@Component
public class LogAOP {  // Aspect : 부가 기능 구현체들을 포함하고 있는 모듈

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    // PointCut : 적용할 지점 또는 범위 선택
    //@Pointcut("execution(public * com.shj.stock.stockManager.controller..*(..))")
    @Pointcut("bean(*Controller)")
    private void publicTarget() { }

    // Advice : 실제 부가기능 구현부
    @Around("publicTarget()")
    public Object calcPerformanceAdvice(ProceedingJoinPoint pjp) throws Throwable {
        logger.info("성능 측정을 시작합니다.");
        StopWatch sw = new StopWatch();
        sw.start();

        // 비즈니스 로직 (메인 로직)
        Object result = pjp.proceed();

        sw.stop();
        logger.info("성능 측정이 끝났습니다.");
        logger.info("걸린시간: {} ms", sw.getLastTaskTimeMillis());
        return result;
    }
}

정리

  • AOP 를 사용함으로써 공통의 관심사 이지만 비즈니스 로직과 관련없는 내용 (예를들어 시간측정 또는 로그) 의 기능을 모듈화하여 하나의 서비스에서 특정 기능만 사용할 수 있도록 함.
    • SRP와 연결시킬 수 있는것 같다.(OOP 단일책임원칙)
    • 아무튼 AOP 는 OOP를 보완하는 방법론이라 할 수 있음.
  • 코드가 변경이 필요한 경우 모듈화하였기 때문에 수정이 용이하고 반복적인 코드를 줄여준다.