AOP with Jbuilder

Download Report

Transcript AOP with Jbuilder

AOP
(Aspect Oriented Programming)
김병진
[email protected]
2009.07.08
AOP의 필요성과 AOP의 개념
기존 프로그래밍 패러다임

절차 지향 프로그래밍
 알골,

포트란, PL/1, 에이다, C, 베이직…
객체 지향 프로그래밍
 자바,
C++, C#, 루비…
객체 지향 프로그래밍의 문제점

구조적인 측면
계좌이체
로깅
보안
트랜젝션
입출금
이자계산
객체 지향 프로그래밍의 문제점

소스적인 측면
public class Board
{
public Bulletin read(User usr, int bulletinIndex) throws AuthenticationException
{
// 사용자가 어떤 게시물을 요청했는지 로그 파일에 남긴다.
// 사용자가 게시물을 읽기에 적절한 권한을 갖고 있는지 판단한다.
// 게시판으로부터 게시물을 읽는다.
// 사용자가 어떤 게시물을 읽었는지 로그 파일에 남긴다.
// 읽어놓은 게시물을 반환한다.
}
public void write(User usr, Bulletin newBulletin) throws AuthenticationException
{
// 사용자가 새로운 게시물을 쓰려 했음을 로그 파일에 남긴다.
// 사용자가 게시물을 쓰기에 적절한 권한을 갖고 있는지 판단한다.
// 게시판에 새로운 게시물을 써넣는다.
// 사용자가 새로운 게시물을 썼음을 로그 파일에 남긴다.
}
public void delete(User usr, int bulletinIndex) throws AuthenticationException
{
// 사용자가 어떤 게시물을 지우려 했는지 로그 파일에 남긴다.
// 사용자가 게시물을 지우기에 적절한 권한을 갖고 있는지 판단한다.
// 게시판에 있는 게시물을 지운다.
// 사용자가 게시물을 지웠음을 로그 파일에 남긴다.
}
}
객체 지향 프로그래밍의 문제점

자세히

중복되는 코드


지저분한 코드


횡단 관심에 참여 했던 개발자들의 빈번한 참여
재활용성의 저하


횡단 관심(Crosscutting Concerns)의 코드가 핵심 코드 사이에 들어가는 문
제점
생산성의 저하


컨트롤+C, 컨트롤+V 의 향연의 문제점
횡단 관심 코드에 의한 재활용 성 저하
변화의 어려움

새로운 요구 사항 시 횡단 관심이 적용된 모든 부분에 대해서 적용해야 하는
문제점
AOP는?

의미

Aspect Oriented Programming

내용


Crosscutting Concerns
Core Concerns
Core Concerns
계좌이체
Crosscutting Concerns

관점 지향 프로그래밍
로깅
보안
트랜젝션
입출금
이자계산
AOP는?

사용에 따른 장점
 중복
되는 코드 제거
 코드의 간결성
 생산성 향상
 클래스의 재사용 성 증가
 유지 보수성 향상
즉! 조금이라도 더 쉴 수 있다
AOP 개념
Aspect
Primary Concern
Advice
Cross-Cutting
Concern
+
Weaving
Point Cut

Aspect


JoinPoint


조인포인트에 삽입되어져 동작할 수 있는 코드를 (Crosscutting Concern을 구현
한 코드)
PointCut


횡단 관심 모듈 기능이 삽입되어 동작 할 수 있는 특정 위치
Advice, Interceptor


Advice + PointCut
어떤 클래스의 어느 조인포인트를 사용할 것인지를 결정하는 선택 기능
Weaving, CrossTarget

포인트컷에 의해서 결정된 조인포인트에 지정된 어드바이스를 삽입하는 과정
AOP동작 원리

AOP의 Core Concern 모듈의 수정 없는 동작을 위한 Weaving,
CrossCutting 필요.

Core Concerns 모듈이 AOP에서는 Weaving 작업을 통해 Core
Concerns 모듈의 사이에 필요한 Crosscutting Concerns 코드가 동
작.
Core Concern Module
CrossCutting Concern Module
로깅
계좌 이체
Weaving
입출금
보안
이자계산
트랜젝션
AOP Weaving 방식

