AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)
말 그대로 애플리케이션의 공통 관심사항을 모듈화하는 방법
AOP를 통해서 로깅, 트랜잭션 관리, 보안 등과 같이 공통 기능을 애플리케이션의 다른 부분에 영향을 주지 않고 분리해서 관리하는 것을 말한다고 봐도 되겠다.
스프링 AOP는 메소드 실행 전/후 또는 예외 발생 시점에 추가적인 행동을 정의할 수 있게 해준다.
이 글에서는 스프링 AOP의 기본개념 이해와, 실제 애플리케이션에서 적용하는 방법에 대해 공부해보는 목적을 가지고 작성하였습니다.

Aspect, Join point, Advice, Pointcut, Target 이라고 볼 수 있다.
@Aspect
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - start;
logger.info(joinPoint.getSignature() + " executed in " + executionTime + "ms");
return proceed;
}
}
이 코드는 서비스 레이어의 모든 메소드 실행 전/후에 실행시간을 로그로 기록한다.
@Around 어노테이션으로 메소드 실행 전 후에 로그를 남기는 Advice를 정의했다.
이 외에도 트랜잭션 관리나 보안 검사 등 다양한 공통 기능을 AOP를 통해 쉽게 구현할 수 있고, 이는 애플리케이션의 코드를 깔끔하게 유지하고 유지보수를 용이하게 한다.