BackEnd/Spring
[Spring] AOP 활용 - @ControllerAdvice, @ExceptionHandler
ryuneng
2025. 1. 18. 00:02
반응형
✔️ Advice
: 클래스에 Advice가 붙어있으면 일반적으로 공통기능 이라고 생각하면 된다.
✔️ @ControllerAdvice
- 여러 컨트롤러 클래스에서 공통으로 사용되는 기능이 정의된 클래스에 부착하는 어노테이션
1. Target
- 핵심기능이 구현된 객체
- 공통 기능 적용대상이 되는 객체
2. JoinPoint
- 공통기능이 적용될 지점(Spring은 메서드 실행 조인포인트만 지원)
- 즉, Target 객체의 메서드가 조인포인트
라고 생각해도 무방하다.
3. Advice
- 공통기능이 구현된 객체
- 어드바이스는 실행시점에 따라서 before, after, after-returning, after-throwing, aroud 어드바이스가 있다.
(What + When)
4. Pointcut
- Advice 적용 규칙
- Target의 여러 조인포인트 중에서 어느 포인트에 Advcie를 적용할 것인지를 지정한다.
- whithin(com.example.service.*)
- execution( com.example.service..*(..))
(Where)
5. Aspect(Advice + Pointcut)
- Advice와 Pointcut을 결합한 것
- AOP 적용을 위한 실질적인 객체
(What + When + Where / 무엇을, 어디에, 언제 실행할 것인지)
6. Weaving
- Target의 조인포인트에 Aspcet를 적용하는 것
7. Proxy
- Target에 Aspect를 적용해서 새로 생성한 프록시 객체
- 실제로 애플리케이션에서 사용하는 객체(Target 대신 프록시 객체가 사용된다.)
- 프록시 객체에는 핵심기능이 실행될 때 공통기능이 함께 실행되도록 구현되어 있다.
* 개발자가 작성해야 하는 부분 : Advice, Pointcut
@Aspect
public class LoggingAdvice {
@Before("execution(* com.example.service.*.*(..))")
public void logging() {
// 로그출력 공통기능
}
}
- When : @Before
- Where :"execution( com.example.service..*(..))"
- What : 로그출력 공통기능
💡 @ExceptionHandler
- 예외처리를 담당하는 메서드임을 나타내는 어노테이션
- 예외처리 메서드와 매핑되는 예외클래스를 지정하면 지정된 그 예외 및 그 하위 예외가 발생했을 때 실행된다.
- 발생한 예외를 처리할 수 있는 예외처리 메서드가 여러 개일 때는 발생한 예외와 그 가까운 예외가 정의된 예외처리 핸들러 메서드가 실행된다.
- 예외처리 핸들러 메서드는 매개변수를 통해서 발생한 예외를 전달받을 수 있다.
@ControllerAdvice
@Log4j2
public class ExceptionHandlerAdvice {
// 여러개의 @ExceptionHandler가 있을 경우, 더 구체적인 Exception에 매핑됨
// 여기서는 DataAccessException에 해당하는 예외 발생 시,
// DataAccessException와 Exception 중 DataAccessException에 매핑됨
@ExceptionHandler(DataAccessException.class)
public String dataAccessExceptionHandle(DataAccessException ex) {
log.error(ex.getMessage(), ex);
return "error/db";
}
@ExceptionHandler(Exception.class) // Exception
public String exceptionHandle(Exception ex) {
log.error(ex.getMessage(), ex);
return "error/server";
}
}
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-AOP-활용