[Spring] AOP

o 비지니스 로직 


공통 비지니스 로직( Cross Cutting Concern ) + 핵심 비지니스 로직( Core Concern ) 으로 구성되어 있다


하나의 Business Logic에서 공통로직과  핵심 로직을 분리해서 구현하는 것이다

공통비지니스 로직은 실행환경(컨테이너)가 처리한다.

핵심로직과 공통로직을 완벽히 분리해서 개발자가 핵심 비지니스 로직에 집중할수 있게 해준다.




o AOP 용어


Joinpoint - 공통관심사항이 적용될 수 있는 지점


Pointcut - 공통관심사항을 적용할 대상들 (핵심관심사항)


Advice - 공통관심사항을 어느 시점에 핵심 관심사항에 적용할지에 대한 정의

    - 시점 5가지 : before, after-returning, after-throwing, after, acount


Weaving - Advice를 핵심 로직에 적용하는 것




o pointcut 지정을 위한 AspectJ 표현식


pointcut - 핵심관심사항 메소드( Core Concern)

- AspectJ 표현식을 이용해 설정한다.


기본구문 - 명시자(패턴)

 - 명시자

+ excution : 메소드 구문을 이용한 패턴 지정. 패턴에 맞는 메소드들을 모두 pointcut 설정

ex) execution(접근제한자 리턴타입 패키지.Type.메소드명패턴(매개변수패턴))

  - 접근 제한자 : public 또는 생략 

▪ 생략할 경우 모든 접근 제한자

 - 리턴 타입 

▪ 리턴타입 명시 : reference type의 경우 패키지 명까지 명시한다. ( java.lang 제외)

▪  * : 모든 타입

- 패키지.type.메소드명 패턴

▪  .. : 패키지에 사용하며 그 패키지를 포함한 모든 하위패키지

▪  * : 이름에 사용 – 0글자 이상의 모든 문자

- 매개변수 패턴

▪  매개변수 타입을 지정한다.

▪  매개변수 타입 명시 : reference type의 경우 패키지 명까지 명시한다. ( java.lang 제외)

▪  * : 한 개의 매개변수가 와야 하며 타입은 상관없다.

▪  .. : 0개 이상의 매개변수가 와야 하며 타입은 상관없다. 


ex) ▪ execution(*spring.test.*.*())

     ▪ execution(public * spring.test..*.*())

     ▪ execution(public spring.vo.Member spring.service.*.*.get*(*))

     ▪ execution(String spring.service.MemberService.registMember(..))

     ▪ execution(* spring.service..*Service.regist*(..))

     ▪ execution(public * spring.dao..*Service.select*(String, ..))


+ within : Class 명을 이용한 패턴 지정. Class안에 모든 메소드들을 pointcut 설정

    ▪ within(패키지패턴.Class이름패턴)

- 패키지에 사용하는 패턴문자

    ▪ * : 한 개의 모든 패키지

    ▪ .. : 0개 이상의 모든 하위 패키지

    ▪ ex) test.*  : test 의 하위 패키지 , test.. : test 패키지와 모든 하위 패키지

- 클래스 이름에 사용하는 패턴문자.

   ▪ * : 0 글자 이상의 모든 문자

   ▪ ex) *Service : Service로 끝나는 모든 클래스. Member* : Member로 시작하는 모든 클래스


    ex) ▪ within(spring.service.MemberService)

   ▪ within(spring.service..MemberService)

   ▪ within(spring.service..*) 


+ bean : bean식별자 이용한 패턴 지정. bean 식별자 패턴에 맞는 bean들 안의 모든 메소드들 pointcut 등록

   ▪ bean(beanName 패턴)

- * : 0글자 이상의 모든 문자열


     ex)▪ bean(memberService)

   ▪ bean(*Service) 



o AOP 구현 - 사용하기 위해서 Maven - pom.xml에서 dependcies 설정 ( http://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.8.10 )


▪ Aspect 클래스 구현

- 공통 비지니스 로직을 가진 클래스

- @Aspect 를 클래스 선언 부에 붙임.

- 공통로직을 처리하는 메소드들에 Advice 어노테이선 선언


▪ Spring 설정파일

- Aspect 클래스 bean으로 등록

- aop 네임 스페이스 추가

- <aop:aspectj-autoproxy/> 추가

▪ @Aspect 선언된 bean들을 자동으로 Aspect로 등록 하는 태그. 


▪ @Before

- pointcut에 매칭되는 핵심 메소드들이 실행 되기 전에 호출되는 공통 메소드에 선언

- 속성  

▪ value : String – pointcut 지정

- 메소드

▪ public void 메소드명([ joinPoint : JoinPoint]) 

- 매개변수 : 생략 또는 JoinPoint


ex) @Before("execution(public * spring.model.service.*Service.find*(..))")

