[Spring] AOP 활용 - @ControllerAdvice, @ExceptionHandler

류넹·2024년 3월 8일
1

Spring

목록 보기
30/50

✔️ 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() {
    	// 로그출력 공통기능
    }
}
  1. When : @Before
  2. Where :"execution( com.example.service..*(..))"
  3. 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";
	}
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글