Filter | Intercepter | AOP

드립이 블로그·2023년 3월 30일
0

Filter | Intercepter | AOP

이들은 Spring에서 중복 코드를 제거할 때 사용한다.

Filter

Dispatcher Servlet에 요청되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가적인 작업을 처리 할 수 있는 기능을 제공한다.
디스패처 서블릿은 스프링의 가장 앞단에 존재하는 컨트롤러이다.
따라서 필터는 스프링의 범위 밖에서 처리가 된다.

Filter의 3가지 Method

init

필터 객체를 초기화하고, 서비스에 추가하기 위한 메서드이다.
웹 컨테이너가 1회 init을 호출하여 필터 객체를 초기화 하면, 이후의 요청은 doFilter를 통해 처리가 된다.

doFilter

url패턴에 맞는 모든 http 요청이 디스패처 서블릿으로 전달 되기 전에 웹 컨테이너에 의해 실행된다.
FilterChain 이라는 파라미터를 가지고 있다.
FilterChain의 doFilter를 통해 다음 대상으로 요청을 전달한다.
chain.doFilter() 전/후에 필요 처리과정을 넣어, 원하는 처리를 진행 할 수 있다.

dstroy

필터 객체를 서비스에서 제거하고, 사용 자원을 반환하기 위한 메서드이다.
웹 컨테이너에 의해 1번 호출되고, 이후 doFilter에 의해 처리되지 않는다.


Interceptor

Spring에서 제공하는 기능이다.
디스패처 서블릿의 컨트롤러 호출 전/후에 요청, 응답을 참조하거나 가공할 수 있는 기능을 제공한다.

Interceptor 의 3가지 Method

preHandle

컨트롤러 호출 전에 실행되기 때문에 컨트롤러 이전에 처리해야 하는 작업에 사용된다.
반환 타입은 boolean이다.
true인 경우 다음 단계로 진행되고, false인경우 작업을 중단한다.

postHandle

컨트롤러 호출 후에 실행되기 때문에 컨트롤러 이후에 처리할 작업이 있는 경우에 사용할 수 있다.
컨트롤러 하위계층에서 작업 진행 중 예외가 발생할 경우, 호출되지 않는다.

afterCompletion

모든 뷰에서 최종 결과를 생성하는 일을 포함한 모든 작업이 완료 된 후에 실행된다.
postHandle과는 다르게, 컨트롤러 하위계층에서 작업 진행중 예외가 발생해도 호출된다.


Filter와 Interceptor 차이

Filter
서블릿 컨테이너에서 관리된다.
스프링 예외 처리가 불가능하다.
리퀘스트, 리스폰스 객체 조작이 가능하다.

보안, 인증/인가 관련 작업을 할때 사용한다.
모든 요청에 대한 로깅, 감사시 사용한다.
스프링과 분리되어야 하는 기능에 사용한다.

Interceptor
스프링 컨테이너에서 관리된다.
스프링 예외 처리가 가능하다.
리퀘스트, 리스폰스 객체 조작이 불가능하다.

세부적인 보안, 인증/인가 관련 작업을 할때 사용한다.
API 호출에 대한 로깅, 감사시 사용한다.
컨트롤러로 넘겨주는 정보의 가공에 사용한다.


AOP 관점지향 프로그래밍

어떠한 로직을 기준으로 핵심 관점, 부가 관점을 나누어 그관점을 기준으로 모듈화 하는 것을 뜻한다.
모듈화 시킨 블럭을 Aspect 라고한다.

AOP 적용방법

컴파일 타임에 적용

컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트코드를 생성한다.

로드 타임에 적용

순수하게 컴파일 후, 클래스를 로딩하는 시점에서 클래스 정보를 변경한다.

런타임에 적용

클래스 타입의 빈을 만들대, 프록시 빈을 생성하고, 프록시 빈이 Aspect 코드를 추가하여 동작한다.

스프링 AOP에서는 런타임에 적용하는 방법을 주로 사용한다.

0개의 댓글