public void beforeMethod(){


▪ @AfterThrowing

- pointcut에 매칭되는 핵심 메소드들이 실행 후 비정상 종료시(예외를 던진 경우) 호출되는 공통 메소드

에 선언

- 속성  

▪ pointcut : String – pointcut 지정

▪ throwing : String - 먼저 실행된 핵심로직을 처리하는 메소드가 던진 오류객체(Throwable)를 받을 변수이름. [생

략가능]

- 메소드

▪ public void 메소드명([ joinPoint  : JoinPoint], [Throwable ex]) 

- 매개변수 :1. JoinPoint, 2. 오류객체를 받을 변수. (던져진 예외객체에 맞는 type을 선언하면 된다.)


ex)  @AfterThrowing(pointcut="execution(public * spring.model.service.*Service.find*(..))“, throwing=“ex”)

public void AfterThrowingMethod(Exceptoin ex){

}   


▪ @After

- pointcut에 매칭되는 핵심 메소드들이 실행 종료후 호출되는 공통 메소드에 선언

- 정상종료나 비정상 종료 상관 없이 실행 된다.

- 속성  

▪ value : String – pointcut 지정

- 메소드

▪ public void 메소드명([ joinPoint  : JoinPoint]) 

- 매개변수 : 생략 또는 JoinPoint


ex)  @After("execution(public * spring.model.service.*Service.find*(..))")

public void afterMethod(){


▪ @Around

- 공통로직을 처리하는 메소드에 모든 시점에 대한 처리를 직접 구현할 때 사용

- 모든 시점을 다 구현할 수 있다.

- 핵심로직 호출을 직접 하도록 구현해야 한다.

- 속성

▪ value : String – pointcut 지정 

- 메소드

▪ public Object 메소드이름([ joinPoint : ProceedingJoinPoint])

▪ 매개변수 : ProceedingJoinPoint – 호출된 핵심 로직 메소드를 호출하는 메소드 제공

▪ 리턴 타입 : 핵심 비지니스 로직을 호출한 곳으로 리턴 할 값


ex)

@Around("execution(public * spring.model.service.*Service.find*(..))")

public void aroundMethod (ProceedingJoinPoint joinPoint){

//before 코드

try{

Object retValue = joinPoint.proceed();  //대상객체의 메소드 호출

//after -returning 코드

return retValue; //호출 한 곳으로 리턴 값 넘긴다. – 넘기기 전 수정 가능

}catch(Throwable e){

//after -Throwing 코드

throw e; 

}finally{

//after 코드

}



o JoinPoint

▪ 호출된 대상객체에 대한 정보를 가지고 있는 객체

▪ 공통 로직을 처리하는 메소드의 첫 번째 매개변수로 선언할 수 있다.

- 생략 가능

JoinPoint 주요 메소드

Signature – 호출된 핵심메소드에 대한 정보를 제공하는 객체

Signature 주요 메소드

Object getTarget() : 대상객체를 리턴

Object[] getArgs() : 파라미터로 넘겨진 값들을 배열로 리턴. 넘어온 값이 없으면 빈 배열개체가 return 됨.

Signature getSignature () : 호출 되는 메소드의 정보

String getName() : 대상 메소드 명 리턴

String toShortString() : 대상 메소드 명 리턴

String toLongString() : 대상 메서드 전체 syntax를 리턴

String getDeclaringTypeName() : 대상메소드가 포함된 type을 return. (package명.type명)




AOP 예제


aop.zip




'BACKEND > Spring' 카테고리의 다른 글

[Spring] Spring MVC 개념  (0) 2017.06.16
[Spring] Spring MVC 예제  (0) 2017.06.15
[Spring] Transaction  (0) 2017.06.15
[Spring] Spring에서 Mybatis사용하기  (0) 2017.06.13
[Spring] Spring 개념 자료  (0) 2017.06.13

댓글

Designed by JB FACTORY