맨위로가기

관점 지향 프로그래밍

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

관점 지향 프로그래밍(AOP)은 소프트웨어 개발 패러다임의 하나로, 코드의 핵심 기능 외에 로깅, 보안 등 횡단 관심사를 분리하여 관리하는 방식이다. AOP는 코드의 가독성과 유지보수성을 높이기 위해 횡단 관심사를 '관점'이라는 독립적인 모듈로 표현하며, 어드바이스와 포인트컷을 사용하여 코드에 적용된다. 다양한 프로그래밍 언어에서 AOP를 지원하며, AspectJ, 스프링 프레임워크 등이 널리 사용된다. 그러나 코드의 제어 흐름을 모호하게 만들 수 있다는 비판도 존재한다.

더 읽어볼만한 페이지

  • 관점 지향 소프트웨어 개발 - AspectJ
    AspectJ는 자바 언어의 관점 지향 프로그래밍 확장이자, 확장 메서드, 포인트컷, 어드바이스 등의 기능을 통해 기존 코드 변경 없이 새로운 기능을 추가할 수 있도록 설계되었다.
  • 관점 지향 소프트웨어 개발 - 횡단 관심사
    횡단 관심사는 소프트웨어 시스템 전반에 걸쳐 나타나 시스템 의존성을 높이는 기능이나 속성을 의미하며, 관점 지향 프로그래밍은 이를 해결하기 위해 관심사를 모듈화하는 프로그래밍 방식이다.
  • 관점 지향 프로그래밍 - Nemerle
    Nemerle은 객체 지향 및 함수형 프로그래밍 스타일을 혼합하여 사용할 수 있는 프로그래밍 언어이며, 강력한 형식 추론, 메타프로그래밍 시스템, 다양한 프로그래밍 스타일 지원, .NET 플랫폼 라이브러리 접근 용이성 등의 특징을 갖는다.
  • 관점 지향 프로그래밍 - DTrace
    DTrace는 시스템과 애플리케이션의 실시간 동작 추적 및 분석을 위한 동적 트레이싱 프레임워크로, 'D' 언어를 사용하여 작성된 스크립트를 통해 다양한 시스템 이벤트 계측 및 분석을 지원하며 여러 운영체제에 적용되어 시스템 분석 및 문제 해결에 기여한다.
  • 프로그래밍 패러다임 - 지식 표현
    지식 표현은 컴퓨터가 인간의 지식을 이해하고 활용하도록 정보를 구조화하는 기술이며, 표현력과 추론 효율성의 균형, 불확실성 처리 등을 핵심 과제로 다양한 기법과 의미 웹 기술을 활용한다.
  • 프로그래밍 패러다임 - 의도적 프로그래밍
    의도적 프로그래밍은 프로그래머의 의도를 명확히 포착하고 활용하여 소프트웨어 개발 생산성을 향상시키기 위한 프로그래밍 패러다임으로, 트리 기반 저장소를 사용해 코드 의미 구조를 보존하고, WYSIWYG 환경에서 도메인 전문가와 협업하며, 코드 상세 수준 조절 및 자동 문서화를 통해 가독성과 유지보수성을 높이는 데 중점을 둔다.
관점 지향 프로그래밍
개요
이름관점 지향 프로그래밍
영어 명칭Aspect-Oriented Programming (AOP)
분류프로그래밍 패러다임
특징관심사의 분리, 모듈성 향상
개념
핵심 개념횡단적 관심사, 관점 (AOP), 어드바이스, 포인트컷, 위빙
횡단적 관심사여러 모듈에 걸쳐 나타나는 공통 기능 (로깅, 보안 등)
관점 (어스펙트)횡단적 관심사를 모듈화한 단위
어드바이스특정 시점에 실행되는 코드 (예: 메서드 호출 전/후)
포인트컷어드바이스가 적용될 위치 지정
위빙관점을 핵심 로직에 적용하는 과정
목적
주요 목적코드의 모듈성 및 유지보수성 향상, 횡단적 관심사의 중앙 집중 관리
장점코드 중복 감소, 관심사 분리, 유지보수 용이성 증가
단점복잡성 증가, 디버깅 어려움, 학습 곡선 존재
구현
주요 구현체AspectJ
Spring AOP
PostSharp
활용 분야
주요 활용 분야로깅, 보안, 트랜잭션 관리, 예외 처리
관련 기술
관련 기술메타프로그래밍
반사 (컴퓨터 과학)
디자인 패턴
서브젝트 지향 프로그래밍
설명서브젝트 지향 프로그래밍은 관점 지향 프로그래밍과 유사하게 시스템을 여러 관점에서 모듈화하는 것을 목표로 하는 프로그래밍 패러다임임.

