AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)는 OOP(Object Oriented Programming)의 한계를 극복하는데 매우 좋은 개념이다.

[출처]Toby's Epril : http://toby.epril.com


위 그림은 AOP 예를 간단히 보여주고 있다. 계좌이체, 입출금, 이자계산을 담당하는 Class는 핵심모듈로 구분된다. 보안, 로깅, 트렌젝션과 같은 것은 핵심을 보조하는 횡단모듈로 구분된다. OOP만으로 하다보면 핵심안에 횡단이 섞이는 현상이 발생하기 쉽다. 가령, 로깅기능이 계좌,입출금,이자계산에 모두 섞여서 나중에 유지보수 및 확장성이 매우 힘들게 된다. 그 예로, 핵심기능에 문제가 발생했을때 관리자에게 문자로 메시지를 보내는 기능도 포함한다고 하자. 그럼 핵심기능에 문자라는 횡단기능을 추가해서 더 복잡해지는 상황이 발생한다. AOP는 이러한 문제를 깔끔하게 해결해준다. 그러니깐 핵심모듈 Class내에 횡단모듈 Class가 섞이지 않도록 하는 것이 AOP의 핵심이다라고 할 수 있다. 일종의 Class 단일책임의 원칙을 실현할 수 있다.

Java 진영에서 엔터프라이즈급 웹애플리케이션을 제작하면서 AOP 개념을 사용하지 않고서는 확장/유지보수이 매우 어려울지 모른다. Spring framework는 AOP를 지원함으로서 보다 좋은 확장성과 유지보수의 유용성을 보장한다. 또한 다른 클래스에 대한 의존성 없는 클래스 제작이 좋아져 보다 완벽한 단위테스트가 가능해지는 장점도 있다.

.net 계열에서는 Spring.NET에서 AOP를 지원해준다.

하지만 AOP가 장점만 있지는 않을 것이다. 필연적으로 Proxy개념을 도입해 기존 클래스를 감싸서 다른 클래스와의 의존성을 더해주는 형태이므로 속도적인 측면에서 이득은 별로 없다.
AOP는 컴파일, 클래스 로딩, 런타임 3가지 형태로 적용(이 과정을 Weaving이라 함)하는 방법이 있다. 자바 Spring AOP는 Proxy개념을 도입하기 때문에 런타임시 기존 클래스를 감싸서 다른 클래스와의 의존성을 더해주는 형태이므로 속도적인 측면에서는 이득이 별로 없을 수 있지만 장점이 더 많기 때문에 잘 사용된다.

AOP에 대한 개념을 알기 위해 다음 글들이 매우 좋은 것 같다. 참고 바란다.


Java 진영에서 Spring Framework로 AOP에 관심을 가지면 다음 링크 정도는 알고 있어야 하지 않을까 생각한다.


다음글은 Spring 을 통한 AOP를 개발하기 위한 참고 글들이다. 좋은 참고가 될 것이다.


간단한 테스트를 하려면 Eclipse에 AJDT, SpringIDE를 설치하고 아래 소스로 감각을 익힐 수 있지 않을까 생각한다. 소스는 원래 http://whiteship.me/1173 의 소스를 약간 변경한것이다. Spring Framework 3.0을 다운받아 사용했다.


Eclipse에서 Java Project를 만들고 그 프로젝트에 Import 시켜서 테스트 하면 되겠다. 단, SpringAOPAspectJ는 반드시 AJDT 플러그인이 설치되어 있어야 컴파일/실행이 가능하겠다.

AOP는 웹애플리케이션에서는 큰 이득이 있겠으나 일반 애플리케이션에서는 속도 및 용량 측면에서 이득보다 실이 더 많을 수 있을지 모르겠다는 판단이 든다. 더 공부해 봐야겠다.

글쓴이 : 지돌스타(http://blog.jidolstar.com/687)

+ Recent posts