티스토리 뷰
728x90
1. 이 포스트는 Spring : AOP with Java Config 시리즈의 연속이다.
2. @Afterthrowing 타겟 메소드에서 Exception이 발생한 경우에만 실행된다.
3. 주된 Use case 들
3-1 예외에 대한 로그처리
3-2 예외상황에 대한 감사(Audit) 처리
3-3 예외가 발생한 경우 이메일이나 SMS를 통한 알람
4. 아래는 boolean 변수를 사용하여 Exception을 발생시키는 예제다.
4-1 App.java 클래스에서 triggerError변수가 true일 경우 Exception이 발생한다.
4-1-1 이 경우 @AfterThrowing advice가 실행된다.
4-2 triggerError가 false일 경우 정상적으로 수행되고 @AfterReturning advice가 실행된다.
// Aspect Class정의
package pe.pilseong.aop_after_returning.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
// 타겟 메소드에서 예외가 발생한 경우에만 실행된다.
@AfterThrowing(
pointcut = "execution(* pe.pilseong.aop_after_returning.dao.AccountDAO.findAccounts(..))",
throwing = "ex"
)
public void afterThrowingFindAccountsAdvice(JoinPoint joinPoint, Throwable ex) {
System.out.println("Aspect(@AfterThrowing) :: afterThrowingFindAccountsAdvice is executed after "
+ joinPoint.getSignature().toShortString());
}
// 정상적으로 타겟 메소드가 수행된 경우에만 실행된다.
@AfterReturning(
pointcut = "execution(* pe.pilseong.aop_after_returning.dao.AccountDAO.findAccounts(..))"
)
public void afterReturningFindAccountsAdvice(JoinPoint joinPoint) {
System.out.println("Aspect(@AfterReturning) :: afterReturningFindAccountsAdvice is executed after "
+ joinPoint.getSignature().toShortString());
}
}
// 더미 DAO 클래스
package pe.pilseong.aop_after_returning.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import pe.pilseong.aop_after_returning.Account;
@Component
public class AccountDAO {
private static List<Account> accounts;
static {
accounts = new ArrayList<>();
accounts.add(new Account("Pilseong", "Admin"));
accounts.add(new Account("Suel", "Admin"));
accounts.add(new Account("Noel", "Staff"));
}
public List<Account> findAccounts(boolean triggerError) {
System.out.println("findAccounts is executed");
// triggerError가 true일 경우 Exception을 발생시킨다.
if (triggerError) {
throw new RuntimeException("Exception :: To trigger @AfterThrowing");
}
return AccountDAO.accounts;
}
}
// 실행 클래스
package pe.pilseong.aop_after_returning;
import java.util.List;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import pe.pilseong.aop_after_returning.config.JavaConfig;
import pe.pilseong.aop_after_returning.dao.AccountDAO;
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
AccountDAO accountDAO = context.getBean("accountDAO", AccountDAO.class);
List<Account> accounts = null;
// 강제적으로 발생한 예외를 처리한 try - catch 구문
try {
boolean triggerError = false;
accounts = accountDAO.findAccounts(triggerError);
} catch (Exception e) {
System.out.println("Main App class :: " + e.getMessage());
}
System.out.println("\nMain App class :: ");
System.out.println("Main App class Accounts List :: " + accounts);
context.close();
}
}
// 실행 결과 : triggerError = false 경우 - 정상적인 실행
findAccounts is executed
Aspect(@AfterReturning) :: afterReturningFindAccountsAdvice is executed after AccountDAO.findAccounts(..)
Main App class ::
Main App class Accounts List :: [Account [name=Pilseong, level=Admin], Account [name=Suel, level=Admin], Account [name=Noel, level=Staff]]
--------------------------------------------------------------------------------
// 실행 결과 : triggerError = true 경우 - Exception이 발생함
findAccounts is executed
Aspect(@AfterThrowing) :: afterThrowingFindAccountsAdvice is executed after AccountDAO.findAccounts(..)
Main App class :: Exception :: To trigger @AfterThrowing
Main App class ::
Main App class Accounts List :: null
728x90
'Spring > Spring AOP' 카테고리의 다른 글
Spring : AOP with Java Config - @Around (0) | 2020.05.14 |
---|---|
Spring : AOP with Java Config - @After (0) | 2020.05.13 |
Spring : AOP with Java Config - @AfterReturning return data 수정 (0) | 2020.05.13 |
Spring : AOP with Java Config - @AfterRetuning advice (0) | 2020.05.13 |
Spring : AOP with Java Config - Method Parameter 접근 (0) | 2020.05.13 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
TAG
- Rest
- hibernate
- form
- Angular
- WebMvc
- 로그인
- login
- 자바
- one-to-one
- jsp
- Spring
- 설정하기
- Many-To-Many
- crud
- RestTemplate
- spring boot
- 설정
- 스프링부트
- MYSQL
- 상속
- Validation
- mapping
- one-to-many
- 매핑
- 외부파일
- XML
- 스프링
- Security
- Spring Security
- 하이버네이트
250x250