2. 역사

관점 지향 프로그래밍(AOP)은 1990년대 후반 제록스 PARC의 그레고어 키잘레스(Gregor Kiczales) 연구팀이 주도하여 개발되었다. 이들은 자바 기반의 AspectJ를 개발하여 AOP 개념을 구체화하였다. IBM 연구팀도 Hyper/J와 관심 조작 환경(Concern Manipulation Environment)을 제안했으나 널리 사용되지는 않았다. AOP의 초기 주요 응용 사례로는 마이크로소프트 트랜잭션 서버와 엔터프라이즈 자바빈즈(Enterprise JavaBeans)가 있다.[1][2][3][4]

2. 1. AOP의 선행 기술

AOP는 반영, 메타오브젝트 프로토콜, 주체 지향 프로그래밍, 컴포지션 필터(Composition Filters), 적응형 프로그래밍(Adaptive Programming)과 같은 기술들에 기반을 두고 있다.[53][54]

제록스 PARC의 그레고어 키잘레스와 동료들은 AOP의 개념을 명시적으로 개발하고, 자바AspectJ AOP 확장 기능을 도입하였다. IBM 연구팀은 언어 설계 접근 방식 대신 도구 접근 방식을 채택하여 2001년에 Hyper/J와 관심 조작 환경(Concern Manipulation Environment)을 제안하였으나 널리 사용되지는 않았다.

마이크로소프트 트랜잭션 서버는 최초의 주요 AOP 애플리케이션으로 간주되며, 이후 엔터프라이즈 자바빈즈가 이를 계승하였다.[55][56]

3. 동기 및 기본 개념

일반적으로 애스펙트(aspect)는 코드로서 분산되거나 얽혀있어 이해하고 유지보수하기 어렵다. 로깅과 같이 서로 관련 없는 여러 함수들에 기능이 분산될 경우, 로깅을 변경하려면 영향을 받는 모든 모듈을 수정해야 할 수 있다. 애스펙트는 시스템의 핵심 기능뿐만 아니라 서로에게도 얽혀있어, 하나의 관심사를 변경하려면 얽힌 모든 관심사를 이해해야 한다.[5]

AOP는 이러한 문제를 해결하기 위해 횡단 관심사를 '관점(Aspect)'이라는 독립적인 모듈로 표현한다. 관점은 '어드바이스(Advice)'와 '포인트컷(Pointcut)'을 포함한다. 어드바이스는 프로그램 내의 특정 지점과 결합되는 코드이고, 포인트컷은 어드바이스가 적용될 지점을 정의한다. 이러한 방식을 통해 횡단 관심사를 한 곳에서 유지보수할 수 있으며, 프로그램 변경에도 유연하게 대처할 수 있다. AOP를 디버깅 도구나 사용자 수준의 도구로 생각하는 사람도 있다. 어드바이스는 함수 변경을 할 수 없는 경우(사용자 레벨)[6], 또는 운영 모드(디버깅)에서 함수를 변경하고 싶지 않을 때를 대비하여 예비해 두는 것이 좋다.

AOP에서 사용되는 표준 용어는 다음과 같다.


  • 횡단 관심사: 객체 지향 모델에서 대부분의 클래스는 단일 기능을 수행하지만, 여러 클래스에서 공통적으로 요구되는 부가 기능이 있다. 예를 들어, 접근 통제[8] 또는 정보 흐름 통제와 같은 보안 관련 관심사도 있을 수 있다.[9]
  • 어드바이스: 기존 모델에 적용하려는 추가 코드이다.
  • 포인트컷: 횡단 관심사를 적용해야 하는 애플리케이션 내 실행 지점이다.
  • 관점: 포인트컷과 어드바이스의 조합을 관점이라고 한다.

