Spring 개발을 하다 보면 공통 기능을 처리해야 하는 상황이 자주 생깁니다. 로그인 체크, 로깅, 인코딩 처리 등 말이죠. 이때 Filter, Interceptor, AOP 중 무엇을 선택해야 할지 고민되지 않나요? 🤔
오늘은 이 세 가지 기술의 차이점과 언제 어떤 것을 사용해야 하는지 알아보겠습니다!
📚 목차
🎯 각 기술의 역할과 특징
🛡️ Filter (필터)
Filter는 웹 애플리케이션의 가장 바깥쪽에서 동작하는 친구입니다.
- 위치: 웹 애플리케이션의 최외곽
- 역할: HTTP 요청/응답을 가로채서 전처리/후처리
- 주요 용도:
- 인코딩 설정 📝
- 로깅 📊
- 기본적인 인증 체크 🔐
- 특징: 서블릿 컨테이너 레벨에서 동작
🎪 Interceptor (인터셉터)
Interceptor는 Spring MVC의 컨트롤러 앞뒤에서 활약합니다.
- 위치: Spring MVC의 컨트롤러 레이어
- 역할: 컨트롤러 실행 전후에 공통 로직 처리
- 주요 용도:
- 로그인 체크 👤
- 권한 검사 🔒
- 실행 시간 측정 ⏱️
- 특징: Spring 컨텍스트 내에서 동작하여 Spring 빈 접근 가능
✨ AOP (Aspect Oriented Programming)
AOP는 가장 유연한 녀석으로, 어떤 메서드든 처리할 수 있어요.
커스텀 어노테이션도 클래스단에 달아서 AOP처럼 작동하게 할 수 있지만 근본적으로 클래스 안의 매소드에 적용되는 것.
- 위치: 메서드 실행 전후 어디든
- 역할: 비즈니스 로직에 횡단 관심사를 적용
- 주요 용도:
- 트랜잭션 처리 💾
- 캐싱 🗃️
- 성능 모니터링 📈
- 특징: 어노테이션이나 포인트컷으로 적용 대상 지정
🔄 실행 순서와 동작 위치
전체적인 요청 처리 흐름은 다음과 같습니다:
HTTP 요청 → Filter → Interceptor → Controller → AOP → Service
각각이 서로 다른 레이어에서 동작하기 때문에, 목적에 맞게 선택해서 사용하면 됩니다! 🎯

🏗️ Spring Container vs Spring MVC
많은 분들이 헷갈려하는 부분인데, 이 둘의 관계를 명확히 해보겠습니다.
Spring Container (스프링 컨테이너)
- Spring 프레임워크의 핵심 기능 💜
- 빈(Bean) 생성, 관리, 의존성 주입(DI) 담당
- @Service, @Repository, @Component 등의 빈들을 관리
- 웹과 상관없이 독립적으로 존재 가능
Spring MVC
- Spring 컨테이너 위에서 동작하는 웹 전용 모듈 🌐
- 웹 요청 처리에 특화된 기능 제공
- @Controller, @RequestMapping 등
- DispatcherServlet이 중심 역할
Interceptor가 Spring 빈을 사용할 수 있는 이유
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService; // Spring Container의 빈 사용 가능!
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// userService를 활용한 로직 구현
return userService.isValidUser(token);
}
}
Interceptor 자체도 Spring 빈이고, Spring MVC가 Spring Container 위에서 동작하기 때문에 다른 빈들을 주입받을 수 있습니다! ✨
💡 실제 사용 예시
Filter 예시 - 인코딩 처리
@Component
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
Interceptor 예시 - 로그인 체크
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
AOP 예시 - 실행 시간 측정
@Aspect
@Component
public class PerformanceAspect {
@Around("@annotation(Timed)")
public Object measureTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed();
long end = System.currentTimeMillis();
System.out.println("실행 시간: " + (end - start) + "ms");
return result;
}
}
🎨 언제 뭘 써야 할까?
Filter를 사용하세요 🛡️
- HTTP 요청/응답의 기본적인 처리가 필요할 때
- 인코딩, CORS, 기본 보안 처리
- Spring과 무관한 서블릿 레벨 처리
Interceptor를 사용하세요 🎪
- 컨트롤러 실행 전후 처리가 필요할 때
- Spring 빈을 활용한 복잡한 로직 처리
- 웹 요청에 특화된 공통 기능
AOP를 사용하세요 ✨
- 특정 메서드나 클래스에 횡단 관심사 적용
- 비즈니스 로직과 분리하고 싶은 기능
- 선언적이고 유연한 적용이 필요할 때
🎉 마무리
Filter, Interceptor, AOP는 각각 다른 레이어에서 동작하는 강력한 도구들입니다. 상황에 맞게 적절히 선택해서 사용하면 깔끔하고 유지보수하기 좋은 코드를 만들 수 있어요! 💪
기억하세요:
- Filter: 웹 요청 단계에서 처리 🌐
- Interceptor: 컨트롤러 단계에서 처리 🎯
- AOP: 어떤 메서드든 처리 ✨
태그: #Spring #Filter #Interceptor #AOP #SpringMVC #웹개발 #자바 #백엔드 #공통기능 #횡단관심사
'💻 백엔드' 카테고리의 다른 글
| @Transactional(readOnly = true) 트랜잭션 전파 테스트 🚀 (0) | 2025.09.21 |
|---|---|
| Python FastAPI에서 로거 설정하기 🚀 (1) | 2025.08.28 |
| 🐬 MySQL Replication 구축하기: Docker로 간단하게 시작하는 데이터베이스 복제 (0) | 2025.06.12 |
| 🔍 JMX와 Datadog을 활용한 Java 애플리케이션 모니터링 가이드 (1) | 2025.06.11 |
| 🔐 Spring Boot로 소셜 로그인 완벽 구현하기 - OAuth2 + JWT 조합의 힘 (2) | 2025.06.10 |