컴파일시 Weaving


대표적인 AOP 지원툴인 AspectJ 가 사용하는 방식이다. 일반 자바 컴파일러가
아닌 AspectJ 가 지원하는 컴파일러를 통해 컴파일시 핵심로직을 구현한 소스
에 알맞은 위치에 공통 기능 코드를 삽입하게 된다. 초기에는 AspectJ가 지원하
는 컴파일러를 통해 컴파일을 해야 한다는 제약에 따라 포인트컷에 변경에 따른
관련된 모든 클래스를 매번 재컴파일을 진행해야 되는 문제점이 있었지만 최
근 IDE 툴이 지원되면서 대표적인 AOP 지원툴로 자리매김 하였다.
클래스 로딩시 Weaving


Just Read
JVM이 클래스를 로딩할 때 클래스 정보를 변경할수 있는 에이전트를 제공함으로
써 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로
운 클래스 바이너리 코드를 사용하도록 한다. 즉 원본 클래스 파일은 변경하지
않고 클래스를 로딩할 때 JVM이 변경된 바이트 코드를 사용한다. AspectWerkz
가 이에 해당한다.
런타임시 Weaving

컴파일이나 클래스 로딩시 Weaving 과 달리 런타임시 Weaving 방식은 소스코드
나 클래스를 변경하지 않는다. 런타임시 Weaving은 프록시를 이용해 AOP를 적
용한다. 즉 핵심로직을 구현한 객체에 직접 접근하지 않고 중간에 공통코드가 적
용된 프록시를 생성하여 프록시를 통해 핵심로직에 접근하게 된다. Spring AOP
가 이에 해당한다. 단지 단점은 핵심로직을 실행하기 전/후에만의 JoinPoint 만
적용 가능 하며, 필드값 변경 같은 JoinPoint 에 대해서는 적용이 불가능하다.
AOP실습
(AspectWerkz&Jbuilder)
준비(1/2)

AspectWerkz다운
down
준비(2/2)

환경변수 설정
ASPECTWERKZ_HOME 으로 다운 받은 경로로
aspectwerz 경로 설정
JAVA_HOME 으로 jdk 경로 설정
소스(HelloWorld.java)
package testAOP;
public class HelloWorld {
public static void main(String args[]) {
HelloWorld world = new HelloWorld();
world.greet();
}
public void greet() {
System.out.println("Hello World!");
}
}
소스(MyAspect.java)
package testAOP;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
public class MyAspect {
public void beforeGreeting(JoinPoint joinPoint) {
System.out.println("before greeting...");
}
public void afterGreeting(JoinPoint joinPoint) {
System.out.println("after greeting...");
}
}
소스(aop.xml)
<aspectwerkz>
<system id="AspectWerkzExample">
<package name="testAOP">
<aspect class="MyAspect">
<pointcut name="greetMethod" expression="execution(*
testAOP.HelloWorld.greet(..))"/>
<advice name="beforeGreeting" type="before" bindto="greetMethod"/>
<advice name="afterGreeting" type="after" bindto="greetMethod"/>
</aspect>
</package>
</system>
</aspectwerkz>
소스의 위치
Jbuilder에서의 소스 위치
디렉토리 상의 소스 위치
AOPTest
testAOP
aop.xml
HelloWorld.java
MyAspect.java
소스 컴파일

Jbuilder 컴파일
디렉토리 상의 소스 위치
AOPTest
testAOP
aop.xml
Classes
HelloWorld.java
MyAspect.java
HelloWorld.class
MyAspect.class
Make 하게 되면 Classes 디렉토리안에
컴파일 된 바이트 클래스 파일이 생성된다.
AspectWerkz Weaving

소스확인
AspectWerkz Weaving

Weaving

Command : %ASPECTWERKZ_HOME%/bin/aspectwerkz -offline aop.xml -cp target ./classes
옵션
클래스의 위치
AspectWerkz Weaving

결과
 make
make
Core Concern
CrossCutting Concern
<결과>