3. 1. 횡단 관심사의 예시 (은행 애플리케이션)

은행 애플리케이션에서 계좌 이체 기능을 예로 들어 횡단 관심사를 설명할 수 있다.

기본적인 계좌 이체 기능은 다음과 같다.[57]



void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {

if (fromAcc.getBalance() < amount)

throw new InsufficientFundsException();

fromAcc.withdraw(amount);

toAcc.deposit(amount);

}



그러나 실제 애플리케이션에서는 보안, 트랜잭션, 로깅 등 다양한 횡단 관심사를 고려해야 한다.

  • 보안: 현재 사용자가 이체 작업을 수행할 권한이 있는지 확인해야 한다.
  • 트랜잭션: 데이터 손실을 방지하기 위해 데이터베이스 트랜잭션으로 작업을 묶어야 한다.
  • 로깅: 시스템 진단을 위해 작업 내용을 로그에 기록해야 한다.


이러한 횡단 관심사를 모두 적용하면 코드는 다음과 같이 복잡해진다.



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.");

}



위 코드에서 트랜잭션, 보안, 로깅과 같은 횡단 관심사들이 핵심 기능(계좌 이체)과 얽혀있어 코드의 가독성과 유지보수성이 떨어진다. 예를 들어 보안 관련 기능을 변경하려면 여러 메서드를 수정해야 하는 문제가 발생한다.

AOP를 사용하면 이러한 횡단 관심사를 애스펙트(aspect)라는 별도의 모듈로 분리하여 관리할 수 있다. 애스펙트는 어드바이스(advice)와 포인트컷(pointcut)을 포함한다. 어드바이스는 특정 시점에 실행되는 코드이고, 포인트컷은 어드바이스가 실행될 지점을 정의한다.

다음은 로깅 애스펙트의 예시이다.



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.

}



이처럼 AOP를 활용하면 각 횡단 관심사를 별도의 모듈로 관리하여 코드의 가독성과 유지보수성을 향상시킬 수 있다.[58]

4. 조인 포인트 모델(Join Point Model)

관점 지향 언어에서 어드바이스 관련 구성 요소는 조인 포인트 모델(JPM)을 정의한다. JPM은 다음 세 가지를 정의한다.[58]

# 어드바이스가 실행될 수 있는 시점. 이들은 실행 중인 프로그램에서 추가적인 동작을 유용하게 결합할 수 있는 지점이기 때문에 '''조인 포인트'''라고 불린다. 조인 포인트는 유용하기 위해서는 일반 프로그래머가 주소를 지정하고 이해할 수 있어야 한다. 또한, 관점의 안정성을 유지하기 위해 중요하지 않은 프로그램 변경에도 안정적이어야 한다. 많은 AOP 구현은 조인 포인트로 메서드 실행 및 필드 참조를 지원한다.

# '''포인트컷'''이라고 하는 조인 포인트를 지정(또는 ''정량화'')하는 방법. 포인트컷은 주어진 조인 포인트가 일치하는지 여부를 결정한다. 가장 유용한 포인트컷 언어는 기본 언어와 유사한 구문(예: AspectJ는 Java 시그니처를 사용)을 사용하며 이름 지정 및 조합을 통해 재사용을 허용한다.

# 조인 포인트에서 실행할 코드를 지정하는 수단. AspectJ는 이를 '''어드바이스'''라고 부르며, 조인 포인트 전, 후, 주변에서 실행할 수 있다. 일부 구현은 다른 클래스에 대한 관점에서 메서드를 정의하는 것도 지원한다.

조인 포인트 모델은 노출된 조인 포인트, 조인 포인트 지정 방법, 조인 포인트에서 허용되는 연산, 그리고 표현할 수 있는 구조적 개선 사항을 기반으로 비교할 수 있다.

4. 1. AspectJ의 조인 포인트 모델

AspectJ는 가장 널리 사용되는 AOP 언어 중 하나이며, 구체적인 JPM(Join Point Model) 예시를 제공한다. AspectJ의 조인 포인트는 메서드 실행, 생성자 호출, 필드 접근, 예외 처리를 포함한다.[58]

