반응형
실무에서 개발하면서 찾아봐야지~ 찾아봐야지~ 했던 filter, aop, interceptor 부분을 드디어 공부해본다!
차이점 미리보기
특징 | Filter | AOP | Interceptor | Middleware |
적용 레벨 | HTTP 요청/응답 | 메서드/클래스 | 컨트롤러 전후 | 요청/응답 |
주요 사용 사례 | 보안, 로깅 | 트랜잭션, 로깅 | 인증, 데이터 가공 | 요청 처리 |
프레임워크 종속성 | 낮음 | 높음(Spring 등) | 높음(Spring MVC) | 높음 (Spring Boot) |
설정 위치 | web.xml/Java Config | Bean 등록 | Handler 설정 | Spring Config |
코드 복잡도 | 중간 | 높음 | 중간 | 낮음 |
요약
- Filter는 주로 HTTP 요청/응답을 다루며, 프레임워크에 종속되지 않아 표준적이다.
- AOP는 메서드 수준의 로직 분리에 적합하며, 코드 재사용성과 유지보수성이 뛰어나다.
- Interceptor는 컨트롤러 요청 처리 전후 작업에 적합하며, Spring MVC에서 주로 사용된다.
- Middleware는 Spring Boot 애플리케이션에서 요청 처리를 간소화하고 유연하게 설계할 수 있다.
Filter
- 정의: Java Servlet API에서 제공하는 기능으로, HTTP 요청/응답을 전처리하거나 후처리할 때 사용된다.
- 사용 목적:
- 요청/응답 로깅
- 보안 검사 (인증/인가)
- Content-Type 설정
- 위치: Servlet 컨테이너 레벨에서 동작하며, 특정 URL 패턴에 대해 실행된다.
- 주요 인터페이스: java.servlet.filter
- 실행 흐름:
- 요청 -> Filter -> Servlet/Controller -> Filter -> 응답
- 장점:
- 요청/응답을 처리하기 위한 표준화된 방식.
- URL 매핑으로 손쉽게 설정 가능.
- 단점:
- 특정 프레임워크에 종속되지 않아, 프레임워크의 고급 기능과 통합이 어려울 수 있다.
AOP(Aspect-Oriented Programming)
- 정의: 프로그램에서 공통적으로 필요한 기능을 따로 분리해서 관리하는 방법.
- 사용 목적:
- 로깅
- 트랜잭션 관리
- 보안/인증
- 위치: Spring AOP 또는 AspectJ와 같은 프레임워크에서 제공되며, 메서드 실행 전후 등 다양한 지점에 적용 가능.
- 주요 인터페이스/어노테이션:
- Spring: @Aspect, @Before, @After, @Around
- 실행 흐음:
- 메서드 호출 전후에 실행되며, 개발자가 정의한 포인트컥(Pointcut)과 Advice를 통해 동작.
- 장점:
- 코드 중복 제거.
- 메서드, 클래스 레벨에서 미세한 제어 가능.
- 단점:
- 추가적인 학습 곡선.
- Spring 프레임워크에 의존
Interceptor
- 정의: 주로 Spring MVC, JAX-RS 등 프레임워크에서 제공하는 요청/응답 가로채기 기능.
- 사용 목적:
- 요청 데이터 가공
- 사용자 인증/인가
- 특정 컨트롤러 로직 실행 전후의 공통 작업
- 위치: 컨트롤러 레벨에서 동작하며, 요청/응답을 가로챔
- 주요 인터페이스:
- Spring: HandlerInterceptor (preHandle, postHandle, afterCompletion 메서드 제공)
- 실행 흐름:
- DispatcherServlet -> Interceptor -> Controller -> View
- 장점:
- Spring MVC 환경에 최적화.
- 특정 컨트롤러에 대해 선택적으로 적용 가능.
- 단점:
- Spring MVC에 종속적.
Middleware
- 정의: 주로 Spring Boot에서 사용되며, 요청과 응답을 처리하는 중간 계층, Filter와 유사하지만 더 유연하게 구성가능.
- 사용 목적:
- API 요청 처리
- 공통 로직 구현
- 위치: Filter와 비슷하게 컨테이너에서 동작하지만, 프레임워크에 종속적임
- 주요 구현 방식
- Spring Boot에서 @Component로 구현된 빈에 대해 적용.
- 장점:
- Spring Boot 애플리케이션과 밀접하게 통합.
- 단점:
- 프레임워크 의존성 존재.
궁금한부분
요약
- Filter <-> AOP. 일부 교체 가능하지만, Filter는 HTTP 요청/응답 처리에, AOP는 메서드 레벨의 로직에 특화되어있다.
- Filter <-> Interceptor. Filter로 Interceptor를 대체할 수는 있지만, Spring MVC와의 밀접한 통합을 활용하려면 Interceptor가 더 적합하다.
- Interceptor <-> AOP. 일부 경우에 교체 가능하지만, Interceptor는 요청/응답의 흐름을 다루는 반면 AOP는 메서드 호출 자체에 초점을 맞춘다.
Filter 대신 AOP를 사용해도 될까?
- 가능 여부: 부분적으로 가능하지만, 둘은 설계 철학과 적용 대상이 다르다.
- 설명:
- Filter는 HTTP 요청/응답 흐름을 가로채서 처리하는 데 특화되어 있다.
- 예: 인증, 인가, 로깅, 응답 헤더 설정 등.
- AOP는 메서드 호출 전후나 클래스 레벨에서 공통 로직을 처리한다.
- 예: 트랜잭션 관리, 메서드 실행 로깅, 예외 처리 등.
- Filter는 HTTP 요청/응답 흐름을 가로채서 처리하는 데 특화되어 있다.
- 대채 가능성:
- 가능한 경우:
- Filter에서 하는 작업이 주로 특정 컨트롤러 메서드나 서비스 로직과 관련된 경우, AOP로 대체할 수 있다.
- 예: 특정 엔트포인트에 대한 로깅을 메서드 실행 시점에 처리.
- Filter에서 하는 작업이 주로 특정 컨트롤러 메서드나 서비스 로직과 관련된 경우, AOP로 대체할 수 있다.
- 불가능한 경우:
- AOP는 HTTP 요청 자체를 직접 다룰 수 없다. 요청 객체(HttpServletRequest) 나 응답 객체(HttpServletResponse)를 다뤄야 하는 작업은 Filter가 필요하다.
- 가능한 경우:
AOP 대신 Filter를 사용해도 될까?
- 가능 여부: 불가능하거나 비효율적인 경우가 많다.
- 설명:
- AOP는 메서드 수준에서 동작하며, 특정 클래스나 메서드에 대한 세밀한 동작이 가능하다.
- Filter는 HTTP 요청/응답에만 적용되므로, 특정 메서드의 호출 전후를 다루는 데 적합하지 않다.
- AOP는 메서드 수준에서 동작하며, 특정 클래스나 메서드에 대한 세밀한 동작이 가능하다.
- 대체 가능성:
- 불가능한 경우:
- 메서드 실행 전후에만 적용해야 하는 트랜잭션 관리, 메서드 호출 전후 로깅 등은 Filter로 대체할 수 없다.
- 가능한 경우:
- AOP로 구현하려던 작업이 전적으로 HTTP 요청/응답의 전처리/후처리라면 Filter로도 구현한 수 있다.
- 불가능한 경우:
Interceptor 대신 Filter나 AOP를 사용해도 될까?
- 가능 여부: 부분적으로 가능, 하지만 Interceptor의 특징에 따라 달라진다.
- 설명:
- Interceptor는 Spring MVC에서 요청/응답 흐름 중 컨트롤러 전후에서 동작한다.
- Filter는 Interceptor처럼 HTTP 요청/응답을 다룰 수 있지만, Spring MVC와 밀접하게 연동되는 Interceptor의 기능은 완벽히 대체하지 못한다.
- AOP는 메서드 호출 시점에서 동작하므로, 요청 자체보다는 컨트롤러 내부 로직을 다루는 데 적합하다.
- 대체 가능성
- Filter로 대체 가능한 경우:
- 모든 요청에 대해 동일한 전처리/후처리가 필요할때 (예: CORS 설정, 인증/인가).
- AOP로 대체 가능한 경우:
- 특정 컨트롤러 메서드의 실행 전후에만 로직을 적용해야 할 때.
- 대체 불가능한 경우:
- Interceptor는 Spring MVC의 Handler와 View 처리 단계에 개입할 수 있다. 이런 동작은 Filter나 AOP로 대체하기 어렵다.
- Filter로 대체 가능한 경우:
일단 개념적인부분을 정리해보았다!
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
반응형
'public void static main > Java' 카테고리의 다른 글
[Spring Security] JWT(Json Web Token) (1) | 2025.01.13 |
---|---|
[Spring Security] Spring Security에 대해서 알아보자! (0) | 2025.01.13 |
[JAVA] 불변객체, 가변객 뭔지는 알겠는데 자세히 좀 더 알아보자 (1) | 2024.12.25 |
[JAVA] LinkedList 알꺼같으면서도 모르겠다. (0) | 2024.12.23 |
[JAVA] 타입 캐스팅 시 발생하는 오버플로우? (0) | 2024.12.22 |
댓글