AOP란 무엇일까.. 이름부터 살펴보자. AOP(Aspect Oriented Programming), 직역하면 “측면 지향 프로그래밍”이다. 측면 지향 프로그래밍.. 잘 모르겠으니 좀 더 알아보도록 하자.
우리는 객체 지향 프로그래밍(OOP)이라는 개념을 알고 있다(모른다면 알고 오는 것을 추천한다). 객체 지향 프로그램은 클래스를 기본 단위로 모듈화한다. 반면, AOP는 관심사를 기준으로 프로그램을 모듈화한다고 하며, 이것을 횡단 관심사(cross-cutting concerns)라고 한다.
횡단 관심사(cross-cutting concerns)란 프로그램의 여러 부분에서 나타나는 공통적인 기능을 말한다. 예를 들면 로깅, 트랜잭션 관리 등이 있다. 비즈니스 로직(핵심 기능)과는 직접적인 관련이 없지만, 프로그램 전반에 걸쳐 중요한 요소들이다.
객체 지향 프로그래밍에서는 이런 횡단 관심사(cross-cutting concerns)를 처리하기 위해서는 각 객체마다 코드를 반복적으로 작성해야 한다. AOP는 이런 문제를 해결하기 위해 횡단 관심사(cross-cutting concerns)를 분리하고, 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었고 이게 바로 Aspect이다.
Aspect는 해석하면 관점이라는 뜻인데, 애플리케이션을 바라보는 관점을 하나하나의 기능에서 횡단 관심사(cross-cutting concerns) 관점으로 보는 것이다.
이렇게 Aspect를 사용한 프로그래밍 방식을 AOP(Aspect Oriented Programming), 관점 지향 프로그래밍이라고 한다.
AOP를 이해하기 위해 알아야 할 주요 개념들은 다음과 같다.
애스펙트(Aspect): 여러 클래스에 걸쳐 있는 관심사를 모듈화한 것이다. 트랜잭션 관리가 대표적인 예시다.조인 포인트(Join point): 프로그램 실행 중의 특정 지점을 말한다. 스프링 AOP에서는 항상 메서드 실행을 나타낸다.어드바이스(Advice): 특정 조인 포인트에서 애스펙트가 취하는 행동이다. "around", "before", "after" 등의 유형이 있다.포인트컷(Pointcut): 조인 포인트를 매칭하는 표현식이다. 어드바이스와 연관되어 어느 지점에서 어드바이스를 실행할지 결정한다.타겟 객체(Target object): 하나 이상의 애스펙트에 의해 어드바이스되는 객체를 말한다.AOP 프록시(AOP proxy): AOP 프레임워크가 애스펙트를 구현하기 위해 만든 객체다. 스프링에서는 JDK 동적 프록시나 CGLIB 프록시를 사용한다.위빙(Weaving): 애스펙트를 애플리케이션 코드에 적용하는 과정이다. 스프링 AOP는 런타임에 위빙을 수행한다.스프링 AOP는 다음과 같은 유형의 어드바이스를 제공한다:
AOP의 핵심은 포인트컷 개념이다. 이를 통해 객체 지향 계층 구조와 독립적으로 여러 객체에 걸친 관심사를 모듈화할 수 있다.
Spring AOP는 완전한 AOP 솔루션보다는 실용적인 접근 방식을 취하며, 대부분의 엔터프라이즈 애플리케이션에서 발생하는 문제를 해결하는 데 중점을 둔다.
스프링은 AspectJ의 문법을 차용하고 프록시 방식의 AOP를 적용한다. 런타임에 타겟 객체를 감싸는 프록시 객체를 생성하고, 이 프록시가 어드바이스를 타겟 객체에 적용한다.
프록시는 타겟 객체에 대한 메서드 호출을 가로채고, 필요한 경우 어드바이스를 실행한 후 실제 타겟 메서드를 호출한다. 프록시 방식으로 인해 같은 클래스 내의 메서드 호출이나 non-public 메서드에는 AOP를 적용할 수 없다.