💻 백엔드

🔍 Spring Filter, Interceptor, AOP - 언제 뭘 써야 할까?

twoweekhee 2025. 6. 14. 23:16

Spring 개발을 하다 보면 공통 기능을 처리해야 하는 상황이 자주 생깁니다. 로그인 체크, 로깅, 인코딩 처리 등 말이죠. 이때 Filter, Interceptor, AOP 중 무엇을 선택해야 할지 고민되지 않나요? 🤔

오늘은 이 세 가지 기술의 차이점과 언제 어떤 것을 사용해야 하는지 알아보겠습니다!

📚 목차

  1. 각 기술의 역할과 특징
  2. 실행 순서와 동작 위치
  3. Spring Container vs Spring MVC
  4. 실제 사용 예시
  5. 언제 뭘 써야 할까?

🎯 각 기술의 역할과 특징

🛡️ 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 #웹개발 #자바 #백엔드 #공통기능 #횡단관심사