포인트컷은 AspectJ의 표현식을 사용하여 정의하며, 와일드카드(*)를 사용하여 여러 조인 포인트를 한 번에 지정할 수 있다. AspectJ에서 포인트컷은 '기본 포인트컷 지정자'(PCD)의 조합으로 지정된다.

  • "종류별" PCD: 특정 종류의 조인 포인트(예: 메서드 실행)와 일치하며 Java와 유사한 시그니처를 입력으로 사용한다.
  • 예시: `execution(* set*(*))` - 메서드 이름이 "set"으로 시작하고 모든 유형의 인수가 정확히 하나인 경우 메서드 실행 조인 포인트와 일치한다.

  • "동적" PCD: 런타임 유형을 확인하고 변수를 바인딩한다.
  • 예시: `this(Point)` - 현재 실행 중인 객체가 `Point` 클래스의 인스턴스인 경우 일치한다. 클래스의 정규화되지 않은 이름은 Java의 일반적인 유형 조회를 통해 사용할 수 있다.

  • "범위" PCD: 조인 포인트의 어휘 범위를 제한한다.
  • 예시: `within(com.company.*)` - `com.company` 패키지의 모든 유형에서 모든 조인 포인트와 일치한다. `*`는 하나의 시그니처로 많은 항목을 일치시키는 데 사용할 수 있는 와일드카드의 한 형태이다.


포인트컷은 재사용을 위해 구성하고 이름을 지정할 수 있다.

```aspectj

pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);

```

이 포인트컷은 메서드 이름이 "set"으로 시작하고 `this`가 `com.company` 패키지의 유형 `Point`의 인스턴스인 경우 메서드 실행 조인 포인트와 일치한다. "set()"이라는 이름을 사용하여 참조할 수 있다.

5. 구현

AOP 프로그램은 기본 언어 및 환경에 따라 두 가지 방식으로 다른 프로그램에 영향을 미칠 수 있다.

1. 결합된 프로그램이 생성되며, 이는 원래 언어에서 유효하고 최종 인터프리터에게는 일반 프로그램과 구별할 수 없다.

2. 최종 인터프리터 또는 환경이 AOP 기능을 이해하고 구현하도록 업데이트된다.

환경을 변경하는 어려움 때문에 대부분의 구현은 프로그램 변환의 일종인 ''위빙(weaving)''을 통해 호환 가능한 결합 프로그램을 생성한다. 애스펙트 위버는 관점 지향 코드를 읽고 애스펙트가 통합된 적절한 객체 지향 코드를 생성한다. 동일한 AOP 언어는 다양한 위빙 방식을 통해 구현될 수 있으므로 언어의 의미는 위빙 구현 측면에서 이해해서는 안 된다. 사용된 결합 방식에 따라 구현 속도와 배포 용이성만 영향을 받는다.

시스템은 프로그램 소스 파일에 접근해야 하는 CFront에서 C++가 원래 구현된 것처럼, 전처리기를 사용하여 소스 레벨 위빙을 구현할 수 있다. 하지만 Java의 잘 정의된 바이너리 형식은 바이트코드 위버가 .class-file 형식의 모든 Java 프로그램에서 작동하도록 한다. 바이트코드 위버는 빌드 프로세스 중에 배포하거나, 위빙 모델이 클래스별인 경우 클래스 로딩 중에 배포할 수 있다. AspectJ는 2001년에 소스 레벨 위빙으로 시작하여 2002년에 클래스별 바이트코드 위버를 제공했으며, 2005년에 AspectWerkz를 통합한 후 고급 로드타임 지원을 제공했다.

런타임에 프로그램을 결합하는 모든 솔루션은 프로그래머의 분리된 모델을 유지하기 위해 프로그램을 적절하게 분리하는 뷰를 제공해야 한다. Java의 여러 소스 파일에 대한 바이트코드 지원은 모든 디버거가 소스 편집기에서 적절하게 위빙된 .class 파일을 단계별로 실행할 수 있도록 한다. 그러나 일부 타사 디컴파일러는 Javac이 지원하는 모든 바이트코드 형식이 아닌, Javac으로 생성된 코드를 예상하기 때문에 위빙된 코드를 처리할 수 없다( § 비판 참조).

