저자는 AOP를 기존의 관점지향프로그래밍이라기 보단 상황중심프로그래밍으로 해석하고 있다. AOP에서 사용하는 개념은 크게 4가지가 있다. 점점(pointcut), 안내(advice), 내부타입선언(inter type declaration), 그리고 이들을 모두 묶어서 하나의 단위로 추상화하는 상황(aspect)가 있다.
[HellowWorld.java] [HiWorld.java]
[Test.java]
접점(pointcut)은 공통의 관심사가 여러 개의 객체나 계층을 가로지를 때 그들과 만나게 되는 지점을 의미한다.
접점을 골라낸 후 할일을 정의하는 것이 안내(advice)이다. 객체지향의 메소드라고 생각하면 된다. 접점 전후로 해야 할일을 정의하는 알고리즘이 주 내용을 이룬다. 내부타입정의(inter type declaration)는 OOP와 달리 객체에 새로운 필드를 동적으로 더하는 것을 가능하게 만든다. 마지막으로, OOP에서 클래스가 변수와 메소드를 한곳에 묶어서 하나의 객체로 추상화하듯, AOP에서 사용되는 접점, 안내, 내부타입정의를 한 곳에 묶어서 추상화한 것을 상황(aspect)라고 한다.
저자는 AOP는 OOP를 대체할만한 방법론은 아닌 단지 '보완적' 방법론으로 보고 있다.
이클립스를 통한 예제 구현
먼저 AspectJ 플러그인이 설치 되어있지 않으면 설치합니다. Eclipse -> help -> Software Update - find and install 주소는 아래와 같습니다. (그리고 eclipse 버전별로 설치주소 차이가 있습니다. )
이클립스 3.2버전경우 : http://download.eclipse.org/tools/ajdt/32/update
3.3버전경우 : http://download.eclipse.org/tools/ajdt/33/update
3.4버전경우 : http://download.eclipse.org/tools/ajdt/34/update
3.3버전경우 : http://download.eclipse.org/tools/ajdt/33/update
3.4버전경우 : http://download.eclipse.org/tools/ajdt/34/update
* 자세한 사항은 다운로드 페이지를 참조하세요 http://www.eclipse.org/ajdt/downloads/
제경우엔 eclipse_gany3.4, AJDT1.6 으로 테스트 했습니다. 프로젝트는 AspectJ prj로 생성해야하며, GreetingAspect.aj 는 aj 클래스로 만들어야 합니다.
[GreetingAspect.aj]
public aspect GreetingAspect {
pointcut callSayMessage() : call(public static void say*(..));
before():callSayMessage() {
System.out.println("Good bye");
}
after():callSayMessage() {
System.out.println("Thank you!");
}
}
public class HelloWorld {
public static void say(String msg) {
System.out.println(msg);
}
public static void sayToPerson(String msg, String name) {
System.out.println(name + ", " + msg);
}
}
public class HiWorld {
public static void sayToYou(String msg) {
System.out.println(msg);
}
public static void sayToAnimal(String msg, String name){
System.out.println(name + ", " + msg);
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloWorld.say("Let's learn AOP");
HelloWorld.sayToPerson("Let's learn AOP", "Andrew");
HiWorld.sayToYou("Let's learn everything!");
HiWorld.sayToAnimal("Let's learn how to bark", "yoki");
}
}