실용적인 스프링 AOP

Similar documents
Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

PowerPoint Presentation

Web Application을 구성하는 패턴과 Spring ROO의 사례

JVM 메모리구조

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

gnu-lee-oop-kor-lec06-3-chap7

01( ) SAV12-04.hwp

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Spring Data JPA Many To Many 양방향 관계 예제

No Slide Title

Design Issues

슬라이드 1

PowerPoint Presentation

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

JAVA PROGRAMMING 실습 05. 객체의 활용

C++ Programming

JAVA PROGRAMMING 실습 08.다형성

교육자료

PowerPoint Presentation

제11장 프로세스와 쓰레드

4 주차 - SPRING 환경설정및구현 Spring 기반의웹프로젝트를구성하고싶어요 T^T Spring 기반의웹환경구축 1. web.xml 수정으로 Spring 을설정하는방법 2. eclipse Spring Plug-In 을활용한템플릿프로젝트자동구성필수는아니지만해놓으면편

Cluster management software

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

쉽게 풀어쓴 C 프로그래밊

rmi_박준용_final.PDF

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

신림프로그래머_클린코드.key

PowerPoint Presentation

PowerPoint Presentation

ThisJava ..

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

Microsoft PowerPoint - JCO2007_Spring2.0_발표자료_Rev-A.ppt [호환 모드]

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint 프레젠테이션

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint Template

PowerPoint 프레젠테이션

Network Programming

JAVA PROGRAMMING 실습 02. 표준 입출력

설계란 무엇인가?

JUNIT 실습및발표

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

歯JavaExceptionHandling.PDF

02 C h a p t e r Java

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

PowerPoint Presentation

Semantic Consistency in Information Exchange

9장.예외와 단정

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - 2강

슬라이드 1

PowerPoint 프레젠테이션

교육2 ? 그림

Spring Boot

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

오버라이딩 (Overriding)

<4D F736F F F696E74202D20C1A632C8B8C7D1B1B9BDBAC7C1B8B5BBE7BFEBC0DAB8F0C0D32D496E E D56432E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

슬라이드 1

Microsoft PowerPoint 장강의노트.ppt

A Tour of Java V

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - hci2-lecture12 [호환 모드]

PowerPoint Presentation

mytalk

Microsoft PowerPoint - 04-UDP Programming.ppt

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

PowerPoint 프레젠테이션


1

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chap12-OOP.ppt

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - Lect04.pptx

PowerPoint Presentation

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - RMI.ppt

Contents Test Lab 홖경... 3 Windows 2008 R2 서버를도메인멤버서버로추가... 4 기존 Windows 2003 AD 홖경에서 Windows 2008 R2 AD 홖경으로업그레이드를위한사젂작업 7 기존 Windows 2003 AD의스키마확장...

Web Services 와 EAI

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

파워포인트

자바 프로그래밍

SW Verification

Intro to Servlet, EJB, JSP, WS

제목

MasoJava4_Dongbin.PDF

Transcription:

스프링 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