.NET 을 이용하여 AOP (Aspect Oriented Programming) 를 구현 할 수 있는 방법을 찾아 보던 중에 Ayende @ Rahien 블로그에서 .NET에서 AOP를 구현할 수 있는 방법 7가지를 소개한 내용이 있어 이 내용을 옮겨 적어 본다.
나 역시 .NET에서 AOP를 구현할 수 있는 방법에 대해 많은 고민과 연구를 해 봤지만 오픈 소스로 공개 되어 프레임워크들은 자신의 프레임워크를 이용할 경우 지원을 하지만 일반적인 부분에서는 지원하기 힘들 것이 사실이다. 많은 부분을 찾아 봤지만 .NET 자체에서 AOP를 구현할 수 있는 방법은 Remoting Proxy를 사용하는 방법인데 이 것도 기술이 제한 적이라 모든 부분에 적용하기 힘들고, ContextBoundObject를 이용한 방법도 있지만 이 부분도 Interface가 아닌 Class를 상속 받아야 하는 관계로 적용하기에는 아주 제한적이다. 아래 내용은 위에서 소개한 블러그의 내용이다.
접근 방법 | 장점 | 단점 |
Remoting Proxies | .NET Framework 제공 하고 있기 때문에 쉽게 implement 할 수 있음 | Interface 또는 MarshalByRefObjects 만 지원하고 성능 다소 좋지 못함 |
Deriving form ContextBoundObject | Native 에 대해서도 쉽게 AOP를 구현 할 수 있음 | 성능을 위한 비용을 많이 사용함 |
Compile-time subclassing (Rhino Proxy) | 쉽게 이해 할 수 있음 | Interface or virtual methods 만 지원함 |
Runtime subclassing (Castle Dynamic Proxy) | 쉽게 이해 할 수 있고 매우 유연함 | Interface or virtual methods 만 지원함 |
Hooking into the profiler API (TypeMock) | 아주 막강함 | 성능에 저하를 가져옴 |
Compile time IL-weaving (PostSharp / Cecil) | 매우 막강하고 좋은 성능을 보장하고 있음 | 적용하기 매우 힘듦 |
Runtime IL-weaving (PostSharp / Cecil) | 매우 막강하고 좋은 성능을 보장하고 있음 | 적용하기 매우 힘듦 |
위의 내용을 보면 Ayende @ Rahien 개인 생각인 듯 하다. 위의 것 중에서 일반 공개 Framework 인 Rhino Proxy, Castle Dynamic Proxy의 경우는 소스 코드만 리뷰한 상태라 뭐라고 할 말은 없고 그 밑에 나머지 부분도 아직 리뷰나 사용해 본 경험이 없어 연구를 해 볼 만한 과제인 듯 하다. 그렇지만 위의 2가지는 사용해 본 결과 이 친구가 얘기 하는 것처럼 성능 부분에 대한 이슈를 제기 하고 있는데 (표현을 Somewhat heavy weight …, Very costly in terms of performance) 실제 적용해 보고 성능 테스트를 진행해 본 결과 이 코드를 적용 할 경우와 그렇지 않은 경우에 대비 해서 10% 정도의 성능 저하만 가지고 있다. 물론 두번째 방법인 ContextBoundObject를 사용해 보지 않았지만 실제 Remoting Proxies 와 마찬가지 패턴으로 돌아 가기 때문에 같은 결과를 가져 올 것으로 예상은 하고 있다. 참고로 성능 테스트는 Road Runner로 진행 하였다.
다음 포스팅은 위의 2가지 방법 (Remoting Proxies, ContextBoundObject)으로 AOP를 구현한 예제를 가지고 블로그에 포스팅 할 생각이다.
2009년 3월 17일 조금 한가 하네요 ^^ .NETer