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