AOP (Aspect-Oriented-Programming)

박종원·2024년 10월 13일

AOP 개요

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

AOP의 주요 개념 및 구성 요소

  1. 횡단 관심사 cross-cutting Concerns :

    • 횡단 관심사는 애플리케이션의 핵심 비즈니스 로직과는 별개로, 여러 모듈에 걸쳐 공통적으로 나타나는기능을 의미.
    • 예: 로깅, 보안, 트랜잭션 관리 등.
  2. Aspect:

    • Aspect는 횡단 관심사를 모듈화한 것으로, 주로 공통 기능을 구현.
    • Aspect는 여러 Join Point에서 적용될 수 있다.
  3. Join Point :

    • Join Point는 Aspect가 적용될 수 있는 애플리케이션 실행 시점.
    • 예: 메서드 호출, 객체 생성, 예외 발생 등.
  4. Advice:

    • Advice는 특정 Join Point에서 수행되는 작업을 정의한다.
  5. Pointcut:

    • Pointcut은 특정 Join Point를 선택하는 표현식이다. AspectJ 언어에서 주로 사용된다.
  6. Weaving :

    • Weaving은 Aspect와 비즈니스 로직을 결합하는 과정이다.
    • Weaving은 컴파일 시점, 로드 시점, 런타임 시점에 이루어질 수 있다.

Proxy Pattern과 AOP

  1. Proxy Pattern:
    • 프록시 패턴은 객체의 대리자를 만들어 실제 객체 대한 접근을 제어하는 디자인 패턴
    • 클라이언트는 프록시 객체를 통해 실제 객체의 메서드를 호출하며, 프록시 객체는 이 과정에서 추가적인 기능을 수행할 수 있다.
  2. 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();
    }

0개의 댓글