일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 스프링부트
- 이펙티브 자바
- 알고리즘정렬
- 코딩테스트
- 티스토리챌린지
- 예제로 배우는 스프링 입문
- 카카오
- Effective Java
- Spring
- JavaScript
- 카카오 면접
- ElasticSearch
- Effective Java 3
- k8s
- 이펙티브자바
- 스프링핵심원리
- 김영한
- kubernetes
- java
- 이차전지관련주
- 자바스크립트
- 오블완
- effectivejava
- 스프링
- 자바
- 스프링 핵심원리
- 알고리즘
- Sort
- 엘라스틱서치
- 클린아키텍처
- Today
- Total
Kim-Baek 개발자 이야기
[카카오 면접] Spring Filter, Interceptor, AOP 본문
카카오 면접을 준비하면서, 공부했던 내용을 정리해놓고 다시 기억하기 위한 포스팅
자바 웹 개발을 하다보면, 공통적으로 처리해야 할 업무들이 많다.
예를들어 로그인 관련(세션체크)처리, 권한체크, XSS(Cross site script)방어, pc와 모바일웹의 분기처리, 로그, 페이지 인코딩 변환 등이 있다.
공통업무에 관련된 코드를 모든 페이지 마다 작성 해야한다면 중복된 코드가 많아지게 되고
프로젝트 단위가 커질수록 서버에 부하를 줄 수도있으며, 소스 관리도 되지 않는다.
즉, 공통 부분은 빼서 따로 관리하는게 좋다.
이러한 공통업무를 프로그램 흐름의 앞, 중간, 뒤에 추가하여 자동으로 처리할 수 있는 방법이
위와 같은 공통처리를 위해 활용할 수 있는 것이 3가지가 있다.
1. Filter
2. Interceptor
3. AOP
스프링에서 사용되는 Filter, Interceptor, AOP 세 가지 기능은 모두 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용되는 기능들이다.
그렇다면 요청에 흐름에 따라 필터, 인터셉터, AOP의 차이점에 대해 알아보자.
1. 셋의 적용 시점이 다르다
: Filter -> Interceptor -> AOP
2. 적용하는 방식이 다름
: Filter : web.xml , Interceptor : servlet-context.xml
Filter, Interceptor, AOP의 흐름
ㆍInterceptor와 Filter는 Servlet 단위에서 실행된다. <> 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.
ㆍ실행순서를 보면 Filter가 가장 밖에 있고 그안에 Interceptor, 그안에 AOP가 있는 형태이다.
따라서 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.
1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.
2. 컨트롤러에 들어가기 전 preHandler가 실행된다
3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
4. 서블릿 종료 시 destroy가 실행된다.
Filter, Interceptor, AOP의 개념
1. Filter(필터)
말그대로 요청과 응답을 거른뒤 정제하는 역할을 한다.
서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.
<!-- 한글 처리를 위한 인코딩 필터 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
해당 필터의 이름은 encoding, 값은 UTF-8인 파라미터를 정의하고 있다.
필터의 URL-PATTERN을 /*로 정의하면 servlet, jsp뿐만 아니라 이미지와 같은 모든 자원의 요청에도 호출 된다.
[ 필터의 실행메서드 ]
ㆍinit() - 필터 인스턴스 초기화
ㆍdoFilter() - 전/후 처리
ㆍdestroy() - 필터 인스턴스 종료
특징
클라이언트 요청정보를 제공하는 객체를 정의 : ServletRequest 객체
서블릿 컨테이너는 ServletRequest 객체를 생성하고 이를 서블릿의 Service 메소드에 인수로 전달한다.
ServletRequest 객체는 매개 변수 이름과 값, 속성 및 입력 스트림을 포함하는 데이터를 제공한다.
-클라이언트 요청 정보를 제공하는 객체를 정의
-IP, hostname, 프로토콜 형식, 서버이름, 포트번호, ContentType 등을 가져올 수 있다.
-일반적인 네트워크 통신 기반에 의해서 사용되는 것들
-Servlet 의 web.xml에서 정의
-요청과 응답을 함께 다룰 수 있다.
-doFilter 메소드의 chain.doFilter(request,response) 를 기점으로 전/후 처리가능
2. Interceptor(인터셉터)
요청에 대한 작업 전/후로 가로챈다고 보면 된다.
필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.
하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근할 수 있다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리
[인터셉터의 실행메서드]
preHandler() - 컨트롤러 메서드가 실행되기 전
postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
afterCompletion() - view페이지가 렌더링 되고 난 후
특징
ServletRequest 인터페이스를 확장하여 HTTP 서블릿에 대한 요청 정보를 제공한다.
즉 , ServletRequest의 자식 Interface가 HttpServletRequest이다.
서블릿 컨테이너는 HttpServletRequest 객체를 생성하고 이를 서블릿의 서비스 메소드 (doGet, doPost등)에 인수로 전달
-public interface HttpServletRequest extends ServletRequest
-Http 프로토콜에 존재하는 정보들
-요청 파라미터, HTTP 헤더, 세션 및 쿠키 데이터, 요청에 사용된 URL 등을 가져올 수 있다.
-Spring에서 실행될 컨트롤러 빈 오브젝트, 컨트롤러가 돌려주는 ModelAndView, 발생한 예외 등을 제공받을수 있음.
-servlet-context.xml에 정의
3. AOP
OOP를 보완하기 위해 나온 개념
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
주로 '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다.
Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.
반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
세가지의 사용에 대한 결론
*Filter
-전체적인 Request단에서 어떤 처리가 필요할때
-인증,이미지변환,데이터압축,암호화필터,토크나이징 필터,XML 컨텐츠를 변형하는 XSLT 필터,
URL 및 기타정보를 캐시하는 필터
-문자 인코딩등
*Interceptor
-세션 및 쿠키 체크하는 http 프로토콜 단위로 처리해야 하는 업무가 있을 때
-로그인 세션 체크 등
*AOP
-비즈니스 단에서 세밀하게 조정하고 싶을때
-로깅,트랜잭션,에러처리 등
[추가 공지사항]
네이버 카카오에 취업하는 방법에 대한 글을 작성하고 나서, 좀 더 자세히 알고 싶다는 요청이 정말로 많았습니다.
그래서 IT기업에 합격하기 위한 서류, 코딩테스트, 면접까지 완벽하게 알려주는 오프라인 강의를 개설했습니다!
오픈하기 전에 몇 몇 분들께 사전 체험 형식으로 강의를 제공했는데, 네이버 공채에 합격을 한 수강생이 나올 정도로 저희가 아는 모든 것을 담은 강의입니다 :)
이제 막 오픈해서, 이벤트도 진행하고 있으니 많은 관심 부탁드립니다!
https://taling.me/Talent/Detail/36696
'개발 > Spring' 카테고리의 다른 글
[카카오 면접] 스프링의 여러 어노테이션 (0) | 2020.09.18 |
---|---|
[카카오 면접] @Service,@Controller,@Component 차이 (0) | 2020.09.08 |
[카카오 면접] 서블릿 컨테이너, 스프링부트 동작 과정 (0) | 2020.08.31 |
[책] 스프링 철저 입문 - AOP (0) | 2020.08.31 |
[책] 스프링 철저 입문 - DI (0) | 2020.08.24 |