관점지향 프로그래밍?????

등짝을보자의 이미지

문서을 찾아서 읽어도 이게 대체 무슨뜻인지

모르겠더군요... ?

간단히 설명해 주실분 안계신가요??

현재 지원하는언어가 무슨언어인가요??

lacovnk의 이미지

이번 마소에서 나왔던데,

어렵다고 겁주길래 잘 안읽어봤습니다 ㅎㅎ;;

잠깐 인용하면,

Quote:
AOP는 OOP의 확장에 가깝기 때문에 전용 언어나 독립된 개발 툴을 가지고 있지 않고 대신 기존의 OOP를 확장한 언어 확장(language extension) 또는 툴이나 프레임워크 형태로 사용할 수 있게 되어 있다.

AOP 툴 비교로

AspectJ, AspectWerkz, JBossAOP, SpringAOP

를 들었네요. 참고하시길~

purple의 이미지

wikipedia를 보시면 개요가 잘 설명되어 있는 것 같네요.
http://en.wikipedia.org/wiki/Aspect-oriented_programming

간단히 말해서 로깅, 트랜잭션의 시작과 끝 등과 같은 cross-cutting한 문제를 모듈화하고 캡슐화해보자는 걸로 알고 있습니다. 예를 들어 어떤 시스템에 로깅 기능을 추가하고자 한다면 모든 기존 메소드에 로깅 코드를 추가해야 할 겁니다. 즉 로깅 기능은 주 기능과는 구별되는 기능이지만 부 기능으로서 여러 주기능들에 흩어져 있게 됩니다. 이러한 것을 cross-cut 하다고 하는데 이것을 모듈화해 보자는 겁니다.

저는 자바쪽 구현만 알고 있습니다만, AspectJ 가 이 aop의 대표적인 구현체로 알고 있습니다. 이것은 자바를 확장한 문법을 가지고 있습니다. 일반 자바에 proxy 나 class 파일 조작(?) 등을 통해 구현한 것이 AspectWerkz, SpringAOP 등입니다.

현재 Spring을 사용하고 있어서 aop를 이용해 보려 하고 있습니다만, 업무에 ideal하게 적용하는 건 좀 힘든 것 같더군요.

seachicken의 이미지

몇번 관심은 가져 보았습니다만 실제 사용은 아직 안하고 있습니다. (사실, 코딩 할 일이 최근 없어져서.. )
다만, 이전에 자바 프레임워크를 설계할때의 경험에서 말씀드리면 적어도 세큐리티 관련 부분 -접근, 인증, 인가 등-, 또는 모니터링 관련 부분에서는 쓸만하지 않나 합니다.
반대로, 관점지향 프로그래밍에서 자주 예를 드는 로깅 기능의 구현은, 적어도 디버그를 위한 로깅에는 그다지 매력을 느끼지는 못하겠더군요. 메소드를 인터셉트 하여 로그를 집어넣는 수준이라면 실제 로그를 출력하고 싶은 부분에서 출력하기에는 유연성이 떨어지지 않나 하는 생각입니다.
더불어 트렌젝션 관리에 대한 부분에 대해서서.. 조금 회의적입니다. 뭐 그렇게 해서 트렌젝션을 관리하는 것도 한 방법이겠습니다만 프레임워크 안에 그런 기능을 넣어 버리면 그만이지 굳이 관점지향을 채용할 필요가 있을까 하는 생각입니다. (위의 세큐리티 관련 부분도 마찬가지..)

프레임워크라는게 사용자가 이해하기 쉬워야 하는데 그 정도 하려고 관점지향이란 개념을 집어넣기는 배보다 배꼽이 더 큰 것 같아 이전의 프레임워크에는 배제했던 기억이 있습니다. 뭐 관점지향이 객체지향처럼 일반적인 지식으로 광범위하게 채용된다면 그때나 고려해 보겠습니다.

이상, 개인적인 의견..

Stay hungry! Stay foolish!

Seyong의 이미지

실무에서 spring aop를 아주 잘 쓰고 있습니다.
주로 트랜젝션쪽에 활용했는데 상당히 괜찮습니다.

코드 그 어디에도 --ioc 파일 제외-- 트랜젝션 코딩이 없지만 트랜젝션은 완벽히 보장됩니다.

