190 likes | 400 Views
AOP. ㅇ AOP (Aspect Oriented Programming) - 기능을 핵심 비즈니스와 공통 모듈로 구분하고 , 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 잘 끼워넣도록 개발하는 방법 - 공통 모듈을 만든 후에 코드 밖에서 비즈니스 로직에 삽입하는 방법 ㅇ 사용 예 ) - 메소드 성능 검사 - 트랜잭션 처리 - 예외 반환 - 아키텍처 검증 - 로깅 , 인증 , 권한 등. AOP.
E N D
AOP ㅇAOP (Aspect Oriented Programming) - 기능을 핵심 비즈니스와 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고사이사이에 공통 모듈을 잘 끼워넣도록 개발하는 방법 - 공통 모듈을 만든 후에 코드 밖에서 비즈니스 로직에 삽입하는 방법 ㅇ 사용 예) - 메소드 성능 검사 - 트랜잭션 처리 - 예외 반환 - 아키텍처 검증 - 로깅, 인증, 권한 등
AOP ㅇ 컴파일, 클래스 로딩, 런타임 세가지 AOP 적용 방식이 존재 - 스프링은 런타임 시에 AOP를 적용하는 Proxy 기반의 AOP 만을 지원 (핵심 로직을 실행하는 전/후 공통기능을 삽입) - 스프링의 방식만으로도 엔터프라이즈 어플리케이션을 구현하는데 전혀 부족함이 없음 핵심로직 핵심로직 핵심로직 공통모듈
AOP ㅇ AOP 용어
AOP ㅇ 필요 라이브러리 추가 - aopalliance.jar - aspectjweaver.jar - aspectjrt.jar - com.springsource.net.sf.cglib.jar
AOP - xml config.xml • <?xml version="1.0" encoding="UTF-8"?> • <beans xmlns="http://www.springframework.org/schema/beans" • xmlns:aop="http://www.springframework.org/schema/aop" • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" • xsi:schemaLocation="http://www.springframework.org/schema/beans • http://www.springframework.org/schema/beans/spring-beans.xsd • http://www.springframework.org/schema/aop • http://www.springframework.org/schema/aop/spring-aop.xsd"> • <bean id="first" class="edu.seowon.aop.xml.First" /> • <bean id="xmlAspect" class="edu.seowon.aop.xml.XmlAspect" /> • <aop:config> • <aop:aspect ref="xmlAspect"> • <aop:beforepointcut="execution(* edu.seowon.aop.xml.First.process(..))“ • method="before" /> • <aop:afterpointcut="execution(* edu.seowon.aop.xml.First.process(..))" • method="after" /> • <aop:after-throwingpointcut="execution(* edu.seowon.aop.xml.First.process(..))" • method="afterThrowing" /> • </aop:aspect> • </aop:config> • </beans>
AOP - xml Main.java public class Main { public static void main(String[] args) { ClassPathXmlApplicationContextctx = new ClassPathXmlApplicationContext( "edu/seowon/aop/xml/config.xml"); Object obj = ctx.getBean("first"); ((First)obj).process(); } }
AOP - xml First.java public class First { public void process() { System.out.println("First process()"); throw new RuntimeException(); } }
AOP - xml XmlAspect.java public class XmlAspect { public void before() { System.out.println("before"); } public void after() { System.out.println("after"); } public void afterThrowing() { System.out.println("afterThrowing"); } }
AOP - Annotation config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:annotation-config /> <aop:aspectj-autoproxy /> <bean id="first" class="edu.seowon.aop.anno.First" /> <bean id="annoAspect" class="edu.seowon.aop.anno.AnnoAspect" /> </beans>
AOP - Annotation Main.java public class Main { public static void main(String[] args) { ClassPathXmlApplicationContextctx = new ClassPathXmlApplicationContext( "edu/seowon/aop/anno/config.xml"); Object obj = ctx.getBean("first"); ((First)obj).process(); } }
AOP - Annotation First.java public class First { public void process() { System.out.println("First process()"); throw new RuntimeException(); } }
AOP - Annotation AnnoAspect.java @Aspect public class AnnoAspect { @Pointcut("execution(* edu.seowon.aop.anno..*(..))") public void process() {} @Before("process()") public void before() { System.out.println("before"); } @After("process()") public void after() { System.out.println("after"); } @AfterThrowing("process()") public void afterThrowing() { System.out.println("afterThrowing"); } }
AOP - Around config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:annotation-config /> <aop:aspectj-autoproxy /> <bean id="first" class="edu.seowon.aop.around.First" /> <bean id="annoAspectAround" class="edu.seowon.aop.around.AnnoAspectAround" /> </beans>
AOP - Around Main.java public class Main { public static void main(String[] args) { ClassPathXmlApplicationContextctx = new ClassPathXmlApplicationContext( "edu/seowon/aop/around/config.xml"); Object obj = ctx.getBean("first"); ((First)obj).process(); } }
AOP - Around First.java public class First { public void process() { System.out.println("First process()"); } }
AOP - Around AnnoAspectAround.java @Aspect public class AnnoAspectAround { @Pointcut("execution(* edu.seowon.aop.around..*(..))") public void process() {} @Around("process()") public Object trace(ProceedingJoinPointjoinPoint) throws Throwable { Object obj = null; try { System.out.println("around before"); obj = joinPoint.proceed(); System.out.println("around after"); } catch(Throwable e) { e.printStackTrace(); } return obj; } }
AOP ㅇ Pointcut 표현식 - execution() : 적용할 메소드를 세부적으로 명시 execution(public void set*(..)) 리턴 타입 :void , 메소드명 : set으로 시작, 파라미터 : 0개 이상 execution(* com.spring.aop.*.*()) 리턴 타입 : All, 메소드명 : All, 파라미터 : 없음 execution(* com.spring.aop..First.process(..)) 리턴 타입 : All, 메소드명 : process, 파라미터 : 0개 이상 execution(String com.spring.aop.exam.First.process()) 리턴 타입 : String, 메소드명 :process, 파라미터 : 없음 execution(* get*(*)) 리턴 타입 : All, 메소드명 : get으로 시작, 파라미터 : 1개(All) execution(* get*(*, *)) 리턴 타입 : All, 메소드명 : get으로 시작, 파라미터 : 2개(All) execution(* read*(String, ..)) 리턴 타입 : All, 메소드명 : read로 시작, 파라미터 : 첫번째 String, 나머지 모든 타입 0개 이상
AOP ㅇ Pointcut 표현식 - within() : 특정 패키지 또는 클래스의 모든 메소드 within(com.spring.aop.exam.First.process) within(com.spring.aop.exam.First.*) within(com.spring.aop.exam..*) - bean() bean(first) 빈의 이름이 first 인 클래스의 메소드 bean(*rst) 빈의 이름이 rst 로 끝나는 빈의 메소드
AOP 실습 ㅇ 패키지 : exam.spring.aop ㅇSpringExam (KakaoTalk, Tmap) 활용 runKakaoTalk, runTmap메소드 실행 시 AOP를적용하여 로그 출력 ex) 메소드 실행 전 before AOP! 메소드 실행 후 after AOP!