스프링 2번째_AOP개념

Web/Spring 2015. 7. 9. 18:04 Posted by Request

5)AOP 개념
(참조사이트 : http://najuung.tistory.com/65)

AOP 목적에서 횡단관심사를 모듈화하기 위하여 AOP를 만들었다고 하였다.
여기서 우리 AOP의 원론적인 의미를 알아야 할 필요가 있다.

Aspect 지향프로그래밍
횡단 관심사를 모듈화할 때 특별한 클래스로 모듈화 하는데 그 특별한 클래스가 바로 애스팩트라고 부른다.

AOP에서 가장 중요한 용어는 Advice(어드바이스), Point Cut(포인트 컷), 조인 포인트(Join Point) 3가지이다.

 

 

 

 

 

 


5.1) Advice
Aspect는 자신이 무엇을 해야 할 지 알고 있어야 한다.
(어드바이스 = 애스팩트가 해야 할 작업)

어드바이스는 액스팩트가 해야하는 작업에 대하여 언제 그 작업을 수행해야하는지 정의를 해준다.
어드바이스가 정의하는 언제는 메소드가 호출이전인지, 이후인지, 아니면 이전/이후 모두인지 그것도 아니면 예외를 던졌을 때인지를 의미한다.

 

*이전(Before) : 어드바이스 대상 메소드가 호출되기 전에 어드바이스 기능을 수행한다.
*이후(After)  : 결과에 상관없이 어드바이스 대상 메소드가 완료된 후에 어드바이스 기능을 수행한다.
*반환 이후 (after-returning) : 어드바이스 대상 메소드가 성공적으로 완료된 후에 어드바이스 기능을 수행한다.
*예외 발생 이후(after-throwing) : 어드바이스 대상메소드가 예외를 던진 후에 어드바이스 기능을 수행한다.
*주의 (around) : 어드바이스가 어드바이스 대상메소드를 감싸서 어드바이스 대상 메소드 호출 전과 후에 몇가지 기능을 제공한다.


5.2) Joinpoint
 애플리케이션 하나에도 어드바이스를 적용 할 있는 곳이 무수히 많으며 적용할 수 있는 곳을 조인 포인트라고 말한다.
즉, 조인포인트는 애플리케이션 실행에 애스팩트를 끼워 넣을 수 있는 지점이며 이러한 조인 포인트 지점은 메소드 호출지점이나
예외발생, 필드값 수정 등이 있다.


5.3)pointcut
한 애스팩트가 전체 애플리케이션의 모든 조인포인트를 다 어드바이스 할 수 없다.
이 때문에 포인트 컷은 애스팩트가 어드바이스할 조인포인트의 영역을 좁혀주는 역할을 한다.
어드바이스가 애스팩트가 무엇을 언제할지 정의한다면 포인트컷은 어디서를 정의하는 역할은 한다고 보면된다.


5.4)Aspect
애스팩트는 어드바이스와 포인트 컷을 합친 것이다.
두가지 정보가 합쳐지면 무엇을 언제할지에 대한 모든 정보가 정의된다.


5.5)인트로덕션
인트로덕션을 앞서 설명했던 AOP정점 중 기존 클래스에 코드변경없이 새 메소드가 멤버 변수를 추가하는 기능이다.
-예를 들어 어떤 객체의 상태가 언제 마지막으로 변경되었다라는 정보는 추가하는 경우를 생각해보자.


5.6)위빙
어드바이스를 핵심코드 로직에 적용하는 것을  위빙(weaving)이라고 한다.

어드바이스를 위빙하는 방식은 3가지 방식이 존재한다.

*컴파일 시에 위빙하기.
컴파일 시 코드를 삽입하는 방법은 aspectJ에서 사용하는 방식이다.
컴파일 방식에서는 핵심 로직을 구현한 자바 코드를 컴파일 할 때 알맞은 위치에 공통코드를 삽입한다.
공통코드 횡단관심사(애스팩트)를 모듈화한 코드를 말한다.

이렇게 컴파일된 코드는 AOP가 적용된 클래스 파일이 생성된다.
컴파일 방식을 제공하는 AOP 도구는 공통코드를 알맞은 위치에 삽입할 수 있도록 도와주는 컴파일러나 IDE를 제공한다.

*클래스 로딩시에 위빙하기.
AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공한다.
이 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다.


*런타임 시에 위빙하기
-스프링은 자체적으로 프록시 기반의 AOP를 지원하고 있음

런타임시 AOP를 적용할 때는 소스코드나 클래스 정보 자체를 변경하지 않는다. 대신 프록시를 이용하여 AOP를 적용한다.
프록시 기반의 AOP는 핵심로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해 핵심로직을 구현한 객체에
접근하게 된다.
프록시는 핵심로직을 실행하기 전 또는 후에 공통기능을 적용하는 방식으로 aop를 적용한다.
프록시 기반에서는 메서드가 호출 될 때에만 어드바이스를 적용할 수 있기 때문에 필드 값 변경과 같은 조인 포인트에 대해서는 적용할 수 없는
한계가 있다.

 


6.spring에서의 AOP의 특징
6.1)스프링은 자체적으로 프록시 기반의 AOP를 지원한다.
그래서 스프링 AOP는 메서드 호출 조인포인트만을 지원한다.
만약 필드 값 변경 같은 조인포인트를 사용하고 싶다면 AspectJ같은 풍부한 기능을 지원하는 AOP도구를 사용해야 한다.
(JEE 어플리케이션을 구현하는데 필요한 수준의 기능만을 제공한다.)

6.2)스프링 AOP는 자바기반이다.
AspectJ는 애스팩트를 위한 별도의 문법을 제공하고 있는 반면 스프링은 별도의 문법을 익힐 필요 없이 자바언어를 이용하면 된다.

 

 


<aop:config> AOP 설정정보임을 나타냄

<aop:aspect> 한개의 aspect를 설정한다.
             aspect 태그의 ref속성에는 공통기능을 구현하고 있는 빈을 전달한다.

<aop:pointcut> point태그의 id속성은 pointcut를 구분하는데 사용되는 식별값을 입력받고 expression 속성은 pointcut를 정의하는
aspectJ의 표현식을 입력받는다.

<aop:around> around advice를 설정한다.

@Aspectc 어노테이션은 AspectJ 5번전에서 새롭게 추가된 어노테이션으로서 @Aspect 어노테이션을 사용하면 xml파일에 Advice 및 pointCut등의 설정을
하지 않고도 자동으로 advice를 할 수 있게 되었다.