개발을 하다보면, 공통적으로 처리해야 할 업무들이 많습니다.
예를들어 로그인 관련 체크, 로깅, 문자 인코딩, 필터링 등이 있죠.
이러한 처리들을 필요한 부분마다 실행시킬 수 있지만
프로젝트 단위가 커질수록 코드의 중복이 늘어나서 서버에 많은 부하를 주게 됩니다.
따라서 적절한 사용 위치와 범위에 맞게 일괄처리를 해 주어야 하는데요.
그와 관련된 방식이 Filter, Interceptor, AOP 세가지 있습니다.
세 가지 개념이 모호해 한번 정리해보았습니다.
1. Filter(필터)
위 그림과 같이 필터는 스프링 프레임워크의 Context(영역) 밖에 있습니다. (스프링과 무관하게 J2EE 표준 스펙)
따라서 스프링에서 빈으로 등록된 컨트롤러나 서비스 객체의 사용이 어렵고,
웹 애플리케이션 전반에 걸친 모든 요청과 응답을 처리합니다.
주로 '문자 인코딩', 'XSS 방어' 등의 처리를 할 때 사용합니다.
(사용법: web.xml에 등록)
참고로 Filter의 메서드는 아래와 같습니다.
- init(): 필터 인스턴스 초기화
- doFilter(): 전/후 처리
- destroy(): 필터 인스턴스 종료
2. Interceptor(인터셉터)
반면, 인터셉터는 스프링 Context(영역) 안에서 Controller에 관한 요청과 응답에 대해 처리합니다.
스프링 프레임워크에서 차용한? 만든? 개념이죠.
따라서 스프링의 모든 빈 객체에 접근할 수 있습니다.
주로 세션, 쿠키를 사용한 '권한 체크', '로그인 체크' 등 Http 단위의 업무를 처리할때 사용합니다.
과거에는 Multipart 처리를 직접 해야해서 '파일 업로드'를 처리할 때도 유용했지만,
Servlet 3.0 이후부터는 HttpServletRequest에 Multipart 처리 기능이 포함되어 잘 활용되지 않는 듯 하네요.
(사용법: xml + Java)
Interceptor의 메서드는 아래와 같습니다.
- preHandler(): 컨트롤러 도달 전
- postHandler(): 컨트롤러 메서드 처리 후 view 호출 전
- afterCompletion(): view 페이지 응답 후
3. AOP(관점 지향 프로그래밍)
AOP에 대해서는 따로 포스팅을 해야 할 것 같습니다.
개념이 어렵고 복잡하네요.
간단하게,, OOP를 보완하기 위해 나온 개념으로,
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리하는 것입니다.
주로 '로깅', '트랜잭션', '에러 처리', '계좌이체' 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.
(사용법: xml + Java)
AOP의 포인트컷은 다음과 같습니다.
- @Before: 대상 메서드의 수행 전
- @After: 대상 메서드의 수행 후
- @After-returning: 대상 메서드의 정상적인 수행 후
- @After-throwing: 예외발생 후
- @Around: 대상 메서드의 수행 전/후
헷갈리던 분들에게 조금이나마 도움이 되었으면 좋겠습니다.
'Dev- > Spring' 카테고리의 다른 글
아주 기초적인 Spring Security 사용법 (1) (0) | 2018.08.15 |
---|---|
스프링 Filter 만들기 (0) | 2018.08.09 |
'좋아요' 기능 추가하기 (0) | 2018.08.02 |
오픈 API 사용하기 - 네이버 아이디로 로그인(로컬) (3) | 2018.07.25 |
Spring 회원가입 인증메일 구현하기 (5) | 2018.07.23 |