[SpringBoot] Filter, Interceptor, AOP 차이점 정리

해니·2023년 5월 16일
0

SpringBoot

목록 보기
1/24
post-thumbnail



공통 업무 처리

  • 프로젝트 단위가 커질 수록 공통된 부분은 빼서 따로 관리하는 게 좋다.
  • 공통 업무를 프로그램 흐름의 앞 , 중간 , 뒤에 추가하여 자동으로 추가할 수 있는 방법은 아래와 같다.
    1) Filter
    2) Interceptor
    3) AOP




Filter, Interceptor, AOP의 흐름



[이미지 출처] https://sallykim5087.tistory.com/158

  • 실행순서를 보면 Filter가 가장 밖에 있고 그안에 Interceptor, 그안에 AOP가 있는 형태이다.
  • 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

  1. 서버를 실행시켜 서블릿이 올라오는 동안에 init 이 실행되고, 그 후 doFilter가 실행된다.
  2. 컨트롤러에 들어가기 전 preHandler가 실행된다.
  3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
  4. 서블릿 종료 시 destroy가 실행된다.




Filter(필터)

  • 서블릿 필터(Sevlet Filter)
    • java.servlet.Filter 인터페이스를 상속받아 구현하는 클래스
    • DispatcherServlet 이전에 실행
  • 스프링 컨텍스트 외부에 존재하며, 요청과 응답을 거른 뒤 정제하는 역할을 한다.
  • HTTP 요청과 응답 사이에서 전달되는 데이터를 가로채어 서비스에 맞게 변경하고 걸러내는 필터링 작업을 수행한다.
  • 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.




💡 디스패처 서블릿 (DispatcherServlet)

  • 서블릿 컨테이너의 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러
    • 프론트 컨트롤러(Front Controller)란 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러이다.
    • 프론트 컨트롤러가 도입되기 전에는 각 컨트롤러마다 공통 로직을 복붙 형식으로 다시 작성하여 사용했지만, 프론트 컨트롤러가 도입된 이후에는 공통의 로직에 대한 처리가 가능해졌다.


[출처] https://mozzi-devlog.tistory.com/8



💡 디스패처 서블릿의 흐름 ( Spring MVC 동작순서 )
1 ) 처음 클라이언트에서 요청이 오면 디스패처 서블릿(DispatcherServlet)이 해당 요청을 받는다.
2 ) 핸들러 매핑 (Handler Mapping)을 통해 요청에 알맞은 컨트롤러를 찾아낸다.
2-1 ) 요즘에는 주로 @Controller와 @RequestMapping 관련 어노테이션을 조합하여 컨트롤러를 생성하므로, 요청을 처리할 컨트롤러는 주로 HandlerMapping의 구현체 중 하나인 RequestMappingHandlerMapping가 찾아준다.
3 ) 찾아낸 컨트롤러를 핸들러 어댑터(Handler Adapter)를 통해 해당 컨트롤러의 메서드를 실행시킨다.
4 ) 컨트롤러는 요청을 처리한 뒤 처리한 결과와 해당 뷰 정보(ModelAndView)를 다시 디스패처 서블릿에게 전달한다.
5 ) 받은 정보로 디스패처 서블릿은 View Resolver를 통해 View 파일을 찾는다.


[출처] https://mozzi-devlog.tistory.com/8








인터셉터(Interceptor)

  • Interceptor(인터셉터)는 요청에 대한 작업 전, 후로 가로챈다.
  • 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
  • 스프링의 모든 빈 객체에 접근할 수 있다.
  • 인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크, 프로그램 실행 시간 계산작업 로그 확인 등의 업무처리에 사용한다.
    • preHandler(): 컨트롤러 메소드가 실행되기 전
    • postHanler(): 컨트롤러 메소드 실행직 후 view 페이지 렌더링 되기 전
    • afterCompletion(): view 페이지가 렌더링 되고 난 후





AOP (Aspect Oriented Programming, 관점지향 프로그래밍)

  • OOP(객체지향 프로그래밍)를 보완하기 위해 나온 개념
  • 중복된 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
  • AOP의 핵심은 공통 모듈을 분리시켜 해당 소스코드가 외부의 다른 클래스에서 존재하는 것이다.
  • ‘로깅’, ‘트랜잭션’, ‘에러 처리’ 등 비즈니스단의 메소드에서 조금 더 세밀하게 조정할 때 사용한다.
  • 메소드 전후의 지점에 자유롭게 설정이 가능하다.
  • 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
    • @Before: 대상 메소드의 수행 전
    • @After: 대상 메소드의 수행 후
    • @After-returning: 대상 메소드의 정상적인 수행 후
    • @After-throwing: 예외발생 후
    • @Around: 대상 메소드의 수행 전, 후












출처
https://jangjjolkit.tistory.com/6
https://goddaehee.tistory.com/154
https://sallykim5087.tistory.com/158
https://greendreamtrre.tistory.com/601

profile
💻 ⚾️ 🐻

0개의 댓글