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
<결과>