스프링 AOP 선택, 활용, 이슈 2008.10.12 백기선 한국스프링사용자모임 (http://ksug.org) 1
안녕하세요. 백기선입니다. http://whiteship.me whiteship2000@gmail.com 목표 : 행복한개발자. 취미 : 블로깅, 스크린캐스팅, 스프링, 하이버네이트, 번역, 큐브, 피아노 현재 새싹 OpenSprout 여친구함 회사도다니긴 다녀요. 한국스프링사용자모임 (http://ksug.org) 2
AOP 스프링 AOP 스프링 AOP 선택 스프링 AOP 활용 스프링 AOP 이슈 주제 한국스프링사용자모임 (http://ksug.org) 3
Aspect Oriented Programming 한국스프링사용자모임 (http://ksug.org) 4
Before 한국스프링사용자모임 (http://ksug.org) 5
After 한국스프링사용자모임 (http://ksug.org) 6
코드중복 깔끔한코드 생산성 유지보수성 재사용성 주목할것 한국스프링사용자모임 (http://ksug.org) 7
(Spring) AOP 개념정리 Target Object Pointcut Aspect Advisor Introduction Advice Proxy 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 조인포인트 AspectJ 가지원하는 11 개의조인포인트 스프링 AOP 는이중에서 method execution 만지원. 한국스프링사용자모임 (http://ksug.org) 9
Before 어드바이스 After 어드바이스 After returning After throwing After (finally) Around 어드바이스 어드바이스 한국스프링사용자모임 (http://ksug.org) 10
Before 어드바이스 Pointcut 한국스프링사용자모임 (http://ksug.org) 11
After 어드바이스 Pointcut 한국스프링사용자모임 (http://ksug.org) 12
Around 어드바이스 Pointcut 한국스프링사용자모임 (http://ksug.org) 13
다양한 AOP 구현체 http://en.wikipedia.org/wiki/aspectoriented_programming#implementations 한국스프링사용자모임 (http://ksug.org) 14
예제코드 E-mail Notification 예제 한국스프링사용자모임 (http://ksug.org) 15
Spring AOP 한국스프링사용자모임 (http://ksug.org) 16
목표 모든기능을제공하는 AOP 프레임워크 쉽고간단하게 JEE 에필요한 AOP 를사용할수있는프레임워크. 한국스프링사용자모임 (http://ksug.org) 17
특징 프록시기반 AOP 구현 별도의컴파일과정이나, 클래스로더제어가필요없음.? AspectJ 와연동지원. JDK Dynamic 프록시와 CGLIB 프록시사용. Method Execution 조인포인트만지원.??? 한국스프링사용자모임 (http://ksug.org) 18
클래식스프링 AOP 어드바이스 org.aopalliance.aop org.springframework.aop Advice AfterAdvice BeforeAdvice MethodInterceptor AfterReturningAdvice ThrowsAdvice MethodBeforeAdvice 한국스프링사용자모임 (http://ksug.org) 19
스프링 @AOP 어드바이스 org.aspectj.lang.annotation @After @Before @Around @AfterReturning @AfterThrowing 한국스프링사용자모임 (http://ksug.org) 20
정적 (static) 포인트컷 포인트컷 동적 (dynamic) 포인트컷 포인트컷을결정하는시점이런타임이냐아니냐 한국스프링사용자모임 (http://ksug.org) 21
클래식스프링 AOP 포인트컷 org.springframework.aop Pointcut ExpressionPointcut StaticMethodMatcherPointcut ComposablePointcut AnnotationMatchingPointcut ControlFlowPointcut AbstractRegexpMethodPointcut DynamicMethodMatcherPointcut AbstractExpressionPointcut NameMatchMethodPointcut AspectJExpressionPointcut JdkRegexpMethodPointcut 한국스프링사용자모임 (http://ksug.org) 22
스프링 @AOP 포인트컷 org.aspectj.lang.annotation AspectJ 포인트컷표현식 ( 일부 ) 사용가능 execution, this, target, within 확장표현식제공. bean @Pointcut 한국스프링사용자모임 (http://ksug.org) 23
Hello World AOP 예제 프로그래밍을통해직접프록시객체생성 클래식스프링 AOP aop 네임스페이스를사용하는스프링 AOP 스프링 @AOP 스프링 + AspectJ 한국스프링사용자모임 (http://ksug.org) 24
전반전끝 전반전은후반전을위한몸풀기였을뿐 이제부터시작입니다. 한국스프링사용자모임 (http://ksug.org) 25
Spring AOP 선택 한국스프링사용자모임 (http://ksug.org) 26
AOP 시스템 문법 위빙시점 선택할것들 한국스프링사용자모임 (http://ksug.org) 27
스프링 AOP 프록시패턴 AspectJ 바이트코드수정 AOP 시스템 한국스프링사용자모임 (http://ksug.org) 28
스프링 AOP 프록시기반 메소드가로채기 (Method Interception) 포인트컷 (pointcut) 어드바이스 (Advice) 프록시객체 타겟객체 어드바이저 (Advisor) 한국스프링사용자모임 (http://ksug.org) 29
AspectJ 바이트코드조작 바이트코드.class/.jar Weaver 애스팩트.class/.jar.java/.aj 한국스프링사용자모임 (http://ksug.org) 30
프록시기반접근방법의장점 별도의컴파일러필요없음. 클래스단위가아닌객체단위로인터셉터적용이가능. 간단한기능만제공 오직메소드실행조인포인트만지원. AOP 에쉽게접근할수있다. 빈에특화된표현식제공 예 ) bean(*dao), bean(member*) 한국스프링사용자모임 (http://ksug.org) 31
프록시기반접근방법의단점 메소드실행조인포인트만가능 필드접근이나객체생성조인포인트는사용불가 스프링이관리하는빈에만적용가능 new 로생성한객체에는적용불가 self 호출은어드바이스적용안됨. public void foo(){ bar(); } 프록시를거치지않기때문에, 어드바이스적용안됨. public void bar(){ } 한국스프링사용자모임 (http://ksug.org) 32
AOP 시스템선택결롞 다음의경우스프링 AOP 를사용 메소드실행조인포인트로충분할경우 별도의컴파일러를사용하고싶지않을경우 도메인객체에 AOP를적용할필요가없을경우 @Configurable 프록시사용에문제가없을경우 그밖의경우에는 AspectJ 를사용. 한국스프링사용자모임 (http://ksug.org) 33
스프링 AOP aop 스키마스타일 @AspectJ 클래식스프링 AOP AspectJ 예젂문법 @AspectJ 문법 한국스프링사용자모임 (http://ksug.org) 34
@AspectJ VS XML 자바 5 이상을사용하는경우에는 @AspectJ 사용을권장합니다. 간결하며 XML이줄어들고 포인트컷조합이가능하며 AspectJ 시스템과연동이수월합니다. 자바 5 이젂버젂을사용할경우에는 XML 밖에는 한국스프링사용자모임 (http://ksug.org) 35
컴파일타임 AspectJ 위빙 클래스로딩타임 로드타임위빙 위빙시점 한국스프링사용자모임 (http://ksug.org) 36
AspectJ 위빙 바이트코드 Weaver.class/.jar 애스팩트.class/.jar.java/.aj 한국스프링사용자모임 (http://ksug.org) 37
로드타임위빙 java javaagent:aspectjweaver.jar VM Weaving Agent aop.xml 파일들 클래스와애스팩트 <aspectj> </aspectj> <aspectj> </aspectj> 한국스프링사용자모임 (http://ksug.org) 38
위빙비교 빌드타임 위빙비용이빌드타임에발생 클래스로딩빠름 빌드시스템수정이필요함 배포옵션변경필요없음 로드타임 로드타임속도저하됨 빌드시스템변경필요없음 배포옵션변경필요함 IDE 지원없음 IDE 지원좋음 (AJDT) 한국스프링사용자모임 (http://ksug.org) 39
AOP 시스템 스프링 AOP 선택결롞 스프링 AOP 로는부족할때 AspectJ 스프링 AOP 문법스타일 자바 5 라면, @AspectJ. 아니면, XML 스키마 위빙방법 (AspectJ 사용 ) AJDT 를홗용한컴파일타임위빙 한국스프링사용자모임 (http://ksug.org) 40
Spring AOP 활용 한국스프링사용자모임 (http://ksug.org) 41
개발에유용한 AOP 개발도중특정메소드성능검사 서비스계층에서트랜잭션처리 DAO에서발생하는예외변홖처리 DAO에서 Service 계층호출금지 하이버네이트와 JDBC 혼용할때 DB 동기화 기타 ( 로깅, 인증, 권한, 멀티쓰레드안젂관리, ) AOP 는이모든것을깔끔하게 (transparently) 처리해줍니다. 한국스프링사용자모임 (http://ksug.org) 42
성능테스트 간단한메소드실행성능테스트 예제코드 @Around("executionOfCheckingMethod()") public Object showexecutiontime(proceedingjoinpoint pjp){ stopwatch.start(); Object ret = null; try { ret = pjp.proceed(); } catch (Throwable e) { e.printstacktrace(); } stopwatch.stop(); System.out.println(stopWatch.getLastTaskTimeMillis()); return ret; } 한국스프링사용자모임 (http://ksug.org) 43
스프링트랜잭션 @Transactional 과 <tx:annotation-driven /> 를사용하여트랜잭션처리하기. 예제코드 자세히 AnnotationDrivenBeanDefinitionParser.java AnnotationTransactionAspect.aj TransactionInterceptor.java 한국스프링사용자모임 (http://ksug.org) 44
예외변홖 하이버네이트예외를스프링의 DataAccessException 으로변홖하기. 예제코드 @Pointcut("@within(org.springframework.stereotype.Repository)") public void accounthibernateexceptionindao(){} @AfterThrowing(pointcut="accountHibernateExceptionInDao()", throwing="e") public void translatehibernateexception(hibernateexception e){ throw SessionFactoryUtils.convertHibernateAccessException(e); } 한국스프링사용자모임 (http://ksug.org) 45
아키텍처검증 컨트롟러에서 DAO 직접호출금지. 서비스계층에서컨트롟러호출금지. 예제코드 @Pointcut("execution(* org.opensprout.spring.aop.third.architecture.simpledao.*(..))") public void executedao(){} @Pointcut("call(* org.opensprout.spring.aop.third.architecture.simpleservice.*(..))") public void calltoservice(){} @Before("cflowbelow(executeDao()) && calltoservice()") public void checkdao(joinpoint jp){ System.out.println("Dao To Service Call Found!!"); throw new RuntimeException("Dao can't call Service's method."); } 한국스프링사용자모임 (http://ksug.org) 46
하이버네이트상태동기화 JdbcTemplate 사용하기젂에 Session.flush(). 왜? 출처 : Before a JDBC operation, flush the Hibernate Session (includes TSE example code) 한국스프링사용자모임 (http://ksug.org) 47
예제코드 하이버네이트상태동기화 @Aspect public class HibernateStateSynchronizer { @Autowired private SessionFactory sessionfactory; @Pointcut("call(* org.springframework.jdbc.core.jdbctemplate.*(..))") public void jdbcoperation() { } @Before("jdbcOperation()") public void synchronizehibernatestate() { Session session = sessionfactory.getcurrentsession(); if (session.isdirty()) { session.flush(); } } } 한국스프링사용자모임 (http://ksug.org) 48
Spring AOP 이슈 한국스프링사용자모임 (http://ksug.org) 49
이슈 CGLIB을사용할까 JDK 프록시를사용할까? 어라! 프록시적용이안되네? 엥? 프록시객체를못만들고있네? 흠... 좀느려짂것같은데 Superficiality is the curse of our age. 한국스프링사용자모임 (http://ksug.org) 50
JDK 프록시 VS CGLIB 프록시 성능 라이브러리추가여부 Concrete 클래스의프록시생성가능여부 코드로확인하기 한국스프링사용자모임 (http://ksug.org) 51
CGLIB 을사용할까 JDK 프록시를사용할까? 라이브러리추가에문제가없다면, CGLIB 프록시사용을권장합니다. <dependency> <groupid>cglib</groupid> <artifactid>cglib-nodep</artifactid> <version>2.1_3</version> </dependency> 한국스프링사용자모임 (http://ksug.org) 52
어라! 프록시적용이안되네? JDK 프록시제약사항확인 인터페이스타입이아니라클래스타입으로코딩한것은아닌지확인 메서드체인확인 self 호출이있는지확인. CGLIB 프록시제약사항확인 어드바이스를적용하려는메소드나클래스가 final 인지확인. 한국스프링사용자모임 (http://ksug.org) 53
엥? 프록시객체를못만들고있네? CGLIB 프록시제약사항확인 기본생성자가있어야함. final 클래스의프록시는생성하지못함. 한국스프링사용자모임 (http://ksug.org) 54
흠... 좀느려짂것같은데 사용하는프록시라이브러리확인 JDK 프록시를사용하는경우에는 CGLIB 프록시로변경고려. 포인트컷확인 어드바이스를적용할필요가없는메소드에도어드바이스를적용한것은아닌지확인. 확인하는방법 @AspectJ 사용시 AJDT 로확인. XML 또는클래식 AOP 사용시어드바이스에로그메시지를추가하고확인. 한국스프링사용자모임 (http://ksug.org) 55
스프링 AOP 적용불가능한상황 인터페이스없음. final 클래스또는 final 메서드. AOP 적용하고싶은마음. 한국스프링사용자모임 (http://ksug.org) 56
Q&A 한국스프링사용자모임 (http://ksug.org) 57
참고자료 Spring One 2008 - Making Sense of AOP Choices Spring 2.0 AOP - Spruce Up Your Domain M odel. 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