배포 시점 위빙은 또 다른 접근 방식을 제공한다.[7] 이는 기본적으로 후처리를 의미하지만, 생성된 코드를 패치하는 대신, 이 위빙 방식은 기존 클래스를 ''서브클래싱(subclassing)''하여 메서드 오버라이딩으로 수정 사항을 도입한다. 기존 클래스는 런타임에도 변경되지 않으며, 디버거 및 프로파일러와 같은 모든 기존 도구를 개발 중에 사용할 수 있다. 유사한 접근 방식은 이미 IBM의 WebSphere와 같은 많은 Java EE 애플리케이션 서버의 구현에서 그 효과가 입증되었다.

6. AOP 구현체

AOP는 다양한 프로그래밍 언어 및 프레임워크에서 지원된다.[53] 반영, 메타오브젝트 프로토콜, 주체 지향 프로그래밍, 컴포지션 필터(Composition Filters), 적응형 프로그래밍(Adaptive Programming)과 같은 기술들이 AOP의 기반이 된다.[54]

제록스 PARC의 그레고어 키잘레스(Gregor Kiczales)와 동료들은 AOP의 개념을 명확히 하고 AspectJ를 통해 자바에 AOP를 도입했다. IBM 연구팀은 Hyper/J와 관심 조작 환경(Concern Manipulation Environment)을 제안했지만 널리 사용되지는 않았다.

마이크로소프트 트랜잭션 서버가 초창기 AOP 애플리케이션 중 하나로 여겨진다.[55][56]

6. 1. 주요 AOP 언어

다음은 자체적으로 또는 외부 라이브러리를 통해 AOP를 구현하는 프로그래밍 언어들이다:[74]

} (IEEE 1647) ||

|}

6. 2. 주요 AOP 프레임워크

다음은 여러 프로그래밍 언어에서 사용되는 주요 AOP 프레임워크들이다.

스프링 프레임워크는 한국에서 가장 널리 사용되는 AOP 프레임워크 중 하나이다.

7. 비판

AOP의 강력함은 논리적 실수가 광범위한 프로그램 오류로 이어질 수 있다는 위험성을 내포한다. 다른 프로그래머가 aspect 작성자의 의도와 다르게 프로그램의 조인 포인트를 변경하면 예상치 못한 결과를 초래할 수도 있다.[11]

AOP의 가장 기본적인 비판은 제어 흐름을 모호하게 만든다는 것이다. 이는 비판을 많이 받는 GOTO문보다 더 나쁘며, 농담으로 언급되는 COME FROM문과 유사하다는 지적도 있다.[11] AOP에서는 어드바이스가 명시적으로 보이지 않기 때문에, 코드만 보고서는 어드바이스의 적용 여부를 파악하기 어렵다.[11][12]

포인트컷은 런타임 조건에 따라 달라질 수 있어 정적으로 결정하기 어렵다. 이는 정적 분석이나 IDE 지원을 통해 어느 정도 완화할 수 있지만, 완전히 해결하기는 어렵다.

AOP는 "모듈성과 코드 구조를 모두 개선"하는 것을 목표로 하지만, 오히려 이러한 목표를 훼손하고 "프로그램의 독립적인 개발과 이해 가능성"을 방해한다는 주장도 있다.[13] 특히, 포인트컷에 의한 정량화는 모듈성을 깨뜨린다는 비판이 있다. "일반적으로, 관점 지향 프로그램의 동적 실행에 대해 추론하려면 전체 프로그램에 대한 지식이 있어야 한다."[14]

기술적인 비판으로는 포인트컷의 정량화(어드바이스 실행 위치 정의)가 "프로그램 변경에 극도로 민감"하다는 점, 즉 ''깨지기 쉬운 포인트컷 문제''가 있다.[13]

참조

