프로덕션 소프트웨어에서 AOP(Aspect Oriented 프로그래밍)를 사용합니까?

StackOverflow https://stackoverflow.com/questions/20663

  •  09-06-2019
  •  | 
  •  

문제

AOP 제 생각에는 흥미로운 프로그래밍 패러다임입니다.그러나 여기 stackoverflow에는 아직 이에 대한 논의가 없습니다(적어도 찾을 수는 없습니다).이에 대해 일반적으로 어떻게 생각하시나요?프로젝트에서 AOP를 사용하시나요?아니면 오랫동안 존재하지 않거나 주류로 진입하지 못할 틈새 기술이라고 생각하십니까(적어도 이론적으로는 OOP가 그랬던 것처럼;))?

AOP를 사용하는 경우 어떤 도구를 사용하는지 알려주십시오.감사해요!

도움이 되었습니까?

해결책

예.

보안과 같은 직교 문제는 AOP 스타일 차단으로 가장 잘 수행됩니다.이것이 자동으로 수행되는지(종속성 주입 컨테이너와 같은 것을 통해) 수동으로 수행되는지 여부는 최종 목표에 중요하지 않습니다.

한 가지 예:"이전/이후" 속성 xUnit.net (내가 운영하는 오픈 소스 프로젝트)는 AOP 스타일 메소드 가로채기의 한 형태입니다.이러한 특성으로 테스트 메서드를 장식하고 해당 테스트 메서드가 실행되기 직전과 직후에 코드가 호출됩니다.데이터베이스 설정 및 결과 롤백, 테스트가 실행되는 보안 컨텍스트 변경 등과 같은 작업에 사용될 수 있습니다.

다른 예시:필터 속성 ASP.NET MVC 또한 특수 AOP 스타일 메서드 인터셉터처럼 작동합니다.예를 들어, 처리되지 않은 오류가 작업 메서드에서 발생하는 경우 처리되지 않은 오류를 어떻게 처리해야 하는지 말할 수 있습니다.

Castle Windsor 및 Unity를 포함한 많은 종속성 주입 컨테이너는 "기본적으로" 또는 확장 사용을 통해 이 동작을 지원합니다.

다른 팁

Python은 런타임에 클래스를 동적으로 수정할 수 있도록 하여 AOP를 지원합니다(Python에서는 일반적으로 AOP가 아닌 Monkeypatching이라고 함).다음은 내 AOP 사용 사례 중 일부입니다.

  1. 모든 페이지가 Python 함수에 의해 생성되는 웹사이트가 있습니다.수업을 듣고 해당 수업에서 생성된 모든 웹페이지를 비밀번호로 보호하고 싶습니다.AOP가 구조하러 옵니다.각 함수가 호출되기 전에 적절한 세션 확인을 수행하고 필요한 경우 리디렉션합니다.

  2. 내 프로그램이 실제로 사용되는 동안 여러 기능에 대해 로깅 및 프로파일링을 수행하고 싶습니다.AOP를 사용하면 이러한 기능을 실제로 수정하지 않고도 타이밍을 계산하고 데이터를 로그 파일에 인쇄할 수 있습니다.

  3. 스레드로부터 안전하지 않은 함수로 가득 찬 모듈이나 클래스가 있고 일부 멀티 스레드 코드에서 이를 사용하고 있습니다.일부 AOP는 라이브러리에 들어가 아무것도 변경할 필요 없이 이러한 함수 호출 주위에 잠금 기능을 추가합니다.

