AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 공통 관심 사항을 핵심 로직과 분리하여 코드의 가독성과 유지보수성을 높이는 프로그래밍 패러다임입니다. Spring AOP는 이러한 공통 기능을 비즈니스 로직에 깔끔하게 추가하는 데 사용되며, 로깅, 트랜잭션 관리, 인증 등 다양한 부가기능을 효율적으로 구현할 수 있습니다.
위 그림과 같이, AOP는 핵심 기능과 부가기능을 결합하여 코드를 구조화할 수 있습니다. 여기서 부가기능은 어드바이스 형태로 정의됩니다.
어드바이스는 부가기능이 핵심 기능과 언제 결합될지를 정의합니다.
@Before
와 @After
의 기능을 합친 것입니다.포인트컷은 어드바이스가 적용될 대상을 지정하는 표현식입니다. 예를 들어, 특정 클래스나 메서드에만 어드바이스를 적용할 수 있습니다.
@Around("execution(* com.sparta.myselectshop.controller.ProductController.*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... }
위 예제는 ProductController
클래스의 모든 메서드에 @Around
어드바이스를 적용합니다.위 그림은 AOP가 어떻게 동작하는지를 개념적으로 설명합니다. 원래는 클라이언트가 직접 핵심 기능에 접근하지만, AOP가 적용되면 프록시가 클라이언트와 핵심 기능 사이에 위치해 부가기능을 실행한 뒤 핵심 기능을 수행하게 됩니다.
AOP 적용 전과 후의 실제 동작을 시퀀스 다이어그램으로 보면 이해가 더 쉬워집니다.
DispatcherServlet
이 ProductController
의 createProduct
메서드를 직접 호출하고, 결과를 반환합니다.ProductController
에 접근하게 됩니다.@Around
어드바이스를 통해 부가기능을 수행하고, 이후 joinPoint.proceed()
를 호출하여 핵심 기능을 실행합니다.이와 같이 AOP는 부가기능을 핵심 기능에 깔끔하게 결합하여, 핵심 기능 코드를 수정하지 않고도 로깅이나 트랜잭션 등의 공통 기능을 손쉽게 추가할 수 있습니다.