deblog

[Spring] AspectJ란? 본문

IT/JAVA

[Spring] AspectJ란?

스콘_ 2021. 11. 24. 10:59
반응형

AspectJ는 PARC에서 개발한 자바 프로그래밍 언어용 관점 지향 프로그래밍 (AOP) 확장 기능입니다.

 

AspectJ이 생기게 된 이유

전통적인 프로그래밍 방법론으로는 잘 포착되지 않는 문제나 우려가 있다는 것을 깨달았기 때문입니다.

응용 프로그램에서 보안 문제가 있었습니다. 본질적으로, 보안은 애플리케이션의 모듈화의 많은 단위들에 영향을 끼치고 있습니다. 또한 보안은 애플리케이션이 진화함에 따라 모든 추가에 균일하게 적용되어야 합니다. 그리고 적용되는 보안이 바뀌거나 발전할 수 있습니다. 보안 정책과 같은 우려를 규율화된 방식으로 포착하는 것은 전통적인 프로그래밍 언어에서는 어렵고 오류가 발생하기 쉽습니다.

 

보안과 같은 우려는 모듈화의 자연스러운 단위를 가로막습니다. 객체 지향 프로그래밍 언어에서 모듈화의 자연스러운 단위는 클래스입니다. 그러나 객체 지향 프로그래밍 언어에서 횡단 관심사는 클래스로 쉽게 전환되지 않습니다. 왜냐하면 클래스는 클래스로 나누어지기 때문입니다. 재사용할 수도 없고, 정제하거나 상속할 수도 없고, 원칙이 없는 방식으로 프로그램 전체에 퍼져 있습니다. 간단히 말해서, 함께 작업하기 어렵습니다.

관점 지향 프로그래밍은 객체 지향 프로그래밍이 공통 관심사를 모듈화하는 방법인 것처럼 크로스 컷팅 관심사를 모듈화하는 방법이다. AspectJ는 자바를 위한 관점 지향 프로그래밍의 구현체입니다.

 

Pointcuts

AspectJ에서 포인트 컷은 프로그램 흐름의 특정 지점을 선택합니다.

call(void Point.setX(int))

 

void Point.setX(int)를 갖는 메서드, 즉 단일 int 매개 변수를 갖는 Point의 void setX 메서드를 호출하는 각 join point를선택합니다.

call(void Point.setX(int)) ||
call(void Point.setY(int))

 

setX에 대한 호출 또는 setY에 대한 호출인 각 조인 포인트를 선택합니다.
Pointcuts은 다양한 유형의 결합점을 식별할 수 있습니다.

call(void FigureElement.setXY(int,int)) ||
call(void Point.setX(int))              ||
call(void Point.setY(int))              ||
call(void Line.setP1(Point))            ||
call(void Line.setP2(Point));

 

 

다섯 가지 방법 중 하나에 대한 호출인 각 조인 포인트를 선택합니다(그 중 첫 번째 방법은 인터페이스 방법입니다.)

아래 예제에서 이 Pointcuts은 요소가 이동할 때 모든 결합지점을 잡을 수 있습니다.

이 방법은 이러한 횡단 관심사를 지정하는 데 유용한 방법이지만, 너무 접근하기 쉽습니다 .

그래서 AspectJ는 프로그래머들이 Pointcuts 형태로 자신의 명명된 Pointcuts을 정의할 수 있게 해줍니다.

다음은 새로운 명명된 포인트컷을 선언합니다.

pointcut move():
    call(void FigureElement.setXY(int,int)) ||
    call(void Point.setX(int))              ||
    call(void Point.setY(int))              ||
    call(void Line.setP1(Point))            ||
    call(void Line.setP2(Point));

 

이 정의가 보일 때마다 프로그래머는 이 복잡한 Pointcuts을 잡기 위해 move()를 사용할 수 있습니다.

call(void Figure.make*(..))

 

메서드의 매개변수에 관계없이 이름이 "make"로 시작하는 그림에서 정의된 공백 메서드에 대한 호출인 각 조인 포인트를 선택합니다.

factory 메소드 makePoint와 makeLine에 대한 호출을 선택합니다.

call(public * Figure.* (..))

Figure의 public 메서드에 대한 각 호출을 선택합니다.

 

 

위 방법이 AspectJ가 지원하는 유일한 속성은 아닙니다. 또 다른 포인트 컷인 cflow는 결합점이 다른 결합점의 동적 컨텍스트에서 발생하는지 여부에 따라 결합점을 식별합니다. 

cflow(move())

위에서 정의한 명명된 포인트 컷을 이동으로 선택한 조인 포인트의 동적 컨텍스트에서 발생하는 각 조인 포인트를 선택합니다.

따라서 이동 메서드가 호출되는 시점과 반환되는 시점 사이에 발생하는 각 조인 지점을 선택합니다(일반적으로 또는 예외를 발생).

 

 

[출처 : https://web.archive.org/web/20170810042238/http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html]

Comments