딱 한명만 aop에 대해 개념을 잡아 프레임을 구축해 놓으면 그 다음 실제 개발하시는 수많은 개발자분들이 트랜젝션을 고려하지 않고 매우 편하게 개발할 수 있고, 그 성능도 보장됩니다.

seachicken의 이미지

말씀하신대로 프레임워크 안에 은폐시켜버리는 방법은 있습니다. 일반 개발자는 프레임워크 안을 볼 일은 거의 없으니까 그들은 편하겠지요. 하지만 그 얘긴 곧, 스프링이 아니라도 트렌젝션 지원만 프레임워크에서 해 주면 된다는 얘기이고 그건 기존의 자바 클래스만으로도 얼마든지 간단히 구현이 가능합니다. 프레임워크를 전제한다면 뭐 굳이 스프링이나 관점지향을 도입하지 않아도 마찬가지라 이거죠. 역으로 프레임워크 개발자에게는 그런대로 쓸만한 개념이라 하겠네요.

제가 스프링을 채용하지 않은 이유를 추가설명 드리면 당시 썬의 아키텍트와 제가 둘이서 그 프레임워크를 설계하고 있었지만 실제 유지보수는 외주 개발사에서 하게 되어 있었습니다. 그리고 그들과 얘기를 나누어 보았지만 그다지 높은 수준을 요구하기는 어렵겠더군요. 지적하신 똑똑한 한명의 확보라는 문제가 현실적으로 언제나 가능하지 않다는 얘기지요.

또 하나의 이유는 제가 개인적으로 스프링을 싫어했기 때문입니다. 제 경우 "뭐든 간단한게 젤이여"라는 신조를 가지고 있습니다만 스프링의 설정파일들.. XML문서 속에 파묻힌 제어구조들.. 은 도대체가 정이 가지 않더군요. 그리고 그 당시에 이미 스프링에서 제공하는 정도의 기능 -특히 DI-은 이미 프레임워크 내부에 구현을 한 상황이었기도 했습니다. (이게 시기적으로 DI란 용어가 슬슬 세상에 얼굴을 내밀던 시기이고 스프링이란 넘은 아직 생소하던 시기이기도 했습니다. )

썬의 아키텍트는 AOP의 도입을 주장했지만 제가 반대를 했었고, 결국 제가 이겼지요. (싸워서 이긴게 아니고 논의 끝에 그리 되었다는 얘기지요. 썬의 아키텍트는 새로운 걸 좋아하는 사람이라 도입하고 싶어했지만 전 현실적인 문제 -유지보수 할 사람들이 보다 쉽게 이해할 수 있어야 한다-를 이유로 반대한 것이죠. ) 참고로 당시의 프레임워크 작성 프로젝트명이 원숭이 프로젝트였습니다. 원숭이라도 사용할 수 있는 간단한 프레임워크를 만든다는 것이었지요.

(참고로 개발자를 원숭이로 비하한다는 곡해가 있을까 해서 얘기하는데 이건 일본의 얘기입니다. 일본에서는 "원숭이도 할 수 있는 무엇무엇"이란 표현이 자주 쓰입니다. 그런 책도 있지요. 원숭이도 할 수 있는 리눅스 등등..)

역으로 제가 궁금한 것은 아래와 같은 점입니다.

- 관점지향이란 넘의 용도가 세큐리티, 트렌젝션 제어 지원, 로깅(이건 가려운데를 확실히 긁을 수 없는 어정쩡한 레벨에서의 로깅) 이외에 어떤 용도가 있을까? = 시스템 횡단적인 관심사항이 그 외에 뭐가 있을까? 하는 질문.

- 그런 용도들이 과연 기존 시스템이나 아키텍쳐에 도입할만한 가치가 있을까? (특히나 프레임워크의 사용이 전제되는 현재의 개발환경에서)

위의 두가지에 대한 답이 명확하지 않다면 전 여전히 관점지향의 도입을 미룰 것입니다.

(참고로, 위 글은 1년반 전의 지식을 바탕으로 쓰고 있습니다. 그간 다른 일을 하고 있으므로 최근의 상황에는 문외한입니다. 새로운 발전등이 있었다면 가르침을 주시길..)

Stay hungry! Stay foolish!