[SPRING]AOP - Advice, Join Point, Aspect 등

Date:     Updated:

카테고리:

태그:

[20] AOP

20.1. 관점 지향 프로그래밍 (AOP : Aspect Oriented Programming)

  • 특정한 함수(핵심기능) 호출 전이나 후에 뭔가 공통적인 처리가 필요하다면 AOP 구현한다.
    • 로깅, 트랜잭션, 인증
  • OOP로 처리하기에는 다소 까다로운 부분을 AOP라는 처리 방식을 도입하여 손쉽게 공통 기능을 추가, 수정, 삭제 할 수 있도록 하였다.

20.2. 핵심기능과 부가기능

  • 업무(biz) 로직을 포함하는 기능을 핵심 기능(Core Concerns)
  • 핵심기능을 도와주는 부가적인 기능(로깅, 보안 등)을 부가기능이라고한다. (Crosscutting-Concerns)이라고 부른다.
  • 객체지향의 기본 원칙을 적용하여도 핵심기능에서 부가기능을 분리해서 모듈화하는 것은 매우 어렵다.

20.3. AOP (Aspect Oriented Programming) 개요

  • 애플리케이션에서 관심사의 분리(기능의 분리) 즉, 핵심적인 기능에서 부가적인 기능을 분리한다.
  • 분리한 부가기능을 에스펙트(Aspect)라는 독특한 모듈형태로 만들어서 설계하고 개발하는 방법이다.
  • AOP는 부가기능을 에스택트로 정의하여, 핵심기능에서 부가기능을 분리함으로써 객체지향적인 가치를 지킬 수 있도록 도와준다.
  • 부가 기능(advice)을 동적으로 추가해주는 기술
  • 메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가해주는 기술

20.4. AOP 관련 용어

  • target (타겟)
    • advice가 추가될 객체
    • 핵심 기능을 담고 있는 모듈
    • 타겟은 부가기능을 부여할 대상이 된다.
  • advice
    • target에 동적으로 추가될 부가 기능(코드)
    • 타겟에 저공할 부가기능을 담고 있는 모듈
    • 조인, AOP에서 실제로 적용하는 기능 (로깅, 트랜잭션, 인증 등)
  • join point
    • advice가 추가(join)될 대상(메서드)
    • 어드바이스가 적용될 수 있는 위치
    • 타겟 객체가 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다.
    • 모듈화된 특정 기능이 실행될 수 있는 연결 포인트
  • pointcut
    • join point들을 정의한 패턴
    • join point중에서 해당 Aspect를 적용할 대상을 뽑을 조건식
    • 어드바이스를 적용할 타겟의 메서드를 선별하는 정규 표현식이다.
    • 포인트컷 표현식은 execution으로 시작하고, 메서드의 Signature를 비교하는 방법을 주로 이용한다.
      • execution(* kr.co.yahoo..(..)
  • proxy
    • target에 advice가 동적으로 추가되어 생성된 객체
      • Spring은 프록시 기반 AOP를 지원한다.
      • Spring은 타겟(target)객체에 대한 프록시를 만들어 제공한다.
      • 타겟을 감싸는 프록시는 실행시간(runtime)에 생성이 된다.
      • 프록시는 어드바이스를 타겟 객체에 적용하면서 생성되는 객체이다.
    • 대상 오브젝트에 Aspect를 적용하는 경우 advice를 덧붙이기 위해 하는 작업
  • weaving(위빙)
    • target에 advice를 추가해서 proxy를 생성하는 것이다.
    • Advice를 비즈니스 로직 코드에 삽입하는 것.
    • 위빙은 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(advice)을 삽입하는 과정을 뜻한다.
    • 위빙은 AOP가 핵심기능(target)의 코드에 영향을 주지 않응면서 필요한 부가기능(advice)을 추가할 수 있도록 해주는 핵심적인 처리과정이다.
  • Aspect
    • 여러 클래스나 기능에 걸쳐서 있는 관심사, 그리고 그것들을 모듈화한 것을 말한다.
    • 에스팩트는 AOP의 기본 모듈이다.
    • 에스팩트 = 어드바이스 + 포인트컷.
    • 에스팩트는 싱글톤 형태의 객체로 존재한다.
    • AOP 중에서 가장 많이 활용되는 부분은 @Transaction(트랜잭션 관리) 기능

20.5. Advice 종류와 어노테이션

Advice 어노테이션 설명
before advice @Before - 메서드의 시작 부분에 추가되는 부가 기능
- 전처리 어드바이스
- 프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 타겟의 핵심기능 로직을 호출한다.
after advice @After - 메서드의 끝 부분에 추가되는 부가 기능
- 후처리 어드바이스
- 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(advice)을 수행하는 경우
around advice @Around - 메서드의 시작과 끝 부분에 추가되는 부가 기능
after returning @AfterReturning - 예외가 발생하지 않았을 때 실행되는 부가 기능
after throwing @AfterThrowing - 예외가 발생하였을 때 실행되는 부가 기능

20.6. pointcut expression (표현식)

  • advice가 추가될 메서드를 지정하기 위한 패턴
  • execution(반환타입 패키지명.클래스명.메서드명(매개변수 목록))
    • “execution(* kr.co.yahoo..(..))”
      • ex) execution(* hello(..))
        • hello라는 이름을 가진 메서드를 선정하는 것이다.
        • 파라미터는 모든 종류를 다 허용한다는 의미.
      • ex) execution(* hello())
        • hello라는 이름을 가진 메서드를 선정하는 것이다. 단, 매개변수가 없는 것만 선택하는 것이다.
      • ex) execution(* kr.co.yahoo.user.service.UserServiceImpl.*(..))
        • kr.co.yahoo.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택함.
      • ex) execution(* kr.co.yahoo.user.service.*.*(..))
        • kr.co.yahoo.user.service 패키지의 모든 클래스에 적용된다.
        • 서브 패키지의 클래스는 포함되지 않는다.
      • ex) execution(* kr.co.yahoo.user.service..*.*(..))
        • kr.co.yahoo.user.service 패키지의 모든 클래스에 적용된다.
        • 서브 패키지의 모든 클래스까지 포함한다.
      • ex) execution(* *..MyClass.*(..))
        • 패키지에 상관없이 MyClass라는 이름의 모든 클래스에 적용된다.
        • 다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다.

20.7. JoinPoint 인터페이스

  • Spring AOP 혹은 AspectJ에서 AOP가 적용되는 지점
  • 해당 지점을 JoinPoint라는 인터페이스로 나타낸다.
  • 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPoint의 파라미터를 필수적으로 선언해야한다.

SPRING 카테고리 내 다른 글 보러가기

댓글 남기기