저자는 AOP를 기존의 관점지향프로그래밍이라기 보단 상황중심프로그래밍으로 해석하고 있다. AOP에서 사용하는 개념은 크게 4가지가 있다. 점점(pointcut), 안내(advice), 내부타입선언(inter type declaration), 그리고 이들을 모두 묶어서 하나의 단위로 추상화하는 상황(aspect)가 있다. 

접점(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
* 자세한 사항은 다운로드 페이지를 참조하세요 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!");
}
}
[HellowWorld.java] [HiWorld.java]
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);
}
}


[Test.java]
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");
}
}

Posted by 빈솔B
,