[Spring] AOP
- BACKEND/Spring
- 2017. 6. 14. 14:31
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 예제
'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 |