Aspect Oriented Programming http ksug org 4 Spring


























































- Slides: 58
Aspect Oriented Programming 한국 스프링 사용자 모임(http: //ksug. org) 4
(Spring) AOP 개념 정리 Target Object Pointcut Aspect Advisor Introduction Proxy Advice Joinpoint Weaving 한국 스프링 사용자 모임(http: //ksug. org) 8
조인포인트 • • • method call method execution constructor call constructor execution field get field set pre-initialization Initialization static initialization handler advice execution 한국 스프링 사용자 모임(http: //ksug. org) Aspect. J가 지원하는 11개의 조인포인트 스프링 AOP는 이 중에서 method execution만 지원. 9
어드바이스 • Before 어드바이스 • After 어드바이스 – After returning – After throwing – After (finally) • Around 어드바이스 한국 스프링 사용자 모임(http: //ksug. org) 10
다양한 AOP 구현체 • http: //en. wikipedia. org/wiki/Aspectoriented_programming#Implementations 한국 스프링 사용자 모임(http: //ksug. org) 14
예제 코드 • E-mail Notification 예제 Java Development with the Spring Framework 한국 스프링 사용자 모임(http: //ksug. org) 15
Spring AOP 한국 스프링 사용자 모임(http: //ksug. org) 16
클래식 스프링 AOP 어드바이스 • org. aopalliance. aop • org. springframework. aop Advice After. Returning. Advice 한국 스프링 사용자 모임(http: //ksug. org) Before. Advice Throws. Advice 19 Method. Interceptor Method. Before. Advice
스프링 @AOP 어드바이스 • org. aspectj. lang. annotation @After. Returning 한국 스프링 사용자 모임(http: //ksug. org) @Before @After. Throwing 20 @Around
클래식 스프링 AOP 포인트컷 • org. springframework. aop Pointcut Expression. Pointcut Composable. Pointcut Static. Method. Matcher. Pointcut Annotation. Matching. Pointcut Dynamic. Method. Matcher. Pointcut Abstract. Regexp. Method. Pointcut Name. Match. Method. Pointcut Abstract. Expression. Pointcut Aspect. JExpression. Pointcut 한국 스프링 사용자 모임(http: //ksug. org) Control. Flow. Pointcut Jdk. Regexp. Method. Pointcut 22
스프링 @AOP 포인트컷 • org. aspectj. lang. annotation • Aspect. J 포인트컷 표현식 (일부) 사용 가능 – execution, this, target, within … • 확장 표현식 제공. – bean @Pointcut 한국 스프링 사용자 모임(http: //ksug. org) 23
로드 타임 위빙 • java –javaagent: aspectjweaver. jar … VM Weaving Agent aop. xml 파일들 <aspectj> … </aspectj> 클래스와 애스팩트 <aspectj> … </aspectj> 한국 스프링 사용자 모임(http: //ksug. org) 38
성능 테스트 • 간단한 메소드 실행 성능 테스트 • 예제 코드 @Around("execution. Of. Checking. Method()") public Object show. Execution. Time(Proceeding. Join. Point pjp){ stop. Watch. start(); Object ret = null; try { ret = pjp. proceed(); } catch (Throwable e) { e. print. Stack. Trace(); } stop. Watch. stop(); System. out. println(stop. Watch. get. Last. Task. Time. Millis()); return ret; } 한국 스프링 사용자 모임(http: //ksug. org) 43
스프링 트랜잭션 • @Transactional과 <tx: annotation-driven /> 를 사용하여 트랜잭션 처리하기. • 예제 코드 • 자세히 – Annotation. Driven. Bean. Definition. Parser. java – Annotation. Transaction. Aspect. aj – Transaction. Interceptor. java 한국 스프링 사용자 모임(http: //ksug. org) 44
예외 변환 • 하이버네이트 예외를 스프링의 Data. Access. Exception으로 변환하기. • 예제 코드 @Pointcut("@within(org. springframework. stereotype. Repository)") public void account. Hibernate. Exception. In. Dao(){} @After. Throwing(pointcut="account. Hibernate. Exception. In. Dao()", throwing="e") public void translate. Hibernate. Exception(Hibernate. Exception e){ throw Session. Factory. Utils. convert. Hibernate. Access. Exception(e); } 한국 스프링 사용자 모임(http: //ksug. org) 45
아키텍처 검증 • 컨트롤러에서 DAO 직접 호출 금지. • 서비스 계층에서 컨트롤러 호출 금지. • 예제 코드 @Pointcut("execution(* org. opensprout. spring. aop. third. architecture. Simple. Dao. *(. . ))") public void execute. Dao(){} @Pointcut("call(* org. opensprout. spring. aop. third. architecture. Simple. Service. *(. . ))") public void call. To. Service(){} @Before("cflowbelow(execute. Dao()) && call. To. Service()") public void check. Dao(Join. Point jp){ System. out. println("Dao To Service Call Found!!"); throw new Runtime. Exception("Dao can't call Service's method. "); } 한국 스프링 사용자 모임(http: //ksug. org) 46
하이버네이트 상태 동기화 • Jdbc. Template 사용하기 전에 Session. flush(). • 왜? 출처: Before a JDBC operation, flush the Hibernate Session (includes TSE example code) 한국 스프링 사용자 모임(http: //ksug. org) 47
하이버네이트 상태 동기화 • 예제 코드 @Aspect public class Hibernate. State. Synchronizer { @Autowired private Session. Factory session. Factory; @Pointcut("call(* org. springframework. jdbc. core. Jdbc. Template. *(. . ))") public void jdbc. Operation() { } @Before("jdbc. Operation()") public void synchronize. Hibernate. State() { Session session = session. Factory. get. Current. Session(); if (session. is. Dirty()) { session. flush(); } } } 한국 스프링 사용자 모임(http: //ksug. org) 48
CGLIB을 사용할까 JDK 프록시를 사용할까? • 라이브러리 추가에 문제가 없다면, CGLIB 프 록시 사용을 권장합니다. <dependency> <group. Id>cglib</group. Id> <artifact. Id>cglib-nodep</artifact. Id> <version>2. 1_3</version> </dependency> 한국 스프링 사용자 모임(http: //ksug. org) 52
참고자료 • Spring One 2008 - Making Sense of AOP Choices • Spring 2. 0 AOP - Spruce Up Your Domain Model. • Using AOP in the Enterprise • http: //www. eclipse. org/aspectj • http: //www. zdnet. co. kr/builder/dev/java/0, 39 031622, 39147106, 00. htm • 피상성: http: //toby. epril. com/? p=434 한국 스프링 사용자 모임(http: //ksug. org) 58