블로그 이미지
.NETer

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Notice

2009. 3. 17. 19:25 Reflection .NET/Architecture

.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

posted by .NETer

댓글을 달아 주세요

prev 1 2 3 4 5 6 7 8 9 10 ··· 25 next