1) PostSharp Aspect Lifetime
· PostSharp의 핵심은 바로 Post-Compiler입니다. Post-Compiler는 컴파일이 된 이후의 어셈블리를 수정하는 것을 의미합니다.
http://www.codeproject.com/KB/cs/ps-custom-attributes-2.aspx
· PostSharp에서 Aspect는 컴파일 타임에 생성(PostSharp Laos에 의해서) 됩니다. 또한 런타임에 수정된 어셈블리를 로드하여 사용하는 복잡한(?!) Aspect Lifetime를 가지고 있습니다. 이러한 과정을 자세히 알아보겠습니다.
· 컴파일 타임 (숫자는 실질적인 시간의 순서를 나타냅니다.)
1. Aspect 인스턴스화 : 해당 Aspect가 적용될 모든 클래스(Target)에 Aspect를 적용할 수 있는 코드를 만듭니다.
2. 컴파일 타임 초기화 : Aspect 인스턴스 안에 타입, 필드, 메소드를 알 수 있도록 초기화 해줍니다. 여기서 초기화 하는 타입, 필드, 메소드는 런타임에서도 사용할 수 있습니다.
3. 직렬화 : 새롭게 만들어진 어셈블리 리소스에 저장시키기 위해 직렬화해줍니다.
· 런타임
4. 1. 역직렬화 : Aspect를 처음으로 사용하는 시점에 어셈블리 리소스에 저장된 정보들을 역직렬화합니다.
4. 2. 런타임 초기화 : 타입, 필드, 메소드의 속성을 초기화합니다. 여기서는 역직렬화된 필드를 사용하여 역직렬화된 타입, 필드, 메소드를 저장합니다. (다시 말해서 런타임에서는 직렬화된 정보를 역직렬화 하기 때문에 초기화 메서드에서 역직렬화된 필드를 사용하여야 컴파일 타임에 직렬화되었던 정보를 사용할 수 있는 것입니다.)
5. 인터셉트 메소드 호출 : Aspect에 종류에 따라서 각 Aspect가 실행되어야 할 시점을 인터셉트해서 호출합니다.
2) Aspect Kind
종류 |
내용 |
인터셉트 메소드 |
비고 |
On Method Boundary |
메소드의 안에서 일어날 수 있는 시작점과 종료점 등과 같은 인터셉트 메소드를 제공해줌으로써 해당 시점을 인터셉트해 줄 수 있습니다. Trace나 트랜잭션를 사용할 경우에 유용합니다. |
OnEntry, OnSuccess, OnException, OnExit |
|
On Exception |
예외가 발생하는 경우에 처리해야 할 내용을 Aspect로 만들 경우에 사용합니다. |
OnException |
|
On Field Access |
모든 필드에 대한 인터셉트를 제공해줍니다. |
OnGetValue, SetValue |
|
On Method Invocation |
On Method Boundary와 비슷합니다. 차이점은 다른 어셈블리에 있는 메소드도 인터셉트 할 수 있습니다. |
OnInvocation |
|
Composition |
많은 Sub-Aspect를 복합적으로 사용할 경우에 유용합니다. 클래스(Type)에 인터페이스를 구현해줍니다. |
GetPublicInterface CreateImplementationObject |
|
Compound |
많은 Sub Aspect를 복합적으로 사용할 경우에 유용합니다. |
ProvideAspects |
|
Implement Method |
abstract or extern 메소드를 인터셉트 해줍니다. |
OnExecution |
|
Custom Attribute Injector |
타켓에 |
|
|
3) PostSharp + Enterprise Library(이하 EL)
· EL에서도 AOP의 기능을 하는 Policy Injection Application Block(이하 PIAB)이 있습니다. PIAB는 런타임 위빙방식으로 설정파일에 의해서 Policy(정책)에 의해서 다른 Application Block를 사용합니다. 이 PIAB는 MarshalByRefObject를 상속받는 개체를 요구하거나 인터페이스를 상속받는 개체를 요구합니다. (실제로 PIAB 예제를 사용해봤을 경우에는 MarshalByRefObject를 상속받지 않고서도 실행이 잘되었는데 좀 더 확인을 해봐야 할 것 같습니다.)
또한 정책에 의해서 다른 AB를 주입해주면서 Proxy, Factory 개체들을 생성하는데 바로 PostSharp4EntLib에서는 이러한 Proxy와 Factory를 제거하는 것을 목적으로 CodePlex에서 EL의 확장팩 정도의 개념으로 오픈소스로 공개되어 있습니다.
· PostSharp4EntLib에서는 PostSharp의 컴파일 타임에 정책에 해당하는 객체들을 만들어놓고 런타임에 Proxy와 Factory 없이 사용하는 방식이라고 할 수 있습니다. 참고자료 2번에 링크로 가보시면 사용하는 방법이 3가지 나옵니다. 두 가지 아쉬운 점은 3가지 방법중에 마지막 방법이 제대로 동작하지 않는 것과 모든 방식이 정책 부분은 컴파일 타임에 만들어지지만 실질적으로 사용되는 AB의 설정은 App.config에서 불러옵니다. 예를 들어서 정책으로 Logging AB를 사용하면 정책은 컴파일 타임에 만들어지지만 Logging AB에 대한 정보는 App.config에 있어야 한다는 것입니다. 그래서 이 부분을 수정하여 현재는 Logging AB에 대해서만 App.config가 아닌 컴파일 타임에 정책이 만들어지면서 .config의 정보를 어셈블리 리소스에 저장하고 런타임에 불러와 사용하는 방식으로 변경해서 사용하고 있습니다.
4) 참고자료
1. PostSharp Doc : http://doc.postsharp.org/
2. PostSharp4EntLib : http://www.codeplex.com/entlibcontrib/Wiki/View.aspx?title=PostSharp4EntLib&referringTitle=Home
3. PIAB : http://msdn.microsoft.com/en-us/library/cc511729.aspx