Presentation is loading. Please wait.

Presentation is loading. Please wait.

한국 스프링 사용자 모임 (http://ksug.org) 1 스프링 AOP 선택, 활용, 이슈 2008.10.12 백기선.

Similar presentations


Presentation on theme: "한국 스프링 사용자 모임 (http://ksug.org) 1 스프링 AOP 선택, 활용, 이슈 2008.10.12 백기선."— Presentation transcript:

1 한국 스프링 사용자 모임 (http://ksug.org) 1 스프링 AOP 선택, 활용, 이슈 2008.10.12 백기선

2 한국 스프링 사용자 모임 (http://ksug.org) 2 안녕하세요. 백기선 입니다. http://whiteship.me whiteship2000@gmail.com 목표 : 행복한 개발자. 취미 : 블로깅, 스크린캐스팅, 스프링, 하이버네 이트, 번역, 큐브, 피아노 현재 – 새싹 OpenSprout – 여친 구함 – 회사도 다니긴 … 다녀요.

3 한국 스프링 사용자 모임 (http://ksug.org) 3 주제 AOP 스프링 AOP 스프링 AOP 선택 스프링 AOP 활용 스프링 AOP 이슈

4 한국 스프링 사용자 모임 (http://ksug.org) 4 Aspect Oriented Programming

5 한국 스프링 사용자 모임 (http://ksug.org) 5 Before

6 한국 스프링 사용자 모임 (http://ksug.org) 6 After

7 한국 스프링 사용자 모임 (http://ksug.org) 7 주목할 것 코드 중복 깔끔한 코드 생산성 유지보수성 재사용성

8 한국 스프링 사용자 모임 (http://ksug.org) 8 (Spring) AOP 개념 정리 Target Object Advice Pointcut Joinpoint Advisor Weaving Proxy Introduction Aspect

9 한국 스프링 사용자 모임 (http://ksug.org) 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 한국 스프링 사용자 모임 (http://ksug.org) 10 어드바이스 Before 어드바이스 After 어드바이스 –After returning –After throwing –After (finally) Around 어드바이스

11 한국 스프링 사용자 모임 (http://ksug.org) 11 Before 어드바이스 Pointcut

12 한국 스프링 사용자 모임 (http://ksug.org) 12 After 어드바이스 Pointcut

13 한국 스프링 사용자 모임 (http://ksug.org) 13 Around 어드바이스 Pointcut

14 한국 스프링 사용자 모임 (http://ksug.org) 14 다양한 AOP 구현체 http://en.wikipedia.org/wiki/Aspect- oriented_programming#Implementationshttp://en.wikipedia.org/wiki/Aspect- oriented_programming#Implementations

15 한국 스프링 사용자 모임 (http://ksug.org) 15 예제 코드 E-mail Notification 예제 Java Development with the Spring Framework

16 한국 스프링 사용자 모임 (http://ksug.org) 16 Spring AOP

17 한국 스프링 사용자 모임 (http://ksug.org) 17 목표 쉽고 간단하게 JEE 에 필요한 AOP 기능을 제공. 모든 기능을 제공하는 AOP 프레임워크

18 한국 스프링 사용자 모임 (http://ksug.org) 18 특징 – 프록시 기반 AOP 구현 별도의 컴파일 과정이나, 클래스로더 제어가 필요 없음. AspectJ 와 연동 지원. JDK Dynamic 프록시와 CGLIB 프록시 사용. Method Execution 조인포인트만 지원. ? ? ? ? ? ? ? ?

19 한국 스프링 사용자 모임 (http://ksug.org) 19 클래식 스프링 AOP 어드바이스 org.aopalliance.aop org.springframework.aop Advice AfterAdvice AfterReturningAdvice ThrowsAdvice MethodInterceptor BeforeAdvice MethodBeforeAdvice

20 한국 스프링 사용자 모임 (http://ksug.org) 20 스프링 @AOP 어드바이스 org.aspectj.lang.annotation @AfterReturning @After @AfterThrowing @Before @Around

21 한국 스프링 사용자 모임 (http://ksug.org) 21 포인트컷 정적 (static) 포인트컷 동적 (dynamic) 포인트컷 포인트컷을 결정하는 시점이 런타임이냐 아니 냐 …

22 한국 스프링 사용자 모임 (http://ksug.org) 22 클래식 스프링 AOP 포인트컷 org.springframework.aop Pointcut ExpressionPointcut AbstractExpressionPointcut AspectJExpressionPointcut StaticMethodMatcherPointcut AbstractRegexpMethodPointcut NameMatchMethodPointcut JdkRegexpMethodPointcut AnnotationMatchingPointcut ComposablePointcut ControlFlowPointcut DynamicMethodMatcherPointcut

23 한국 스프링 사용자 모임 (http://ksug.org) 23 스프링 @AOP 포인트컷 org.aspectj.lang.annotation AspectJ 포인트컷 표현식 ( 일부 ) 사용 가능 –execution, this, target, within … 확장 표현식 제공. –bean @Pointcut

24 한국 스프링 사용자 모임 (http://ksug.org) 24 “Hello World” AOP 예제 프로그래밍을 통해 직접 프록시 객체 생성 클래식 스프링 AOP aop 네임스페이스를 사용하는 스프링 AOP 스프링 @AOP 스프링 + AspectJ

25 한국 스프링 사용자 모임 (http://ksug.org) 25 전반전은 후반전을 위한 몸풀기였을 뿐 … 이제부터 시작입니다. 전반전 끝

26 한국 스프링 사용자 모임 (http://ksug.org) 26 Spring AOP 선택

27 한국 스프링 사용자 모임 (http://ksug.org) 27 선택할 것 들 AOP 시스템 문법 위빙 시점

28 한국 스프링 사용자 모임 (http://ksug.org) 28 AOP 시스템 스프링 AOP – 프록시 패턴 AspectJ – 바이트 코드 수정

29 한국 스프링 사용자 모임 (http://ksug.org) 29 스프링 AOP – 프록시 기반 프록시 객체 타겟 객체 포인트컷 (pointcut) 어드바이스 (Advice) 어드바이저 (Advisor) 메소드 가로채기 (Method Interception)

30 한국 스프링 사용자 모임 (http://ksug.org) 30 AspectJ – 바이트 코드 조작 애스팩트 Weaver.class/.jar 바이트 코드.class/.jar.java/.aj

31 한국 스프링 사용자 모임 (http://ksug.org) 31 프록시 기반 접근방법의 장점 별도의 컴파일러 필요 없음. 클래스 단위가 아닌 객체 단위로 인터셉터 적 용이 가능. 간단한 기능만 제공 – 오직 메소드 실행 조인포인트만 지원. –AOP 에 쉽게 접근할 수 있다. 빈에 특화된 표현식 제공 – 예 ) bean(*Dao), bean(Member*)

32 한국 스프링 사용자 모임 (http://ksug.org) 32 프록시 기반 접근방법의 단점 메소드 실행 조인포인트만 가능 – 필드 접근이나 객체 생성 조인포인트는 사용 불가 스프링이 관리하는 빈에만 적용 가능 –new 로 생성한 객체에는 적용 불가 “self” 호출은 어드바이스 적용 안 됨. … public void foo(){ … bar(); } public void bar(){ … } … public void foo(){ … bar(); } public void bar(){ … } … 프록시를 거치지 않기 때문에, 어드바이스 적용 안 됨.

33 한국 스프링 사용자 모임 (http://ksug.org) 33 AOP 시스템 선택 결론 다음의 경우 스프링 AOP 를 사용 – 메소드 실행 조인포인트로 충분할 경우 – 별도의 컴파일러를 사용하고 싶지 않을 경우 – 도메인 객체에 AOP 를 적용할 필요가 없을 경우 @Configurable – 프록시 사용에 문제가 없을 경우 그 밖의 경우에는 AspectJ 를 사용.

34 한국 스프링 사용자 모임 (http://ksug.org) 34 문법 스프링 AOP –aop 스키마 스타일 –@AspectJ – 클래식 스프링 AOP AspectJ – 예전 문법 –@AspectJ

35 한국 스프링 사용자 모임 (http://ksug.org) 35 @AspectJ VS XML 자바 5 이상을 사용하는 경우에는 –@AspectJ 사용을 권장합니다. 간결하며 XML 이 줄어들고 포인트컷 조합이 가능하며 AspectJ 시스템과 연동이 수월합니다. 자바 5 이전 버전을 사용할 경우에는 –XML 밖에는 …

36 한국 스프링 사용자 모임 (http://ksug.org) 36 위빙 시점 컴파일 타임 –AspectJ 위빙 클래스 로딩 타임 – 로드 타임 위빙

37 한국 스프링 사용자 모임 (http://ksug.org) 37 AspectJ 위빙 애스팩트 Weaver.class/.jar 바이트 코드.class/.jar.java/.aj

38 한국 스프링 사용자 모임 (http://ksug.org) 38 로드 타임 위빙 java –javaagent:aspectjweaver.jar … VM 클래스와 애스팩트 aop.xml 파일들 … … Weaving Agent

39 한국 스프링 사용자 모임 (http://ksug.org) 39 위빙 비교 빌드 타임 위빙 비용이 빌드 타임에 발생 클래스 로딩 빠름 빌드 시스템 수정이 필요 함 배포 옵션 변경 필요 없 음 IDE 지원 좋음 로드 타임 로드 타임 속도 저하됨 빌드 시스템 변경 필요 없음 배포 옵션 변경 필요함 IDE 지원 없음

40 한국 스프링 사용자 모임 (http://ksug.org) 40 스프링 AOP 선택 결론 AOP 시스템 – 스프링 AOP 로는 부족할 때 AspectJ 스프링 AOP 문법 스타일 – 자바 5 라면, @AspectJ. 아니면, XML 스키마 위빙 방법 (AspectJ 사용 ) – 최신 WAS 를 사용할 경우에는, LTW 사용. – 아닌 경우, (AJDT 사용 하여 ) 컴파일 타임 위빙.

41 한국 스프링 사용자 모임 (http://ksug.org) 41 Spring AOP 활용

42 한국 스프링 사용자 모임 (http://ksug.org) 42 개발에 유용한 AOP 개발 도중 특정 메소드 성능 검사 서비스 계층에서 트랜잭션 처리 DAO 에서 발생하는 예외 변환 처리 DAO 에서 Service 계층 호출 금지 하이버네이트와 JDBC 혼용 할 때 DB 동기화 기타 ( 로깅, 인증, 권한, 멀티쓰레드 안전관리, …) AOP 는 이 모든 것을 깔끔하게 (transparently) 처리해 줍니다.

43 한국 스프링 사용자 모임 (http://ksug.org) 43 성능 테스트 간단한 메소드 실행 성능 테스트 예제 코드 @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; }

44 한국 스프링 사용자 모임 (http://ksug.org) 44 스프링 트랜잭션 @Transactional 과 를 사용하여 트랜잭션 처리하기. 예제 코드 자세히 –AnnotationDrivenBeanDefinitionParser.java –AnnotationTransactionAspect.aj –TransactionInterceptor.java

45 한국 스프링 사용자 모임 (http://ksug.org) 45 예외 변환 하이버네이트 예외를 스프링의 DataAccessException 으로 변환하기. 예제 코드 @Pointcut("@within(org.springframework.stereotype.Repository)") public void accountHibernateExceptionInDao(){} @AfterThrowing(pointcut="accountHibernateExceptionInDao()", throwing="e") public void translateHibernateException(HibernateException e){ throw SessionFactoryUtils.convertHibernateAccessException(e); }

46 한국 스프링 사용자 모임 (http://ksug.org) 46 아키텍처 검증 컨트롤러에서 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."); }

47 한국 스프링 사용자 모임 (http://ksug.org) 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 한국 스프링 사용자 모임 (http://ksug.org) 48 하이버네이트 상태 동기화 예제 코드 @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(); }

49 한국 스프링 사용자 모임 (http://ksug.org) 49 Spring AOP 이슈

50 한국 스프링 사용자 모임 (http://ksug.org) 50 이슈 “CGLIB 을 사용할까 JDK 프록시를 사용할까 ?” “ 어라 ! 프록시 적용이 안 되네 ?” “ 엥 ? 프록시 객체를 못 만들고 있네 ?” “ 흠... 좀 느려진 것 같은데 …” “Superficiality is the curse of our age.”

51 한국 스프링 사용자 모임 (http://ksug.org) 51 JDK 프록시 VS CGLIB 프록시 성능 라이브러리 추가 여부 Concrete 클래스의 프록시 생성 가능 여부 코드로 확인하기

52 한국 스프링 사용자 모임 (http://ksug.org) 52 CGLIB 을 사용할까 JDK 프록시를 사용할까 ? 라이브러리 추가에 문제가 없다면, CGLIB 프 록시 사용을 권장합니다. cglib cglib-nodep 2.1_3

53 한국 스프링 사용자 모임 (http://ksug.org) 53 어라 ! 프록시 적용이 안 되네 ? JDK 프록시 제약 사항 확인 – 인터페이스 타입이 아니라 클래스 타입으로 코딩 한 것은 아닌지 확인 메서드 체인 확인 –“self” 호출이 있는지 확인. CGLIB 프록시 제약 사항 확인 – 어드바이스를 적용하려는 메소드나 클래스가 final 인지 확인.

54 한국 스프링 사용자 모임 (http://ksug.org) 54 엥 ? 프록시 객체를 못 만들고 있네 ? CGLIB 프록시 제약 사항 확인 – 기본 생성자가 있어야 함. –final 클래스의 프록시는 생성하지 못함.

55 한국 스프링 사용자 모임 (http://ksug.org) 55 흠... 좀 느려진 것 같은데 … 포인트컷 확인 – 어드바이스를 적용할 필요가 없는 메소드에도 어 드바이스를 적용한 것은 아닌지 확인. 확인하는 방법 –xml 스키마, @AspectJ 사용시 AJDT 로 확인. – 클래식 AOP 사용시 어드바이스에 로그 메시지를 추가하고 확인.

56 한국 스프링 사용자 모임 (http://ksug.org) 56 스프링 AOP 적용 불가능한 상황 인터페이스 없음. final 클래스 또는 final 메서드. AOP 적용하고 싶은 마음.

57 한국 스프링 사용자 모임 (http://ksug.org) 57 Q&A

58 한국 스프링 사용자 모임 (http://ksug.org) 58 참고자료 Spring One 2008 - 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 http://www.eclipse.org/aspectj http://www.zdnet.co.kr/builder/dev/java/0,3903 1622,39147106,00.htmhttp://www.zdnet.co.kr/builder/dev/java/0,3903 1622,39147106,00.htm 피상성 : http://toby.epril.com/?p=434http://toby.epril.com/?p=434


Download ppt "한국 스프링 사용자 모임 (http://ksug.org) 1 스프링 AOP 선택, 활용, 이슈 2008.10.12 백기선."

Similar presentations


Ads by Google