Spring AOP

김하영·2020년 12월 28일
0
post-thumbnail

2020-12-28 Topic!

  • AOP 의 개념 (정의, 특징)
  • AOP 의 동작 원리 (구성, 매커니즘)
  • AOP 의 적용 사례 (Spring framework 에서 찾아보기)

AOP 정의

Aspect Oriented Programming 의 약자로 관점 지향 프로그래밍이라고 불린다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로
각각 모듈화하겠다는 것이다.

여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.

예) 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다.
또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이다.

즉, 기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을때 공통된 요소를 추출한 것을 의미한다.

  • OOP : 비지니스 로직의 모듈화
    모듈화의 핵심 단위는 비지니스 로직

  • AOP : 인프라 혹은 부가기능의 모듈화
    대표적 예 : 로깅, 트랜잭션, 보안 등
    각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들

OOP와 AOP는 공통된 기능을 재사용하는 기법이다.

OOP는 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용하며,
AOP는 분리한 부가기능을 에스펙트(Aspect)라는 독특한 모듈형태로 만들어서 사용한다.

상속이나 위임으로 핵심기능에서 부가기능을 분리된 모듈로 작성하기 어려운 OOP의 문제점을
AOP가 부가기능을 애스펙트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써
핵심기능을 설계하고 구현할 때 객체 지향적인 가치를 지킬수 있도록 도와주는 개념이다.

AOP 종류

  • JDK Dynamic Proxy
  • CGLib
  • AspectJ

AOP 용어

핵심 기능과 부가기능

  1. 횡단(공통) 관심 사항(cross-cutting concern) : 공통 기능의 코드
    예) 로깅, 트랜잭션 처리

  2. 핵심 관심 사항 (core concern) : 핵심 기능의 코드

주요용어

1. 타겟(Target)

핵심 기능이 구현된 객체로 공통기능의 적용대상이 되는 객체를 의미한다.


2. 조인 포인트(JoinPoint)

Target이 가진 메서드를 의미하여 조인 포인트 중에서 포인트 컷이 선택한다.


3. 포인트 컷(PointCut)

Target이 가진 메서드가 조인포인트라면 포인트 컷은 필터링된 조인 포인트를 의미한다.
트랜잭션을 처리하는 공통 기능을 만들었다고 하면 이 횡단 관심 기능은 등록,수정,삭제 기능의 비즈니스 메서드에 대해서는 당연히 동작해야 하지만, 검색 기능의 메소드에 대해서는 트랜잭션과 무관하므로 동작할 필요가 없다.
이렇게 수많은 비즈니스 메소드 중에서 우리가 원하는 특정 메서드에서만 횡단 관심에 해당하는 공통 기능을 수행시키기 위해서 포인트 컷이 필요하다.
포인트 컷을 이용하면 메서드가 포함된 클래스와 패키지는 물론이고 메서드 시그니처까지 정확하게 지정할 수 있다.

  • 포인트 컷 표현식

    expression="execution( com.json.jsonroot.,impl.get*(..))"/>

    com.json.jsonroot.. Impl . get(..)
    리턴타입 패키지 경로 클래스 명 메서드 명 및 매개변수

com.json.jsonroot패키지로 시작하는 클래스 중에서 Impl로 끝나는 클래스의 get으로 시작하는 모든 메서드만 pointcut으로 설정한다.

  • 리턴 타입의 경우
    /* : 모든 리턴 타입
    void : 리턴 타입이 void 인 메서드 선택
    !void : 리턴 타입이 void가 아닌 메서드 선택
  • 패키지 경로
    com.json.jsonroot : com.json.jsonroot 패키지만 선택
    com.json.jsonroot.. : com.json.jsonroot 패키지로 시작하는 모든 패키지 선택
  • 클래스 지정
    ServiceImpl : ServiceImpl 클래스 선택
    *Impl : 클래스 이름이 Impl로 끝나는 클래스만 선택
  • . : 클래스와 메서드 구분한다.
  • 메서드 지정
    * : 모든 메서드 선택
    get
    : 메서드 이름이 get으로 시작하는 모든 메서드 선택
  • 매개변수 지정
    (..) : 매개변수의 개수와 타입에 제약이 없음을 의미
    () : 반드시 1개의 매개변수를 가지는 메서드만 선택
    (Integer, ..) : 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택
    (Integer,
    ) : 두 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메서드만 선택

4. 어드바이스 (Advice)

횡단 관심에 해당하는 공통 기능의 코드를 의미한다.
독립된 클래스의 메서드로 작성된다.
어드바이스로 구현된 메서드가 언제 동작할지 스프링 설정 파일을 통해서 지정할 수 있다.

동작 시점

  • Around : 대상 객체(target)의 메소드 실행 전, 후 발생 시점에 공통 기능을 실행하는 데 사용된다.
  • Before : 대상 객체의 메소드 호출 전에 공통 기능을 실행한다.
  • After : 대상 객체의 메소드를 실행하는 도중에 익셉션이 발생했는지의 여부에 상관없이 메서드 실행 후 공통 기능을 실행한다.
  • After Returning : 대상 객체의 메서드 호출이 정상적으로 종료될 후에 실행한다.
  • After Throwing : 대상 객체의 메서드를 수행하다가 예외가 발생할 때 동작한다.

5. 위빙(Weaving)

위빙은 포인트 컷으로 지정한 핵심 관심 메서드가 호출될 때
어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다.
이 위빙을 통해서 비즈니스 메서드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.

방식 : 컴파일 타임 위빙, 로딩 타임 위빙, 런타임 위빙

  • 컴파일 타임 위빙
    컴파일 시점에 코드에 공통 기능을 추가하는 방법이다.
  • 로딩 타임 위빙
    클래스 로딩 시점에 바이트 코드에 공통 기능을 추가하는 방법이다.
  • 런타임 위빙
    런타임에 공통 기능을 추가하는 방법이다. (Spring AOP 방식)
    스프링 AOP에서는 CGLIB Proxy, JDK Dynamic Proxy를 이용한 런타임 위빙 방식을 제공한다.

6. 애스팩트(Aspect) 또는 어드바이저(Advisor)

여러 객체에 공통으로 적용되는 기능을 분리하여 작성한 클래스이다.
AOP의 핵심은 Aspect이다. 이것은 포인트 컷과 어드바이스의 결합으로 어떤 포인트 컷 메서드에 대해서
어떤 어드바이스를 실행할지 결정한다. 이 에스캑트 설정에 따라 AOP의 동작 방식이 결정된다.


참고

profile
Back-end Developer

0개의 댓글