Aspect Oriented Programming

1. AOP개요

핵심기능과 부가기능

  • 핵심기능(Core Concerns): 업무 로직을 포함하는 기능
    • ex) 글 쓰기, 주문하기, 요금 정산
  • 부가기능(Cross-cutting Concerns): 핵심기능을 도와주는 부가적인 기능
    • ex) 로깅, 보안, 트랜잭션
  • 객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는 것은 매우 어렵다

AOP란?

  • 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리하는 것
  • 분리한 부가기능을 애스펙트(Aspect)라는 독특한 모듈 형태로 만들어서 설계 및 개발한다

  • 핵심기능과 부가기능의 분리를 통해 핵심기능을 설계 및 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와준다

애스펙트

  • 애스펙트는 부가기능을 정의하는 어드바이스(Advice)와 어드바이스를 적용할 곳을 결정하는 포인트컷(PointCut)을 합친 개념
    • Aspect = Advice + PointCut
  • AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을 독립적인 애스펙트로 구분해낼 수 있다
  • 구분된 부가기능 애스펙트를 런타임 시에 필요한 위치에 동적으로 참여하게 할 수 있다

2. AOP 용어

타깃(Target)

  • 핵심 기능을 담고 있는 모듈, 부가기능을 부여할 대상이 된다

어드바이스(Advice)

  • 어드바이스는 타깃에 제공할 부가기능을 담고 있는 모듈임

조인 포인트(Join Point)

  • 어드바이스가 적용될 수 있는 위치를 말함
  • 타깃 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다

포인트 컷(Pointcut)

  • 어드바이스를 적용할 타깃의 메서드를 선별하는 정규표현식
  • 포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용한다

애스펙트(Aspect)

  • AOP의 기본 모듈
  • Aspect = Advice + PointCut
  • 싱글톤형태의 객체로 존재한다

어드바이저(Advisor)

  • Advisor = Aspect = Advice + PointCut
  • Spring AOP에서만 사용하는 용어로 일반적으로 Aspect를 사용한다

위빙(Weaving)

  • 포인트컷에 의해 결정된 타깃의 조인 포인트에 부가기능(어드바이스)을 삽입하는 과정
  • AOP가 핵심기능(타깃)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가할 수 있돌고 해주는 핵심적인 처리 과정

3. Spring AOP의 특징

  1. Spring은 프록시(Proxy) 기반 AOP를 지원함
  • Spring은 타깃 객체에 대한 프록시를 만들어 제공한다
  • 타깃을 감싸는 프록시는 실행 시(Runtime)에 생성된다
  • 프록시는 어드바이스를 타깃 객체에 적용하면서 생성되는 객체이다
  1. 프록시(Proxy)가 호출을 가로챈다(Intercept)
  • 프록시는 타깃 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 타깃의 핵심 기능 로직을 호출한다(전처리 어드바이스)
  • 타깃의 핵심 기능 로직 메서드를 호출한 후에 부가기능(어드바이스)을 수행하는 경우도 있다(후처리 어드바이스)
  1. Spring AOP는 메서드 조인 포인트만 지원한다
  • Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원한다, 즉 핵심기능(타깃)의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다
  • 반면에 AspectJ 같은 고급 AOP프레임워크를 사용하면 객체의 생성, 필드값의 조회와 조작, static 메서드 호출 및 초기화 등 다양한 작업에 부가기능을 적용할 수 있다