일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- KONLPY
- gensim
- dataframe
- centos8
- ELASTIC
- tweepy
- bs4
- Jpype
- Pythonic
- 나무자르기
- dead lock
- js
- 프로그래머스
- pip install mariadb
- elastic search
- ChromeDriverManager
- ShallowCopy
- 파이썬
- MariaDB
- jvm.py
- rest api
- 완주하지못한선수
- Java
- 백준
- bulk post
- git bash
- pandas
- Python.h
- 토픽모델링
- pyLDAvis
- Today
- Total
부리부리부리
Filter, Interceptor, AOP 본문
개요
AOP란 Aspect Oriented Programming의 약자로, 관점 지향 프로그래밍이란 의미이다.
횡단 관심사(Cross-Cutting Concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 개발자는 반복 작업을 줄이고 핵심 기능 개발에만 집중할 수 있다.
AOP 자체는 패러다임이지만, 스프링에서 AOP패러다임을 기술적으로 구현해서 제공하기 때문에 기능으로 불리기도 한다. 스프링에서 사용되는 Filter, Interceptor, AOP에 대해 알아보고 전체적인 흐름을 짚어보려고 한다.
Filter
Filter는 요청과 응답을 거른뒤 정제하는 역할을 한다. Spring에서의 Filter는 Servlet 단위에서 실행된다.
Filter는 DispatcherServlet 이전에 실행이 되는데 Filter가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다. 보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.
필터 관련 메서드
- init() : Web Container에 생성된 직후에 init이 호출된다. (Filter 생성 시 딱 한번 호출)
- doFilter() : 서블릿 컨테이너가 클라이언트의 요청에 대해 서블릿이나 다른 필터, 또는 리소스로 요청이 전달되기 전후에 실행되는 역할을 한다.
- destroy() : init과 마찬가지로 소멸될 때 딱 한번 호출된다.
Interceptor
요청/응답을 가로채는 역할을 한다. 필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다. 하지만 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 영역에서 Controller에 대한 요청과 응답에 대해 처리한다. 또한 스프링의 모든 빈 객체에 접근할 수 있다.
인터셉터는 여러개를 사용할 수 있고 로그인 처리, 권한체크, 프로그램 실행시간 계산작업, 로그확인 등의 업무처리에 활용된다.
AOP
주로 ‘로깅’, ‘트랜잭션’, ‘에러처리’ 등 비즈니스 단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다. 인터셉터나 필터와는 달리 메서드 전후의 지점에서 자유롭게 설정 가능하다. 또한 인터셉터나 필터는 주소로 대상을 구분해서 걸러내야 하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다. Advice의 경우 JoinPoint나 ProceedingJointPoint 등을 활용해서 호출한다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest/HttpServletResponse를 파라미터로 사용한다
다음은 AOP와 관련된 용어 및 태그들이다.
- Aspect : Advice + PointCut로 AOP의 기본 모듈
- Advice : Target에 제공할 부가 기능을 담고 있는 모듈
- Target : Advice가 부가 기능을 제공할 대상(Advice가 적용될 비즈니스 로직)
- JoinPoint : Advice가 적용될 위치
- 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
- PointCut : Target을 지정하는 정규 표현식
- AOP의 포인트컷(PointCut)
- @Before : 대상 메서드의 수행 전
- @After : 대상 메서드의 수행 후
- @Around : 대상 메서드의 수행 전/후
- @After-returning : 대상 메서드의 정상적인 수행 후
- @After-throwing : 예외 발생 후
차이점
- Filter와 Interceptor는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에서 Proxy 패턴으로 실행된다. 실행순서는 Filter -> Interceptor -> AOP -> Interceptor -> Filter 순이다. 상세 순서는 다음과 같다.
- 필터를 웹 컨테이너 내에 생성한 후 초기화 시 init()이 호출된다. 그리고 doFilter가 호출된다.
- 컨트롤러에 들어가기 전에 preHandler()가 실행된다.
- 이후 타겟 메서드 실행 전에 @Before 어노테이션이 적용된 어드바이스가 실행된다.
- 컨트롤러에 나와 postHandler(), afterCompletion(), doFilter() 순으로 실행된다.
- 컨트롤러의 메서드 처리가 끝나 return 되고 화면에 띄워주는 처리가 되기 직전에 preHandler()가 호출된다.
- 서블릿 종료시 Filter.destroy()가 실행된다.
'Spring' 카테고리의 다른 글
Spring Security (0) | 2023.12.29 |
---|---|
[Spring] RDBMS에서 ORM까지 (0) | 2023.12.12 |