AOP 개요
- AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 객체 지향 프로그래밍(OOP)의 단점을 보완하여 프로그램의 횡단 관심사(Cross-Cutting Concerns)를 효과적으로 분리하고 모듈화할 수 있는 프로그래밍 패러다임이다.
- AOP는 주로 로깅, 보안, 트랜잭션 관리 등과 같은 횡단 관심사를 비즈니스 로직에서 분리하여 코드의 재사용성과 유지 보수성을 향상시킵니다.
- AOP는 OOP와 반대 개념이 아닌 OOP의 단점을 보완하기 위한 프로그래밍 기법이다.

AOP의 주요 개념 및 구성 요소
-
횡단 관심사 cross-cutting Concerns :
- 횡단 관심사는 애플리케이션의 핵심 비즈니스 로직과는 별개로, 여러 모듈에 걸쳐 공통적으로 나타나는기능을 의미.
- 예: 로깅, 보안, 트랜잭션 관리 등.
-
Aspect:
- Aspect는 횡단 관심사를 모듈화한 것으로, 주로 공통 기능을 구현.
- Aspect는 여러 Join Point에서 적용될 수 있다.
-
Join Point :
- Join Point는 Aspect가 적용될 수 있는 애플리케이션 실행 시점.
- 예: 메서드 호출, 객체 생성, 예외 발생 등.
-
Advice:
- Advice는 특정 Join Point에서 수행되는 작업을 정의한다.
-
Pointcut:
- Pointcut은 특정 Join Point를 선택하는 표현식이다. AspectJ 언어에서 주로 사용된다.
-
Weaving :
- Weaving은 Aspect와 비즈니스 로직을 결합하는 과정이다.
- Weaving은 컴파일 시점, 로드 시점, 런타임 시점에 이루어질 수 있다.
Proxy Pattern과 AOP
- Proxy Pattern:
- 프록시 패턴은 객체의 대리자를 만들어 실제 객체 대한 접근을 제어하는 디자인 패턴
- 클라이언트는 프록시 객체를 통해 실제 객체의 메서드를 호출하며, 프록시 객체는 이 과정에서 추가적인 기능을 수행할 수 있다.
- AOP에서의 프록시 패턴:
- AOP는 횡단 관심사를 비지니스 로직에서 분리하기 위해 프록시 패턴을 사용한다.
- AOP 프레임워크(Spring AOP 등)는 타겟 객체(Target Object)의 프록시 객체를 생성하여, 클라이언트가 타겟 객체의 메서드를 호출할 때 프록시 객체가 먼저 호출되도록 한다.
- 프록시 객체는 Advice(로깅, 트랜잭션 관리 등)를 실행한 후, 타겟 객체의 실제 메서드를 호출한다.
- 이를 통해 비즈니스 로직 코드와 횡단 관심사 코드를 분리하고, 중복을 줄이며 유지 보수성을 향상시킬 수 있습니다.
Proxy Pattern 구현
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("원본 객체 요청~!");
}
}
public class Proxy implements Subject {
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
System.out.println("프록시 객체 전");
realSubject.request();
System.out.println("프록시 객체 후");
}
}
public class Client {
public static void main(String[] args) {
Subject proxy = new Proxy();
proxy.request();
}