Interceptor 와 Aop 구분

진성대·2023년 10월 12일
0

java spring

목록 보기
15/15

Interceptor

목적

  • 주로 웹 요청과 관련된 작업을 수행하는데 사용된다. 예를 들어, 인증, 로깅, 트랜잭션 관리, CORS 처리 등의 기능을 구현할때 사용된다.
  • 주로 웹 요청의 전/후 처리에 중점을 둔다. 따라서 HTTP 요청의 생명주기 내에서 동작하는 로직을 구현할 때 주로 사용된다.

동작 방식

  • HandlerInterceptor 인터페이스를 구현하는 클래스를 정의하고, 이를 Spring의 HandlerMapping에 등록하여 특정 URL 패턴에 대한 요청을 가로채 처리한다.
  • 특히 요청을 처리하기 전 (pre-handle), 후(post-handle) 그리고 완전히 끝났을때(after completion)로 나누어 작업을 수행할 수 있다.

HandlerInterceptor 인터페이스 메서드

  • preHandle(HttpServletRequest, HttpServletResponse, Object): 컨트롤러에 요청이 도달하기 전에 실행되는 메서드, 반환 값이 false면 요청 처리가 중단된다.
  • postHandle(HttpServletRequest, HttpServletResponse, Object, ModelAndView): 컨트롤러가 실행된 후, 뷰를 렌더링하기 전에 실행되는 메서드
  • afterCompletion(HttpServletRequest, HttpServletResponse, Object, Exception) : 요청 처리가 완전히 끝난 후 실행되는 메서드

Interceptor 예시

public LoggingInterceptor extends HandlerInterceptorAdapter {
	
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	System.out.println("Before handling the request);
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    	System.out.println("After handling the request, but before rendering the view");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    	System.out.println("After rendering the view");
    }
    
}

Interceptor 등록

  • 생성된 Interceptor는 Spring MVC설정에 등록되어야 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor());
    }
}
  • 클라이언트로부터의 요청이 들어오면, 등록된 InterceptorpreHandle 메서드를 가진 Interceptor부터 시작합니다.
  • preHandle이 true를 반환하면, 다음 Interceptor나 실제 요청 핸들러(Controller)로 진행됩니다. 만약 false를 반환하면 요청 처리가 중단됩니다.
  • 요청 핸들러(Controller)가 처리된 후, postHandle 메서드가 호출됩니다.
    뷰가 렌더링된 후, afterCompletion 메서드가 호출됩니다.

적용 범위

  • 주로 웹 요청에 대한 처리를 위한 것이므로, 웹 계층에서만 작용한다.
  • 예) Controller에 직접적으로 영향을 미친다.

구성

  • preHandle(), postHandle(), afterCompletion()과 같은 메서드를 통해 요청의 전/후 처리를 할 수 있다.

확정성

  • 웹 요청과 관련된 로직을 처리하는데 특화 되어 있다.

AOP

목적

  • 어플리케이션 전체에 걸쳐 재사용 가능한 관심사를 모듈화하는 것을 목적으로 한다.
  • 여러 계층과 여러 메서드에 걸쳐 반복적으로 발생하는 관심사를 중심으로 한다. 예를 들어, 여러 서비스 메서드에서 예외 처리나 트랜잭션 관리를 할 때 사용될 수 있다.

동작방식

  • 특정 조인 포인트 (대상 메서드)에서 어드바이스(코드조각)를 실행한다. 이를 구현하기 위해 Spring AOP는 주로 프록시 기반의 방식을 사용한다.

1. 기본적인 서비스 클래스 :

public class SimpleService {
	public void someMethod() {
    	System.out.println("Executing someMethod...");
    }

}

2. AOP를 통한 로깅 추가 :

@Aspect
@Component
public class LoggingAspect {

	@Before("execution(* SimpleService.someMethod(..))")
    public void logBefore() {
    	System.out.println("Before calling someMethod");
    }
    
    @After("execution(* SimpleService.someMethod(..))")
    public void logAfter() {
    	System.out.println("After calling someMethod");
    }
}
  1. Spring이 SimpleService의 Bean을 생성할때 AOP가 설정되어 있다면, 실제로 SimpleService의 프록시 객체가 생성된다.
  2. someMethod를 호출하면, 프록시는 먼저 logBefore를 실행한 다음, 원본 someMethod를 실행하고 마지막으로 logAfter 를 실행한다.

결과

Before calling someMethod
Executing someMethod...
After calling someMethod

Spring에서는 주로 JDK Dynamic Proxy(인터페이스 기반) 또는 CGLB Proxy(클래스 기반, 인터페이스가 없는 경우)를 사용하여 프록시 객체를 생성한다.

Spring Proxy에 대해서..

적용 범위

  • 어플리케이션의 여러 계층 (웹, 서비스, DAO등)에 걸쳐 작동할 수 있다.

구성

  • Before, After, AfterReturning, AfterThrowing, Around 등의 다양한 어드바이스 유형을 제공한다.

확장성

  • 비지니스 로직과 관련된 여러 계층에 걸쳐 공통 관심사를 적용할 수 있으므로, 더 넓은 범위의 문제를 해결하는데 유용하다.
profile
신입 개발자

0개의 댓글