이런 종류의 일은 자주 발생하지 않지만, 발생할 때마다 몽키패칭은 매우 유용합니다.Python에는 데코레이터 디자인 패턴을 구현하는 데코레이터도 있습니다(http://en.wikipedia.org/wiki/Decorator_pattern) 유사한 일을 수행합니다.

클래스를 동적으로 수정하면 해당 라이브러리를 실제로 수정하지 않고도 버그를 해결하거나 타사 라이브러리에 기능을 추가할 수도 있습니다.이 작업을 수행할 필요는 거의 없지만 몇 번 발생하면 매우 유용했습니다.

AOP를 사용하지 않고 로깅, 보안, 트랜잭션 관리, 예외 처리와 같은 교차 문제를 깔끔하게 처리할 수 있는 방법을 이해할 수 없습니다.

Spring 프레임워크를 사용하는 사람(Java 기업 개발자의 약 50%)은 알고 있든 모르든 AOP를 사용하고 있습니다.

~에 테라코타 우리는 타사 소프트웨어와 통합하고 계측하기 위해 AOP 및 바이트코드 계측을 상당히 광범위하게 사용합니다.예를 들어, 우리의 스프링 통합 대부분은 다음을 사용하여 수행됩니다. 애스펙트워크즈.간단히 말해서, Spring 빈과 빈 팩토리를 클러스터링하기 위해 다양한 지점에서 호출을 가로채야 합니다.

따라서 AOP는 달리 수정할 수 없는 타사 코드와 통합하는 데 유용할 수 있습니다.그러나 우리는 큰 함정이 있다는 것을 발견했습니다. 가능하다면 조인 포인트에서 제3자 공개 API만 사용하십시오. 그렇지 않으면 다음 마이너 릴리스에서 일부 비공개 메소드 변경으로 인해 코드가 손상될 위험이 있습니다. 유지보수의 악몽.

AOP와 트랜잭션 경계는 천국에서 이루어진 일치입니다.우리는 Spring AOP @Transaction 주석을 사용하는데, 이는 다른 곳에서 본 것보다 더 쉽고 직관적인 tx 경계 설정을 가능하게 합니다.

우리는 나의 큰 프로젝트 중 하나에서 꽤 오랫동안 AspectJ를 사용했습니다.이 프로젝트는 각각 여러 기능을 갖춘 여러 웹 서비스로 구성되었으며, 이는 복잡한 문서 처리/쿼리 시스템의 프런트 엔드였습니다.약 75,000줄의 코드가 있습니다.우리는 상대적으로 작은 두 가지 기능에 측면을 사용했습니다.

첫 번째는 애플리케이션 흐름을 추적하는 것이었습니다.우리는 "입력된 '함수'"와 "종료된 '함수'"를 인쇄하기 위해 각 함수 호출 전후에 실행되는 측면을 만들었습니다.함수 선택기(포인트컷?정확한 이름이 기억나지 않습니다) 우리는 이것을 디버깅 도구로 사용하여 주어진 시간에 추적하고 싶은 함수만 선택할 수 있었습니다.이것은 우리 프로젝트의 측면에서 정말 좋은 사용이었습니다.

두 번째로 수행한 작업은 애플리케이션별 측정항목이었습니다.우리는 타이밍, 개체 정보 등을 캡처하기 위해 웹 서비스 방법에 측면을 두었습니다.그리고 결과를 데이터베이스에 덤프합니다.이 정보를 캡처할 수 있으면서도 모든 캡처 코드를 작업을 수행한 "실제" 코드와 별도로 유지할 수 있기 때문에 이는 좋았습니다.

나는 Aspect가 테이블에 가져올 수 있는 몇 가지 좋은 솔루션에 대해 읽었지만 "일반적인" 기술로는 할 수 없는(어쩌면 더 나은) 작업을 실제로 수행할 수 있다고 확신하지 않습니다.예를 들어, 우리 프로젝트에 필요한 주요 기능 중 측면 없이는 쉽게 수행할 수 없는 기능을 생각할 수 없었습니다. 유용한 측면은 제가 언급한 사소한 것입니다. .

저는 C# 애플리케이션에서 AOP를 많이 사용합니다.저는 속성을 사용하는 것을 그다지 좋아하지 않기 때문에 Castle DynamicProxy와 Boo를 사용하여 코드를 오염시키지 않고 런타임에 측면을 적용했습니다.

우리는 고객이 애플리케이션을 맞춤화할 수 있는 일관된 프레임워크를 제공하기 위해 세션 파사드에서 AOP를 사용합니다.이를 통해 각 메소드에 대해 수동 후크 지원을 추가하지 않고도 단일 사용자 정의 지점을 노출할 수 있습니다.

또한 AOP는 추가 트랜잭션 설정 및 해제와 일반적인 로깅 작업을 위한 단일 구성 지점을 제공합니다.이 모든 것을 수동으로 수행하는 것보다 훨씬 더 유지 관리가 쉽습니다.

제가 작업하는 주요 애플리케이션에는 스크립트 호스트가 포함되어 있습니다.AOP를 사용하면 호스트는 스크립트를 애플리케이션 도메인에 로드할지 여부를 결정하기 전에 스크립트의 속성을 검사할 수 있습니다.일부 스크립트는 상당히 번거롭기 때문에 런타임 시 로딩 속도가 훨씬 빨라집니다.

우리는 또한 최종 분산 애플리케이션의 일부가 될 필요가 없는 컴파일러 제어, 흐름 제어 및 IDE 내 디버깅과 같은 항목에 대해 상당한 수의 속성을 사용하고 있으며 사용할 계획입니다.

우리는 AOP 솔루션으로 PostSharp를 사용합니다.우리는 현재 사용하고 있는 캐싱, 오류 처리 및 데이터베이스 재시도 측면을 갖고 있으며 보안 검사를 측면으로 만드는 과정에 있습니다.

우리에게 잘 작동합니다.개발자들은 관심사의 분리를 정말 좋아합니다.아키텍트는 플랫폼 수준 로직을 한 위치에 통합하는 것을 정말 좋아합니다.

PostSharp 라이브러리는 코드 삽입을 수행하는 사후 컴파일러입니다.여기에는 쉽게 구현할 수 있는 사전 정의된 인터셉트 라이브러리가 있습니다.이벤트 핸들러에 연결하는 것과 같은 느낌입니다.

예, 우리는 애플리케이션 프로그래밍에 AOP를 사용합니다.나는 Spring 애플리케이션에 aop를 통합하기 위해 AspectJ를 사용하는 것을 선호합니다.동일한 것에 대한 더 넓은 전망을 얻으려면 이 기사를 살펴보십시오.

http://codemodeweb.blogspot.in/2018/03/spring-aop-and-aspectj-framework.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top