개요
웹 개발을 하다 보면 실제 비즈니스 로직이 호출되기 이전, 이후에 공통적으로 처리해야 할 기능들이 존재하는데, 대표적인 예로 로깅, 인증/인가, 인코딩 변환 등이 있다.
공통적인 기능의 코드를 모든 Controller, Service 레이어에서 작성하게 되면 코드의 중복이 발생하게 되고, 공통 기능 수정이 필요한 경우 중복으로 작성된 모든 코드들을 수정해야하는 번거로움이 생길 수 있다.(수정간에 빠뜨리고 수정하지 않는 코드 또한 생길 수 있음)
따라서, 공통 기능을 모아서 Spring에서 처리 할 수 있는 방법으로 이번 간단정리의 주제인 3가지가 주로 언급된다.
1. Filter
2. Interceptor
3. AOP
3가지 방법은 약간의 차이점이 존재한다.
실행 순서
Filter와 Interceptor 는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.
실행 순서를 보면 다음과 같다.
- Filter는 Spring의 가장 앞단에 존재하는 Dispatcher Servlet(디스패처 서블릿) 전/후에 처리된다.
(Filter는 Spring 범위 밖에서 처리. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리 되는 것) - Interceptor는 Spring에서 제공하는 기술로써, Dispatcher Servlet이 Controller를 호출하기 전/후에 처리된다.
- AOP는 Filter/Interceptor와 달리 다양한 지점에 자유롭게 설정이 가능하다.
(Filter/Interceptor는 URL 패턴으로 적용되는 반면, AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 적용 대상을 지정할 수 있다.)
Filter(필터)
Filter는 일반적으로 Spring과 무관하게 전역적으로 처리해야 하는 작업들을 처리할때 사용한다.
- Filter는 Spring이 실행 되기전 실행되며 톰캣과 같은 웹 컨테이너(WAS)에서 처리를 해주게 된다.
- Request / Response에 대한 조작이 가능함
(HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 처리 함)
따라서 아래와 같은 처리에 적합하다.
- 공통된 보안 및 인증/인가 관련 작업(XSS방어)
- 이미지/데이터 압축 및 문자열 인코딩 변환 처리
- Spring과 분리되어야 하는 기능
- 모든 요청에 대한 로깅
Interceptor(인터셉터)
Interceptor는 주로 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 작업을 처리할때 사용한다.
- Interceptor는 Dispatcher Servlet에 N개 등록 될 수 있다. DS가 해당 요청을 처리 가능한 Intercepter에게 할당
- 스프링의 모든 빈 객체에 접근 할 수있다.
따라서 아래와 같은 처리에 적합하다.
- 세부적인 보안 및 인증/인가 공통 작업( 특정 사용자는 특정 기능을 사용 못하게 막음)
- API 호출에 대한 로깅
- Controller로 넘겨주는 정보(데이터)의 가공
(필터와 다르게 HttpServletRequest나 HttpServletResponse 등과 같은 객체를 제공받으므로 객체 자체를 조작할 수는 없음, 대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공 가능
ex) JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공하도록 가공)
AOP(Aspect Oriented Programming)
Aop는 주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소(URL)로 대상을 구분해서 걸러내야하는 반면,
AOP는 주소, 파라미터, 애노테이션 등 PointCut이 지원하는 다양한 방법으로 대상을 지정할 수 있다.
즉, URL 패턴 기반이 아닌 PointCut 단위로 동작한다.
이 때문에 비즈니스 로직의 메서드 실행 전, 후 단위까지 핸들링 할 수 있다.
'개발메모 > 간단정리' 카테고리의 다른 글
[간단정리] HTTP Request Method 종류 및 특징 (0) | 2023.02.03 |
---|---|
[간단정리] JDK Dynamic Proxy vs CGLib Proxy (0) | 2023.01.04 |
[간단정리] MSA란?(등장배경, 특징, 장단점) (0) | 2022.08.28 |
[간단정리] JAVA - 추상클래스, 인터페이스 특징 및 차이점 확실히 기억하기 (0) | 2022.08.26 |
[간단정리] JAVA - 제네릭(Generic)이란? (0) | 2022.08.23 |