[1] 간행물 Aspect-oriented programming http://www.cs.ubc.ca[...]
[2] 서적 Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns
[3] 서적 Essential.NET: The common language runtime https://archive.org/[...] Addison-Wesley Professional 2011-10-04
[4] 서적 Mastering Enterprise JavaBeans https://books.google[...] John Wiley and Sons 2011-10-04
[5] 문서 Note: The examples in this article appear in a syntax that resembles that of the Java (programming language)|Java language.
[6] 웹사이트 gnu.org https://www.gnu.org/[...] GNU Project 2018-05-05
[7] 웹사이트 Archived copy http://www.forum2.or[...] 2005-06-19
[8] 문서 Security through aspect-oriented programming Advances in Network and Distributed Systems Security
[9] 문서 FlowR: Aspect Oriented Programming for Information Flow Control in Ruby ACM Proceedings of the 13th international conference on Modularity (Aspect Oriented Software Development)
[10] 웹사이트 Notes on Structured Programming http://www.cs.utexas[...] 2006-10-12
[11] 간행물 AOP Considered Harmful http://pp.info.uni-k[...] 2018-05-05
[12] 문서 C2:ComeFrom
[13] 간행물 The paradoxical success of aspect-oriented programming
[14] 웹사이트 More Modular Reasoning for Aspect-Oriented Programs http://www.eecs.ucf.[...] 2015-08-11
[15] 웹사이트 AOP and the Antinomy of the Liar http://www.fernuni-h[...] 2018-05-05
[16] 웹사이트 Numerous
[17] 웹사이트 Welcome to as3-commons-bytecode http://www.as3common[...] 2018-05-05
[18] 웹사이트 Ada2012 Rationale http://www.adacore.c[...] 2018-05-05
[19] 웹사이트 Function Hooks http://www.autohotke[...] 2018-05-05
[20] 웹사이트 Several
[21] 웹사이트 Cobble http://homepages.vub[...] 2018-05-05
[22] 웹사이트 AspectCocoa http://www.ood.neu.e[...] 2018-05-05
[23] 웹사이트 ColdSpring Framework: Welcome http://coldspringfra[...] 2018-05-05
[24] 웹사이트 Closer Project: AspectL. http://common-lisp.n[...] 2015-08-11
[25] 웹사이트 infra – Frameworks Integrados para Delphi – Google Project Hosting https://code.google.[...] 2015-08-11
[26] 웹사이트 meaop – MeSDK: MeObjects, MeRTTI, MeAOP – Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... – Google Project Hosting https://code.google.[...] 2015-08-11
[27] 웹사이트 Google Project Hosting https://code.google.[...] 2015-08-11
[28] 웹사이트 RemObjects Cirrus http://prismwiki.cod[...] 2018-05-05
[29] 웹사이트 Emacs Advice Functions https://www.gnu.org/[...] GNU Project 2018-05-05
[30] 간행물 Monads As a theoretical basis for AOP
[31] 웹사이트 Numerous others
[32] 웹사이트 Many
[33] 문서 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).
[34] 웹사이트 AspectLua http://luaforge.net/[...] 2015-08-11
[35] 웹사이트 MAKAO, re(verse)-engineering build systems http://www.bramadams[...] 2015-08-11
[36] 웹사이트 McLab http://www.sable.mcg[...] 2015-08-11
[37] 웹사이트 AspectML – Aspect-oriented Functional Programming Language Research http://www.cs.prince[...] 2015-08-11
[38] 웹사이트 nemerle/README.md at master · rsdn/nemerle https://github.com/r[...] 2018-03-22
[39] 웹사이트 Aspect – Aspect-Oriented Programming (AOP) for Perl – metacpan.org https://metacpan.org[...] 2015-08-11
[40] 웹사이트 PHP-AOP (AOP.io) http://aop.io
[41] 웹사이트 Aspect-Oriented Programming in Prolog http://www.bigzaphod[...] 2018-05-05
[42] 웹사이트 PEAK http://peak.telecomm[...]
[43] 웹사이트 PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt http://planet.racket[...] 2015-08-11
[44] 웹사이트 AspectR – Simple aspect-oriented programming in Ruby http://aspectr-fork.[...] 2015-08-11
[45] 웹사이트 Home http://aquarium.ruby[...] 2015-08-11
[46] 웹사이트 gcao/aspector https://github.com/g[...] 2015-08-11
[47] 웹사이트 AspectS http://www.prakinf.t[...] 2018-05-05
[48] 웹사이트 MetaclassTalk: Reflection and Meta-Programming in Smalltalk http://csl.ensm-doua[...] 2015-08-11
[49] 웹사이트 WEAVR http://www.iit.edu/~[...] 2018-05-05
[50] 웹사이트 aspectxml – An Aspect-Oriented XML Weaving Engine (AXLE) – Google Project Hosting https://code.google.[...] 2015-08-11
[51] 웹사이트 まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い) https://xtech.nikkei[...] 日経クロステック 2020-12-18
[52] 문서
[53] 콘퍼런스 인용 Aspect-oriented programming http://www.cs.ubc.ca[...]
[54] 문서
[55] 서적 Essential.NET: The common language runtime https://books.google[...] Addison-Wesley Professional 2002-11-04
[56] 서적 Mastering Enterprise JavaBeans https://books.google[...] John Wiley and Sons 2005-01-01
[57] 문서
[58] 문서 Emacs documentation https://www.gnu.org/[...]
[59] 문서
[60] 웹인용 as3-commons-bytecode http://www.as3common[...] 2017-07-22
[61] 문서 Ada2012 Rationale http://www.adacore.c[...]
[62] 문서
[63] 문서
[64] 문서
[65] 웹인용 AspectCocoa http://www.ood.neu.e[...] 2018-05-05
[66] 문서
[67] 웹인용 Closer Project: AspectL. http://common-lisp.n[...] 2015-08-11
[68] 웹인용 infra - Frameworks Integrados para Delphi - Google Project Hosting https://code.google.[...] 2015-08-11
[69] 웹인용 meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting https://code.google.[...] 2015-08-11
[70] 웹인용 Google Project Hosting https://code.google.[...] 2015-08-11
[71] 웹인용 RemObjects Cirrus http://prismwiki.cod[...] 2018-05-05
[72] 웹사이트 Emacs Advice Functions https://www.gnu.org/[...]
[73] 저널 Monads As a theoretical basis for AOP http://portal.acm.or[...]
[74] 웹사이트 CaesarJ http://www.caesarj.o[...]
[75] 웹사이트 Advisable http://i.gotfresh.in[...]
[76] 문서
[77] 웹인용 AspectLua http://luaforge.net/[...] 2015-08-11
[78] 웹인용 MAKAO, re(verse)-engineering build systems http://www.bramadams[...] 2015-08-11
[79] 웹인용 McLab http://www.sable.mcg[...] 2015-08-11
[80] 웹인용 AspectML - Aspect-oriented Functional Programming Language Research http://www.cs.prince[...] 2015-08-11
[81] 웹인용 Aspect - Aspect-Oriented Programming (AOP) for Perl - metacpan.org https://metacpan.org[...] 2015-08-11
[82] 웹사이트 PHP-AOP (AOP.io) http://aop.io/
[83] 웹인용 "Whirl" http://www.bigzaphod[...] 2017-07-22
[84] 웹사이트 PEAK http://peak.telecomm[...]
[85] 웹인용 PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt http://planet.racket[...] 2015-08-11
[86] 웹인용 AspectR - Simple aspect-oriented programming in Ruby http://aspectr-fork.[...] 2015-08-11
[87] 웹인용 Home http://aquarium.ruby[...] 2015-08-11
[88] 웹인용 gcao/aspector https://github.com/g[...] 2015-08-11
[89] 웹인용 AspectS http://www.prakinf.t[...] 2018-05-05
[90] 웹인용 MetaclassTalk: Reflection and Meta-Programming in Smalltalk http://csl.ensm-doua[...] 2015-08-11
[91] 웹사이트 WEAVR http://www.iit.edu/~[...]
[92] 웹인용 aspectxml - An Aspect-Oriented XML Weaving Engine (AXLE) - Google Project Hosting https://code.google.[...] 2015-08-11



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com

언어구현
자바AspectJ
C, C++AspectC++
루비AspectR
{{lang|en|e (verification language)|e|}