기술면접 준비
AOP, Interceptor, Filter 의 차이점, Request가 들어올때 거치는 순서, 각 역할들의 장점을 설명해주실 수 있을까요?
Albosa2lol
2024. 8. 27. 21:58
AOP, Interceptor, Filter의 차이점 및 실행 순서
Spring 기반 웹 애플리케이션에서 요청(Request)이 들어올 때 거치는 순서와 역할은 다음과 같습니다.
1. 개념 및 차이점
구분 | Filter | Interceptor | AOP |
위치 | 서블릿(Servlet) 실행 전후 | 컨트롤러(Controller) 실행 전후 | 모든 메서드(비즈니스 로직 포함) 실행 전후 |
적용 대상 | HTTP 요청(Request), 응답(Response) | Spring MVC 컨트롤러 | 서비스(Service) 및 비즈니스 로직 |
사용 목적 | 인증, 보안, CORS, 로깅, 캐싱 | 인증, 로깅, 사전/사후 처리 | 트랜잭션, 로깅, 예외 처리, 공통 기능 적용 |
주요 인터페이스 | javax.servlet.Filter | HandlerInterceptor | @Aspect, @Around, @Before, @After |
접근 가능 범위 | 요청/응답 객체 | 컨트롤러 실행 전후 | 모든 메서드 실행 전후 |
2. 요청(Request)이 들어올 때 거치는 순서
클라이언트 요청 → Filter → Interceptor → Controller → Service → Repository → DB ↓ (AOP 적용)
상세 순서
- Filter (필터)
- DispatcherServlet 이전 단계에서 실행됨
- 요청/응답을 조작할 수 있음 (예: CORS 설정, 인증, 로깅)
- 여러 개의 필터가 존재할 경우 FilterChain을 통해 순차적으로 실행됨
- Interceptor (인터셉터)
- DispatcherServlet 이후, Controller 실행 전후에 동작
- 요청을 가로채고, 컨트롤러 접근 전/후에 추가적인 로직을 실행 가능
- preHandle(), postHandle(), afterCompletion() 메서드 제공
- AOP (관점 지향 프로그래밍)
- 서비스(Service) 계층의 메서드 실행 전후에 특정 로직을 추가하는 데 사용됨
- @Aspect, @Before, @After, @Around 등을 활용해 트랜잭션, 로깅 등을 수행
3. Filter, Interceptor, AOP의 역할과 장점
(1) Filter (필터)
✅ 역할
- HTTP 요청 및 응답을 변경할 수 있음
- 보안 및 인증 처리 (ex: JWT 토큰 검증)
- 로깅, GZIP 압축, 캐시 처리
- CORS (Cross-Origin Resource Sharing) 설정 가능
✅ 장점
- 요청이 컨트롤러에 도달하기 전 선처리 가능
- 서블릿 단에서 한 번만 처리되므로 성능 최적화 가능
📌 예제
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter 실행");
chain.doFilter(request, response); // 다음 필터 or 컨트롤러로 이동
}
}
(2) Interceptor (인터셉터)
✅ 역할
- 컨트롤러 실행 전후로 추가 작업을 수행
- 사용자 인증 및 권한 검증
- API 로깅 및 요청 데이터 검증
✅ 장점
- Spring MVC 컨트롤러에서만 동작하여, 특정 URL 요청에만 적용 가능
- preHandle()에서 요청을 차단하거나 변경 가능
📌 예제
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Interceptor 실행");
return true; // true: 계속 진행, false: 요청 차단
}
}
(3) AOP (Aspect-Oriented Programming)
✅ 역할
- 서비스(Service) 계층에서 반복적으로 사용되는 기능(로깅, 트랜잭션 등)을 추상화하여 적용
- 비즈니스 로직과 공통 기능을 분리하여 코드의 재사용성을 높임
✅ 장점
- 특정 메서드의 실행 전후로 일관된 처리가 가능
- 트랜잭션 관리, 로깅, 예외 처리 등에 활용 가능
📌 예제
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethodExecution(JoinPoint joinPoint) {
System.out.println("AOP Before 실행: " + joinPoint.getSignature());
}
}
📌 정리
구분 | Filter | Interceptor | AOP |
적용 위치 | 서블릿(DispatcherServlet 이전) | 컨트롤러(DispatcherServlet 이후) | 서비스, 비즈니스 로직 전체 |
주요 목적 | 요청/응답 필터링, 보안 | 컨트롤러 실행 전후 처리 | 공통 기능 적용(트랜잭션, 로깅) |
실행 순서 | 가장 먼저 실행 | 컨트롤러 직전 실행 | 서비스/비즈니스 계층에서 실행 |
사용 예제 | 인증/보안, CORS, 로깅 | 인증/권한 체크 | 트랜잭션, 로깅, 예외 처리 |
💡 요청이 들어오면 실행 순서:
Filter → Interceptor → AOP → Controller → Service → Repository → DB
✅ 언제 사용해야 할까?
- Filter → 요청을 미리 가로채고, 인증/보안, 로깅, 응답 데이터 가공이 필요할 때
- Interceptor → 컨트롤러의 실행을 제어하거나, 요청/응답을 로깅하고 싶을 때
- AOP → 트랜잭션, 로깅, 성능 모니터링 등 특정 메서드 실행 전후로 공통 작업이 필요할 때
즉, Filter는 서블릿 단에서 전역적으로 요청을 관리, Interceptor는 컨트롤러 요청을 제어, AOP는 비즈니스 로직을 대상으로 공통 기능을 적용하는 역할을 합니다. 🚀