2020. 7. 29. 04:37ㆍSpring/Spring
1. AOP 엘리먼트
1) <aop:config> 엘리먼트
루트 엘리먼트로 여러버너 사용 가능하며, 하위에는 <aop:pointcut>, <aop:aspect> 엘리먼트가 위치한다.
2) <aop:pointcut> 엘리먼트
<aop:config>, <aop:aspect>하위에 설정할 수 있다. 여러 개 정의할 수 있고 id 속성을 통해 <aop:aspect> 설정 시 참조하여 사용한다.
3) <aop:aspect> 엘리먼트
핵심 관심에 해당하는 포인트컷 메서드와 횡단 관심에 해당하는 어드바이스 메서드를 결합하기 위해 사용한다.
4) <aop:advisor> 엘리먼트
애스펙트와 동일하게 포인트컷과 어드바이스를 결합한다. 주로 트랜젝션과 같은 특수한 경우에 사용한다. AOP 설정에서 애스펙트를 사용하려면 어드바이스의 id와 메서드 이름을 알아야 한다. 만약 어드바이스 객체의 아이디를 모르거나 메서드 이름을 확인할 수 없을 경우 애스펙트를 설정할 수 없다.
트랜잭션 어드바이스의 id는 txAdvice로 설정했지만 어드바이스의 메서드 이름을 확인할 수 없기 때문에 설정 파일의 <tx:advice> 엘리먼트를 해석하여 어드바이스 객체를 메모리에 생성하고 <aop:advisor> 엘리먼트를 이용하여 설정한다.
<!-- 트랜젝션 설정 -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allPointcut" expression="execution(* com.springbook.biz..*Impl.*(..))" />
<aop:advisor pointcut-refs="allPointcut" advice-ref="txAdvice" />
</app:config>
2. 포인트컷 표현식
1) 리턴 타입
표현식 | 설명 |
* | 모든 리턴타입 허용 |
void | 리턴타입이 void인 메서드 허용 |
!void | 리턴타입이 void인 메서드 불허 |
2) 패키지 경로
패키지 경로 지정 시 '*', '..' 를 사용한다.
3) 클래스명
클래스명 지정 시 '*', '+' 를 사용한다.
4) 메서드명
메서드 지정 시 주로 '*'를 사용하고 매개 변수의 경우 '..'를 사용한다.
(ex. get*(..)의 경우 get으로 시작하는 모든 메서드를 선택)
3. 어드바이스 동작 시점
1) Before 어드바이스
메서드가 실행되기 전에 처리되도록 한다.
/src/main/java/
applicationContext.xml, BeforeAdvice.java
2) After Returning 어드바이스
메서드가 정상적으로 실행된 후 메서드 수행 결과로 생성된 데이터를 반환하는 시점에 동작한다.
/src/main/java/
applicationContext.xml, AfterReturningAdvice.java
3) After Throwing 어드바이스
포인트컷으로 지정한 메서드가 실행되다 예외가 발생하는 시점에 동작하기에 예외 처리 어드바이스를 설정할 때 사용한다.
/src/main/java/
applicationContext.xml, AfterThrowingAdvice.java, BoardServiceImpl.java
4) After 어드바이스
무조건 수행되는 어드바이스를 등록할 때 사용한다.
/src/main/java/
applicationContext.xml, AfterAdvice.java
5) Around 어드바이스
Around 어드바이스는 클라이언트의 메서드 호출을 가로채어 호출한 비즈니스 메서드가 실행되기 전에 사전 처리 로직을 수행하고, 모두 실행되고 나서 사후 처리 로직을 수행한다. (예외를 발생하기 위해 설정한 BoardServiceImpl을 되돌리고 진행한다.)
/src/main/java/
applicationContext.xml, AroundAdvice.java
4. JoinPoint, 바인드 변수
1) JoinPoint 인터페이스
After Throwing 기능을 수행할 때, 예외가 발생한 메서드가 속한 클래스, 패키지 정보, 메서드명이 무엇인지 알아야 정확한 예외 처리 로직을 구현할 수 있다. 이를 위해 스프링에서는 JoinPoint를 제공한다.
메서드 | 설명 |
Signature getSignature() | 클라이언트가 호출한 메서드의 정보가 저장된 Signature 객체 반환 |
Object getTarget() | 클라이언트가 호출한 비즈니스 메서드를 포함한 비즈니스 객체 반환 |
Object[] getArgs() | 클라이언트가 메서드를 호출할 때 넘겨준 인자 목록을 Object 배열로 반환 |
※ Before, After Returning, After Throwing, After 어드바이스에서는 JoinPoint를 사용하지만, Around 어드바이스에서는proceed() 메서드가 필요하기 때문에 JoinPoint를 상속한 ProceedingJoinPoint를 이용해야한다.
2) Signature 객체
메서드 | 설명 |
String getName() | 클라이언트가 호출한 메서드명 반환 |
String toLongString() | 클라이언트가 호출한 메서드의 반환타입, 이름, 매개변수 패키지 경로까지 포함하여 반환 |
String toShortString() | 클라이언트가 호출한 메서드 시그니처를 축약한 문자열로 반환 |
3) Before 어드바이스
메서드가 실행되기 전에 동작하기 때문에 Before 어드바이스 메서드의 매개 변수로 JoinPoint를 선언하고 클라이언트가 호출 시 인자로 넘겨준 값들을 JoinPoint를 이용하여 출력하도록 구현한다.
/src/main/java/
applicationContext.xml, BeforeAdvice.java, 구현 화면
4) After Returning 어드바이스
메서드 수행 후 결과 데이터를 반환할 때 동작하는 어드바이스에서는 어떤 메서드가 어떤 값을 반환했는지 알아야한다. JoinPoint 객체를 첫 번째 매개변수로, Object 바인드 변수를 두 번째 매개변수로 설정한다. 바인딩 변수는 메서드가 어떤 값을 반환했는지에 대한 정보를 담고있다.
바인딩 변수를 매개변수로 사용했을 경우 <aop:after-returning>의 returning 속성을 이용하여 결과값을 바인딩한다. 이 후, UserServiceClient 클래스에서 관리자 계정으로 로그인했을 경우와 아닐 경우 나오는 결과값이 달라진다.
/src/main/java/
applicationContext.xml, AfterReturningAdvice.java, 구현 화면
5) After Throwing 어드바이스
메서드가 수행되다가 예외가 발생할 때 동작하는 어드바이스로, 정확한 예외처리를 위해 어떤 예외가 발생했는지 알아야 한다. 첫 번째 매개 변수로 JoinPoint, 두 번째 매개 변수로는 Exception 최상위 예외 클래스로 선언하여 모든 예외 객체를 바인드할 수 있도록 한다.
바인딩 변수를 매개변수로 사용했을 경우 <aop:after-throwing>의 throwing 속성을 이용하여 결과값을 바인딩한다.
/src/main/java/
applicationContext.xml, AfterThrowingAdvice.java, BoardServiceImpl.java
발생하는 예외에 따라 처리를 할 수 있다.
/src/main/java/
AfterThrowingAdvice.java
6) Around 어드바이스
Around 어드바이스는 proceed() 메서드를 사용하기 위해 ProceedingJoinPoint 객체를 매개변수로 받아야한다.
/src/main/java/
applicationContext.xml, AroundAdvice.java
[참고] 스프링 퀵 스타트
'Spring > Spring' 카테고리의 다른 글
[Spring] JdbcTemplate (0) | 2020.07.30 |
---|---|
[Spring] AOP 어노테이션 (0) | 2020.07.29 |
[Spring] AOP (0) | 2020.07.27 |
[Spring] 사용자 서비스 구현 (0) | 2020.07.27 |