ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AOP
    Spring_FrameWork 2018. 12. 17. 11:03

    AOP는 흔히 관점 지향 프로그래밍이는 용어로 번역되는데 이때 관점이라는 용어가 현실적으로 와 닿지 않는다 

    관점이라는 용어대신 개발자들에게는 관심사라는 말로 통용된다.

    관심사는 개발시 필요한 고민이나 염두를 두어야하는 일이라 생각할 수 있는데  코드를 작성하면서 염두에 두는 일은 다음과 같다


    - 파라미터가 올바르게 들어왔을까?

    - 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가?

    - 이작업에서 발생할수 있는 모든 예외는 어떻게 처리해야하는가?


    핵심 로직은 아니지만 코드를 온전하게 만드릭 위해서 필요한 고민들인데 전통적인 방식에서는 개발자가 반복적으로 이러한 고민을 코드에 반영한게된다.

    AOP는 이러한 고민에 대한 문제를 조금 다른방식으로 접근한다. 

    AOP가 추가하는 것은 관심사의 분리(serparate concerns)이다. AOP는 개발자가 염두에 두어야야 할 일을 별도의 관심사로 분리하고 핵심 비즈니스 로직만 작성할 것을 권장한다.

    관심사를 쉽게 생각하면 주변로직이라고 표현하고싶다 예를 들어 나눗샘을 구현한다고 치면 

    핵심로직은 두개의 숫자를 나누는 것이지만 

    주변로직은 0을 나누는 것이 아닌지 등을 체크하는 것이다 . 

    관심사는 바로 이런 가장 중요한 로직은 아니지만 사전조건이나 사후 조건등이라고 간주 할수 있다.


    AOP는 과거에 개발자가 작성했던 '관심사 + 비즈니스 로직'을 분리해서 별도의 코드로 작성하도록 하고 ,

    실행 할때 이를 결합하는 방식으로 접근한다. 과거에 비즈니스 로직을 작성하면서 그 내부에 필요한 관심사를 처리하던 방힉과 정방대의 접근 방식 이라고 볼수있다 .

    개발자가 작성한 코드와 분리된 관심사를 구현한 코드를 컴파일 혹은 실행 시점에 결합시킨다. 실제 실행은 결합된 코드가 실행되기 때문에 

    개발자들은 핵심 비즈니스 로직에 근거해 코드를 작성하고,  나머지는 어떤 관심사들과 결합 할 것인지를 설정하는 것만으로 모든 개발을 마칠수 있게 된다.

    예를 들어 AOP를 이용하면 작성된 모든 메서드의 실행 시간이 얼마인지 기록하는 기존의 코드의 수정없이도 작성할 수있고 잘못된 파라미터가 들어와서 예외가 발생하는 상황을 기존코드의 수정없이 도 제어 할수 있습니다. 스프링이 AOP를 지원하는것이 스프링의 가장 중요한 특징중에 하나로 말하게 된 이유 역시 별도의 복잡한 설정이나 제약 없이 스프링 내에서 간편하게 AOP의 기능들을 구현할 수 있다 .


    AOP 용어들

    AOP는 기존의 코드를 수정하지 않고 , 원하는 기능들과 결합 할수있는 패러다임이다.
    AOP를 구현하기 위해서는 다음과 같은 핵심적인 그림들을 이해할 필요가 있다.


    개발자 입장에서 AOP를 적용한다는 것은 기존의 코드를 수정하지 않고도 원하는 관심사(cross-concern)들을 엮을 수 있다는 점이다.

    위 그림에서 Target 에 해당하는 것이 바로 개발자가 작성한 핵심 비즈니스 로직을 가지는 객체 이다.

    Target은 순수한 비즈니스 로직을 의미하고, 어떠한 관심사들과도 관계를 맺지 않는다 .

    순수한 코어(core)라고 볼 수 있다.

    Target을 전체적으로 감싸고 있는 존재를 Proxy라고 한다.

    Proxy는 내부적으로 Target을 호출하지만 , 중간에 필요한 관심사들을 거쳐서 Target을 호출하도록 자동 혹은 수동으로 작성된다.

    proxy의 존재는 직접 코드를 통해서 구현하는 경우도 있지만, 대부분의 경우 스프링  AOP 기능을 이용해서 

    자동으로 생성되는 (auto-proxy)방식을 이용한다. 


    JoinPoint는 Target 객체가 가진 메서드이다. 외부에서의 호출은 Proxy 객체를 통해서 Target 객체의JoinPoint를 호출하는 방식이라고 이해할수 잇다.


    그림을 통해서 Advice와 JoinPoint의 관계를 좀더 상세하게 표현하면 다음과 같다.

    JointPoint는 Target이 가진 여러 메서드라고 보면 된다.(엄밀하게 스프링 AOP에서는 메서드만이 JoinPoint 가 된다.)

    Target에는 여러 메서드가 존재하기 때문에 어느 메서드를 관심사를 결합할 것인지를 결정 해야하는데 이 결정을 Pointcut이라한다


    Pointcut은 관심사와 비즈니스 로직이 결합되는 지점을 결정하는것

    앞의 Proxy는 이 결합이 완성된 상태이므로 메서드를 호출하게 되면 자동으로 관심사가 결합된 상태로 동작하게된다.

    관심사(concern)는 위 그림에서 Aspect와 Advice라는 용어로 표현되었다,

    Aspect는 조금 추상적 개념을 의미

    Aspect는 관심사 자체를 의미하는 추상명사라고 볼수있고 adcive는 Aspect 를 구현한코드이다.


    Advice는 실제 걱정거리를 분리해 놓은 코드를 의미합니다. Advice는 그 동작 위치에 따라 다음과 같이 구분된다.

     구분

    설명 

    Before Advice 

     Target JointPoint 를 호출하기 전에 실행되는 코드이다.

    코드의 실행 자체에는 관여 할 수 없다. 

     After Returning Advice

     모든 실행이 정상적으로 이루어진 후에 동작하는 코드입니다. 

     After Therowing Advice

     예외가 발생한 뒤에 동작하는 코드이다.

     After Advice

     정상적으로 실행되거나 예외가 발생했을 때 구분 없이 실행되는 코드 입니다. 

     Around Advice

     메서드의 실행 자체를 제어할 수 있는 가장 강력한 코드 직접 대상의 메스드를 호출하고 결과나 예외를 처리 할수 있다. 


    Advice는 과거의 스프링에서는 별도의 인터페이스로 구현되고 , 이를 클래스로 구현하는 방식으로 제작했으나 

    스프링 3버전 이후에는 어노테이션만으로 모든 설정이 가능하다 . 

    Target에 어떤  Advice를 적용할 것인지는 XML을 이용한 설정을 이용 할 수 있고, 

    어노테이션을 이용하는 방식을 이용할 수있다. 예제는 어노테이션을 이용해서 상황에 맞는  Advice를 적용


    Pointcut은 Advice를 어떤 JointPoint에 결합할 것인지를 결정하는 설정입니다. AOP에서 Target은 결과적으로 Pointcut에 의해서 

    자신에게는  없는 기능들을  가지게 된다. 

    Pointcut은 다양한 형태로 선언해서 사용할 수 있는데 주로 사용되는 설정은 다음과 같다 .


     구분

    설명 

     execution(@execution) 

     메서드를 기준으로 Pointcut을 설정합니다. 

     within(@within) 

     특정한 타입(클래스)을 기준으로 Point을 설정합니다. 

     this 

     주어진 인터페이스를 구현한 객체를 대상으로 Pointcut을 설정합니다. 

     args(@args) 

     특정한 파라미터를 가지는 대상들판 Pointcut 으로 설정합니다.

     @annotation 

     특정한 어노테이션이 적용된 대상들만을 Pointcut으로 설정한다. 

































    'Spring_FrameWork' 카테고리의 다른 글

    AOP:args를 이용한 파라미터 추적  (0) 2018.12.18
    AOP연습  (0) 2018.12.17
    댓글의 페이징 처리  (0) 2018.12.13
    댓글의 CRUD 이벤트  (0) 2018.12.11
    JavaScript 준비  (0) 2018.12.09
Designed by Tistory.