{{위키데이터 속성 추적}}
{{프로그래밍 패러다임}}
[[컴퓨팅]]에서 '''관점 지향 프로그래밍'''({{lang|en|aspect-oriented programming}}, AOP)은 [[횡단 관심사]](cross-cutting concern)의 [[관심사의 분리|분리]]를 허용함으로써 [[모듈성]]을 증가시키는 것이 목적인 [[프로그래밍 패러다임]]이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 [[포인트컷]](pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 [[비즈니스 로직]]에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 [[관점 지향 소프트웨어 개발]]의 토대를 형성한다.

관점 지향 소프트웨어 개발은 온전한 엔지니어링 분야를 가리키는 반면에 관점 지향 프로그래밍은 소스 코드 레벨에서 관심사들의 모듈화를 지원하는 프로그래밍 메서드들과 도구들을 포함하고 있다.

관심 지향 프로그래밍은 프로그램 로직을 명확한 부분들(이른바 "관심사")로 나누는 것을 수반한다. 거의 모든 프로그래밍 패러다임들은 관심사들을 별도의 독립적인 엔티티로 그룹화하고 [[캡슐화]]하는 것을 어느 정도는 지원하며, 이는 이러한 관심사들을 구현, 추상화, 합성하기 위해 사용할 수 있는 추상화(예: 함수, 프로시저, 모듈, 클래스, 메서드)를 제공함으로써 수행된다. 일부 관심사들은 프로그램 내의 여러 추상적 개념들에 영향을 미치며 이러한 형태의 구현체를 거역한다. 이러한 관심사들을 크러스 커팅 관심사(cross-cutting concerns)라고 부른다.

횡단 관심사의 전형적인 예로 [[데이터 로깅|로깅]]을 들 수 있는데 로깅 전략이 필연적으로 시스템 상에서 로그되는 모든 부분에 영향을 미치기 때문이다. 그러므로 로깅은 로그가 되는 모든 클래스들과 메서드들을 횡단한다.

모든 AOP 구현체들은 각각의 관심사를 한 자리에 캡슐화하는 횡단 표현식들을 일부 보유하고 있다. 구현체들 간의 차이점은 제공되는 생성자들의 권한, 보안, 사용성에 기인한다.

== 역사 ==
AOP에는 여러 선행자 A1, A2가 있다:<ref>{{콘퍼런스 인용| doi = 10.1007/BFb0053381| title = Aspect-oriented programming| work = Proceedings of the 11th European Conference on Object-Oriented Programming| conference = [[European Conference on Object-Oriented Programming|ECOOP]]'97| volume = 1241| pages = 220–242| series = [[Lecture Notes in Computer Science|LNCS]]| year = 1997| last1 = Kiczales | first1 = G. | author1-link = Gregor Kiczales | last2 = Lamping | first2 = J. | last3 = Mendhekar | first3 = A. | last4 = Maeda | first4 = C. | last5 = Lopes | first5 = C. | last6 = Loingtier | first6 = J. M. | last7 = Irwin | first7 = J. | isbn = 3-540-63089-9| citeseerx = 10.1.1.115.8660| url = http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf}}</ref> [[반영 (컴퓨터 과학)|반영]], [[메타오브젝트|메타오브젝트 프로토콜]], [[주체 지향 프로그래밍]], 컴포지션 필터(Composition Filters), 적응형 프로그래밍(Adaptive Programming).<ref>"Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" ''Karl Liebherr'' 1996 {{ISBN|0-534-94602-X}} presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).</ref>

[[팰로앨토 연구소|제록스 PARC]]의 Gregor Kiczales와 동료들은 명시적 개념의 AOP를 개발하였으며 [[AspectJ]] AOP 확장 기능을 자바로 가져왔다. IBM의 연구팀은 언어 설계 접근으로 도구 접근을 추구하였으며 2001년에 [[주체 지향 프로그래밍|Hyper/J]]와 관심 조작 환경(Concern Manipulation Environment)을 제안하였으나 널리 사용되지는 않았다.

[[마이크로소프트 트랜잭션 서버]]가 최초의 주요 AOP 애플리케이션으로(이후에는 [[엔터프라이즈 자바빈즈]]) 간주된다.<ref name="BoxSells2002">{{서적 인용|author1=Don Box|author2=Chris Sells|title=Essential.NET: The common language runtime|url=https://books.google.com/books?id=Kl1DVZ8wTqcC&pg=PA206|accessdate=4 October 2011|date=4 November 2002|publisher=Addison-Wesley Professional|isbn=978-0-201-73411-9|page=206}}</ref><ref name="RomanSriganesh2005">{{서적 인용|last1=Roman|first1=Ed|last2=Sriganesh|first2=Rima Patel|last3=Brose|first3=Gerald|title=Mastering Enterprise JavaBeans|url=https://books.google.com/books?id=60oym_-uu3EC&pg=PA285|accessdate=4 October 2011|date=1 January 2005|publisher=John Wiley and Sons|isbn=978-0-7645-8492-3|page=285}}</ref>

== 동기와 기본 개념 ==
일반적으로 애스펙트(aspect)는 코드로서 분산되거나 얽혀있으며 이해하고 유지보수하기를 어렵게 만든다. 잠재적으로 서로 완전히 관련이 없는 시스템, 각기 다른 원본 언어 등에서 수많은 비관련 함수들에 로깅과 같은 함수가 분산된다. 즉, 로깅을 바꿀 경우 영향을 받는 모든 모듈의 수정이 필요하다. 애스펙트는 표현이 되는 시스템의 핵심 기능에만 얽혀있는 것이 아니라 서로에게도 얽혀있다.

이를테면, 개념적으로 매우 단순한 메소드가 있는 은행업 애플리케이션을 생각해 보자. 아래는 하나의 계정에서 다른 계정으로 송금하는 것이다:<ref>Note: The examples in this article appear in a syntax that resembles that of the [[자바 (프로그래밍 언어)|자바]] language.</ref>
<syntaxhighlight lang="java">
void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {
  if (fromAcc.getBalance() < amount)
      throw new InsufficientFundsException();

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);
}
</syntaxhighlight>

그러나 이러한 송금 방식은 디플로이된 애플리케이션이 다음을 필요할 것만 고려하고 있다: 현재 사용자가 이 작업을 수행하기 위한 권한이 있는지를 검사하는 보안 검사 기능이 없다. [[데이터베이스 트랜잭션]]은 우연한 데이터 손실을 예방하기 위해 작업을 캡슐화하는 것이 좋겠다. 진단을 위해 이 작업은 시스템 로그에 기록하는 것이 좋겠다. 등등...

이러한 새로운 관심사들의 버전은 이를테면 다음과 같이 보일 수 있다:

<syntaxhighlight lang="java">
void transfer(Account fromAcc, Account toAcc, int amount, User user,
    Logger logger, Database database) throws Exception {
  logger.info("Transferring money...");

  if (!isUserAuthorised(user, fromAcc)) {
    logger.info("User has no permission.");
    throw new UnauthorisedUserException();
  }

  if (fromAcc.getBalance() < amount) {
    logger.info("Insufficient funds.");
    throw new InsufficientFundsException();
  }

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);

  database.commitChanges();  // Atomic operation.

  logger.info("Transaction successful.");
}
</syntaxhighlight>

이 예에서 다른 관심사들은 기초적인 기능(비즈니스 로직 관심사)과 함께 뒤얽혀있다. 트랜잭션, 보안, 로깅은 모두 [[횡단 관심사]]를 가리킨다.

이를테면 우리가 갑자기 애플리케이션에 대한 보안 고려사항을 변경해야 한다면 일어나는 일에 대해서 생각해 보자. 프로그램의 현재 버전에서 보안 관련 기능들은 수많은 메소드를 가로질러 분산되어 있는 것으로 나타나며 이러한 변경은 상당한 노력이 요구된다.

AOP는 프로그래머가 횡단 관심사를 애스펙트라는 독립적인 모듈로 표현할 수 있게 함으로써 이 문제의 해결을 시도한다. 애스펙트는 어드바이스(프로그램 내의 특정 포인트와 결합되는 코드)와 인터타입 선언(다른 클래스에 추가되는 구조적인 멤버)을 포함할 수 있다. 이를테면 보안 모듈에는 은행 계좌에 접근하기 전에 보안 검사를 수행하는 어드바이스를 포함할 수 있다. [[포인트컷]]은 누군가가 은행 계정에 접근하는 시점([[조인 포인트]])을 정의하며 어드바이스 몸체 내의 코드는 어떻게 보안 검사를 구현하는지를 정의한다. 이러한 방식으로 검사와 장소를 한 자리에서 유지보수할 수 있게 된다. 게다가 양호한 포인트컷은 나중의 프로그램 변경을 예측할 수 있으므로 다른 개발자가 은행 계정에 접근하기 위한 새로운 메소드를 만든다면 어드바이스는 실행 시 새로운 메소드에 적용이 가능하다.

그러므로 위의 예제에 애스펙트에 로깅을 구현하면 다음과 같이 된다:

<syntaxhighlight lang="aspectj">
aspect Logger {
  void Bank.transfer(Account fromAcc, Account toAcc, int amount, User user, Logger logger)  {
    logger.info("Transferring money...");
  }

  void Bank.getMoneyBack(User user, int transactionId, Logger logger)  {
    logger.info("User requested money back.");
  }

  // Other crosscutting code.
}
</syntaxhighlight>

AOP를 디버깅 도구나 사용자 수준의 도구로 생각하는 사람이 있을 수 있다. 어드바이스는 함수 변경을 취할 수 없는 경우에 대비하여 (사용자 레벨)<ref>[https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html Emacs documentation]</ref>, 또 운영 모드(디버깅)에서 함수를 변경하고 싶지 않을 때 예비해 두는 것이 좋다.

== 구현 ==
다음의 [[프로그래밍 언어]]들은 언어 자체적으로, 또는 외부 라이브러리를 통해 AOP를 구현하고 있다:
* [[닷넷 프레임워크]] 언어 ([[C 샤프|C#]] / [[비주얼 베이직 닷넷|VB.NET]])<ref>Numerous:
[https://github.com/vc3/Afterthought Afterthought], [http://www.rapier-loom.net/ LOOM.NET], [http://www.codeplex.com/entlib Enterprise Library 3.0 Policy Injection Application Block], [http://sourceforge.net/projects/aspectdng/ AspectDNG], [http://www.castleproject.org/projects/dynamicproxy/ DynamicProxy], [http://composestar.sourceforge.net/ Compose*], [http://www.postsharp.net/ PostSharp], [http://www.seasar.org/en/dotnet/ Seasar.NET], [http://dotspect.tigris.org/ DotSpect (.SPECT)] {{웨이백|url=http://dotspect.tigris.org/ |date=20060331071126 }}, [http://www.springframework.net/ Spring.NET] (as part of its functionality), [http://www.cs.columbia.edu/~eaddy/wicca Wicca and Phx.Morph], [http://setpoint.codehaus.org/ SetPoint] {{웨이백|url=http://setpoint.codehaus.org/ |date=20081007002006 }}</ref>
** [https://www.postsharp.net/ PostSharp]는 상용 AOP 구현체이다.
** [[유니티 애플리케이션 블록|유니티]]: API를 제공.
* [[액션스크립트]]<ref>{{웹 인용 |url=http://www.as3commons.org/as3-commons-bytecode |제목=as3-commons-bytecode |확인날짜=2017-07-22 |archive-date=2014-10-03 |archive-url=https://web.archive.org/web/20141003100345/http://www.as3commons.org/as3-commons-bytecode/ |url-status=dead }}</ref>
* [[에이다 (프로그래밍 언어)|에이다]]<ref>[http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf Ada2012 Rationale]</ref>
* [[오토핫키]]<ref>[http://www.autohotkey.com/forum/viewtopic.php?p=243426 Function Hooks]{{ {{웹아카이브|url=https://archive.today/20130117125117/http://www.autohotkey.com/forum/viewtopic.php?p=243426 |날짜=2013년 1월 17일 }}</ref>
* [[C (프로그래밍 언어)|C]] / [[C++]]<ref>Several: [[AspectC++]], [http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/ FeatureC++], [http://www.cs.ubc.ca/labs/spl/projects/aspectc.html AspectC], [http://www.aspectc.net/ AspeCt-oriented C] {{웨이백|url=http://www.aspectc.net/ |date=20081120144608 }}, [http://www.bramadams.org/aspicere/index.html Aspicere]{{ {{웹아카이브|url=https://archive.today/20120721212648/http://www.bramadams.org/aspicere/index.html |날짜=2012년 7월 21일 }}</ref>
* [[코볼]]<ref>[http://homepages.vub.ac.be/~kdeschut/cobble/ Cobble]{{깨진 링크|url=http://homepages.vub.ac.be/~kdeschut/cobble/ }}</ref>
* [[코코아 (API)|코코아]] [[오브젝티브-C]] 프레임워크<ref>{{웹 인용 |url=http://www.ood.neu.edu/aspectcocoa/ |제목=AspectCocoa |확인날짜=2018년 5월 5일 |보존url=https://web.archive.org/web/20071026022525/http://www.ood.neu.edu/aspectcocoa/ |보존날짜=2007년 10월 26일 |url-status=dead }}</ref>
* [[어도비 콜드퓨전]]<ref>[http://www.coldspringframework.org/ ColdSpring]{{ {{웹아카이브|url=https://archive.today/20120803082600/http://www.coldspringframework.org/ |날짜=2012년 8월 3일 }}</ref>
* [[커먼 리스프]]<ref>{{웹 인용|url=http://common-lisp.net/project/closer/aspectl.html|title=Closer Project: AspectL.|publisher=|accessdate=11 August 2015}}</ref>
* [[델파이]]<ref>{{웹 인용|url=https://code.google.com/p/infra/|title=infra -      Frameworks Integrados para Delphi - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref><ref>{{웹 인용|url=https://code.google.com/p/meaop/|title=meaop -      MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref><ref>{{웹 인용|url=https://code.google.com/p/delphisorcery/|title=Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref>
* [[옥시즌 (프로그래밍 언어)|옥시즌]]<ref>{{웹 인용 |url=http://prismwiki.codegear.com/en/Cirrus |제목=RemObjects Cirrus |확인날짜=2018년 5월 5일 |보존url=https://web.archive.org/web/20120123094027/http://prismwiki.codegear.com/en/Cirrus |보존날짜=2012년 1월 23일 |url-status=dead }}</ref>
* [[:en:E (verification language)|e]] (IEEE 1647)
* [[Emacs Lisp]]<ref>[https://www.gnu.org/software/emacs/elisp/html_node/Advising-Functions.html Emacs Advice Functions]</ref>
* [[그루비]]
* [[하스켈]]<ref>[[monad (functional programming)]] ({{저널 인용| citeseerx = 10.1.1.25.8262 | title = Monads As a theoretical basis for AOP }}) and [http://portal.acm.org/citation.cfm?id=1233842 Aspect-oriented programming with type classes.] [http://dl.acm.org/citation.cfm?id=2451457 A Typed Monadic Embedding of Aspects]</ref>
* [[자바 (프로그래밍 언어)|자바]]<ref>Numerous others: [http://www.caesarj.org/ CaesarJ] {{웨이백|url=http://www.caesarj.org/ |date=20081219181529 }}, [http://composestar.sourceforge.net/ Compose*], [http://dynaop.dev.java.net/ Dynaop] {{웨이백|url=http://dynaop.dev.java.net/ |date=20070724061030 }}, [http://jac.objectweb.org/ JAC] {{웨이백|url=http://jac.objectweb.org/ |date=20040619135517 }}, [[Google Guice]] (as part of its functionality), [http://www.csg.is.titech.ac.jp/~chiba/javassist/ Javassist] {{웨이백|url=http://www.csg.is.titech.ac.jp/~chiba/javassist/ |date=20040901095342 }}, [http://ssel.vub.ac.be/jasco/ JAsCo (and AWED)], [http://www.ics.uci.edu/~trungcn/jaml/ JAML] {{웨이백|url=http://www.ics.uci.edu/~trungcn/jaml/ |date=20050415091244 }}, [http://labs.jboss.com/portal/jbossaop JBoss AOP] {{웨이백|url=http://labs.jboss.com/portal/jbossaop |date=20061017211354 }}, [http://roots.iai.uni-bonn.de/research/logicaj LogicAJ] {{웨이백|url=http://roots.iai.uni-bonn.de/research/logicaj |date=20060504154852 }}, [http://www.objectteams.org/ Object Teams], [http://prose.ethz.ch/ PROSE], [http://www.aspectbench.org/ The AspectBench Compiler for AspectJ (abc)] {{웨이백|url=http://www.aspectbench.org/# |date=20141216200424 }}, [[스프링 프레임워크]] (as part of its functionality), [[Seasar]], [http://roots.iai.uni-bonn.de/research/jmangler/ The JMangler Project] {{웨이백|url=http://roots.iai.uni-bonn.de/research/jmangler/ |date=20051028191025 }}, [http://injectj.sourceforge.net/ InjectJ], [http://www.csg.is.titech.ac.jp/projects/gluonj/ GluonJ] {{웨이백|url=http://www.csg.is.titech.ac.jp/projects/gluonj/ |date=20070206010219 }}, [http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp Steamloom] {{웨이백|url=http://www.st.informatik.tu-darmstadt.de/static/pages/projects/AORTA/Steamloom.jsp |date=20070818100432 }}</ref>
** [[AspectJ]]
* [[자바스크립트]]<ref>Many: [http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ Advisable] {{웨이백|url=http://i.gotfresh.info/2007/12/7/advised-methods-for-javascript-with-prototype/ |date=20080704052200 }}, [https://code.google.com/p/ajaxpect/ Ajaxpect], [http://plugins.jquery.com/project/AOP jQuery AOP Plugin] {{웨이백|url=http://plugins.jquery.com/project/AOP |date=20080113184156 }}, [http://aspectes.tigris.org/ Aspectes] {{웨이백|url=http://aspectes.tigris.org/ |date=20060505180548 }}, [http://www.aspectjs.com/ AspectJS], [http://www.cerny-online.com/cerny.js/ Cerny.js] {{웨이백|url=http://www.cerny-online.com/cerny.js/ |date=20070627024906 }}, [http://dojotoolkit.org/ Dojo Toolkit], [http://humax.sourceforge.net/ Humax Web Framework], [https://code.google.com/p/joose-js/ Joose], [[프로토타입 자바스크립트 프레임워크|프로토타입]] - [http://www.prototypejs.org/api/function/wrap Prototype Function#wrap], [http://developer.yahoo.com/yui/3/api/Do.html YUI 3 (Y.Do)] {{웨이백|url=http://developer.yahoo.com/yui/3/api/Do.html |date=20110125115930 }}</ref>
* [[로그토크]]<ref>Using built-in support for categories (which allows the encapsulation of aspect code) and event-driven programming (which allows the definition of ''before'' and after ''event'' handlers).</ref>
* [[루아 (프로그래밍 언어)|루아]]<ref>{{웹 인용|url=http://luaforge.net/projects/aspectlua/|title=AspectLua|publisher=|accessdate=11 August 2015|archive-date=2015-07-17|archive-url=https://web.archive.org/web/20150717094121/http://luaforge.net/projects/aspectlua/}}</ref>
* [[Make (소프트웨어)|make]]<ref>{{웹 인용|url=http://www.bramadams.org/makao/|title=MAKAO, re(verse)-engineering build systems|publisher=|accessdate=11 August 2015|보존url=https://archive.today/20120724151524/http://www.bramadams.org/makao/|보존날짜=2012년 7월 24일|url-status=dead}}</ref>
* [[MATLAB]]<ref>{{웹 인용|url=http://www.sable.mcgill.ca/mclab/aspectmatlab/index.html|title=McLab|publisher=|accessdate=11 August 2015}}</ref>
* [[ML (프로그래밍 언어)|ML]]<ref>{{웹 인용|url=http://www.cs.princeton.edu/sip/projects/aspectml/|title=AspectML - Aspect-oriented Functional Programming Language Research|publisher=|accessdate=11 August 2015}}</ref>
* [[펄]]<ref>{{웹 인용|url=https://metacpan.org/module/Aspect|title=Aspect - Aspect-Oriented Programming (AOP) for Perl - metacpan.org|author=Adam Kennedy|publisher=|accessdate=11 August 2015}}</ref>
* [[PHP]]<ref>Several: [http://aop.io PHP-AOP (AOP.io)] {{웨이백|url=http://aop.io/ |date=20140819083423 }}, [http://go.aopphp.com Go! AOP framework], [https://code.google.com/p/phpaspect/ PHPaspect], [http://www.seasar.org/en/php5/index.html Seasar.PHP], [http://php-aop.googlecode.com/ PHP-AOP]{{ {{웹아카이브|url=https://archive.today/20120712081326/http://php-aop.googlecode.com/ |날짜=2012년 7월 12일 }}, [http://flow.typo3.org/ TYPO3 Flow] {{웨이백|url=http://flow.typo3.org/ |date=20170717200313 }}, [https://github.com/AOP-PHP/AOP AOP PECL Extension]</ref>
* [[프롤로그 (프로그래밍 언어)]]<ref>{{웹 인용 |url=http://www.bigzaphod.org/whirl/dma/docs/aspects/aspects-man.html |제목="Whirl" |확인날짜=2017-07-22 |archive-date=2016-04-20 |archive-url=https://web.archive.org/web/20160420181837/http://www.bigzaphod.org/whirl/dma/docs/aspects/aspects-man.html |url-status= }}</ref>
* [[파이썬]]<ref>Several: [http://peak.telecommunity.com/ PEAK] {{웨이백|url=http://peak.telecommunity.com/ |date=20050409082546 }}, [http://old.aspyct.org Aspyct AOP]{{ {{웨이백|url=http://old.aspyct.org/ |date=20110609153559 }}, [http://www.cs.tut.fi/~ask/aspects/aspects.html Lightweight Python AOP] {{웨이백|url=http://www.cs.tut.fi/~ask/aspects/aspects.html |date=20041009194711 }}, [http://www.logilab.org/projects/aspects Logilab's aspect module] {{웨이백|url=http://www.logilab.org/projects/aspects |date=20050309034259 }}, [http://pythius.sourceforge.net/ Pythius], [http://springpython.webfactional.com/1.1.x/reference/html/aop.html Spring Python's AOP module] {{웨이백|url=http://springpython.webfactional.com/1.1.x/reference/html/aop.html |date=20160304055741 }}, [http://pytilities.sourceforge.net/doc/1.1.0/guide/aop/ Pytilities' AOP module] {{웨이백|url=http://pytilities.sourceforge.net/doc/1.1.0/guide/aop/ |date=20110825101213 }}, [http://python-aspectlib.readthedocs.org/en/latest/ aspectlib]</ref>
* [[래킷 (프로그래밍 언어)|래킷]]<ref>{{웹 인용|url=http://planet.racket-lang.org/display.ss?package=aspectscheme.plt&owner=dutchyn|title=PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt|publisher=|accessdate=11 August 2015}}</ref>
* [[루비 (프로그래밍 언어)|루비]]<ref>{{웹 인용|url=http://aspectr-fork.sourceforge.net/|title=AspectR - Simple aspect-oriented programming in Ruby|publisher=|accessdate=11 August 2015}}</ref><ref>{{웹 인용|url=http://aquarium.rubyforge.org/|title=Home|author=Dean Wampler|publisher=|accessdate=11 August 2015|보존url=https://web.archive.org/web/20071026055811/http://aquarium.rubyforge.org/|보존날짜=2007년 10월 26일|url-status=dead}}</ref><ref>{{웹 인용|url=https://github.com/gcao/aspector|title=gcao/aspector|work=GitHub|accessdate=11 August 2015}}</ref>
* [[스퀵]] [[스몰토크]]<ref>{{웹 인용 |url=http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/AspectS/ |제목=AspectS |확인날짜=2018년 5월 5일 |보존url=https://web.archive.org/web/20060106112030/http://www.prakinf.tu-ilmenau.de/~hirsch/Projects/Squeak/AspectS/ |보존날짜=2006년 1월 6일 |url-status=dead }}</ref><ref>{{웹 인용|url=http://csl.ensm-douai.fr/MetaclassTalk|title=MetaclassTalk: Reflection and Meta-Programming in Smalltalk|publisher=|accessdate=11 August 2015|보존url=https://web.archive.org/web/20150729062351/http://csl.ensm-douai.fr/MetaclassTalk|보존날짜=2015-07-29|url-status=dead}}</ref>
* [[통합 모델링 언어|UML 2.0]]<ref>[http://www.iit.edu/~concur/weavr WEAVR]</ref>
* [[XML]]<ref>{{웹 인용|url=https://code.google.com/p/aspectxml/|title=aspectxml -      An Aspect-Oriented XML Weaving Engine (AXLE) - Google Project Hosting|publisher=|accessdate=11 August 2015}}</ref>

== 같이 보기 ==
* [[프로그래밍 패러다임]]
* [[데코레이터 패턴]]

== 각주 ==
{{각주|30em}}

{{관점 지향 소프트웨어 개발}}
{{전거 통제}}

[[분류:관점 지향 프로그래밍| ]]
[[분류:프로그래밍 패러다임]]
[[분류:관점 지향 소프트웨어 개발]]