소소한개발팁
article thumbnail
Published 2020. 1. 12. 23:14
AOP(2) 프레임워크/Spring
반응형

Spring AOP의 구현 방식

01.XML 기반의 POJO클래스를 이용한 AOP 구현

-부가기능을 제공하는 Advice 클래스를 작성한다.

-XML설정 파일에 <aop:config>를 이용해서 애스펙트를 설정한다.

(즉,어드바이스와 포인트 컷을 설정함)

 

02.@Aspect 어노테이션을 이용한 AOP구현

-@Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다.

이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.

-XML 설정파일에 <aop:aspectj-autoproxy /> 를 설정한다.

 

Advice의 종류

 

Around Advice

타켓의 메서드가 호출되기 이전 (before)시점과 이후 (after)시점에 모두 처리해야 할 필요가 있는 부가기능을 정의한다.

->JoinPoint 앞과 뒤에서 실행되는 Advice

Before Advice

타겟의 메서드가 실행되기 이전(before) 시점에 처리해야 할 필요가 있는 부가기능을 정의한다.

->JoinPoint 앞에서 실행되는 Advice

After Returning Advice

타겟의 메서드가 정상적으로 실행된 이후(after)시점에 처리해야 할 필요가 있는 부가기능을 정의한다.

->JoinPoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice

After Throwing Adviced

타겟의 메서드가 예외를 발생된 이후(after)시점에 처리해야 할 필요가 있는 부가기능을 정의한다 .

->예외가 던져질때 실행되는 Advice

JoinPoint 인터페이스

JoinPoint는 Spring AOP 혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.

해당 지점을 AspectJ 에서 JoinPoint라는 인터페이스로 나타낸다.

JoinPoint 인터페이스는

 

getArgs() (메서드 아규먼트를 반환한다),

getThis() : 프록시 객체를 반환한다.

getTarget() :  대상객체를 반환한다 ,

getSignature() : 어드바이즈 되는 메서드의 설명(description)을 반환한다,

toString() :  어드바이즈 되는 메서드의 설명을 출력한다.

 

와 같은 유용한 메서드 제공

 

모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언할 수 있다.

 

Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 한다.

 

AOP 설정

<aop:config> : AOP설정 정보임을 나타냄

<aop:aspect>: 애스펙트를 설정함

<aop:around pointcut="execution()">: Around 어드바이스와 포인트컷을 설정한다.

 

ex)

<aop:config>

  <aop:aspect id="traceAspect" ref="performanceTraceAdvice">

    <aop:around pointcut="execution(public * myspring.user.service...*(...))" methodd="trace" />

  </aop:aspect>

</aop:config>

 

Advice를 정의하는 태그

각 타입의 Advice를 정의하기 위해 아래와 같은 태그를 제공한다

 

<aop:before> 메서드가 실행 전에 적용되는 어드바이스를 정의한다.
<aop:after-returning> 메서드가 정상적으로 실행된 후에 적용되는 어드바이스를 정의한다.
<aop:after-throwing> 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다. try-catch 블록에서 catch 블록과 비슷하다.
<aop:after>

메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.

try-catch-finally에서 finally 블록과 비슷하다.

<aop:around> 메서드 호출 이전,이후.예외발생 등 모든 시점에 적용 가능한 어드바이스를 정의한다.

PointCut 표현식 문법

AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성한다.

포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution()이다.

execution()지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같다.

 

출처:https://tacademy.skplanet.com/live/player/tacademyVodPlayer.action?serviceName=%255B14%25EA%25B0%2595%255D%2520AOP%2520%25EC%2596%25B4%25ED%2594%258C%25EB%25A6%25AC%25EC%25BC%2580%25EC%259D%25B4%25EC%2585%2598%2520%25EC%259E%2591%25EC%2584%25B1%281%29&orgId=0&liveDay=&startTime=&endTime=&camNum=1001&caller=main&userId=wjdgns2751&hName=%25EB%25B0%25A9%25EC%25A0%2595%25ED%259B%2588&eduCd=101446&adminYn=N&registerSeq=88683&seq=88

PointCut 표현식 예시

01.execution(*hello(..))

hello라는 이름을 가진 메서드를 선정하는 것이다.

파라미터는 모든 종류를 다 허용한다.

 

02.execution(*hello())

파라미터 패턴이 () 로 되어 있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.

 

03.execution(*myspring.user.service.UserServiceImpl.*(..))

myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택한다.

 

04.execution(*myspring.user.service.*.*(..))

myspring.user.service 패키지의 모든 클래스에 적용된다.

하지만 서브패키지의 클래스는 포함되지 않는다.

 

05.execution(*myspring.user.service..*.*(..))

myspring.user.service 패키지의 모든 클래스에 적용된다.

그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함된다.

 

06.execution(* *..Target.*(..))

패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용된다.

다른 패키지에 같은 이ㅡㄻ의 클래스가 있어도 적용이 된다는 점에 유의해야 한다.

 

반응형

'프레임워크 > Spring' 카테고리의 다른 글

Mybatis  (0) 2020.01.14
AOP(3)  (0) 2020.01.13
AOP(Aspect Oriented Progamming)  (0) 2020.01.11
사용자관리 프로젝트  (0) 2020.01.08
Bean 등록 메타정보 구성 전략 및 어노테이션  (0) 2020.01.08
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!