[스프링부트]필터, 인터셉터, AOP

송송승현's avatar
Nov 27, 2024
[스프링부트]필터, 인터셉터, AOP

필터

💡
Servlet 기반 애플리케이션에서 http 요청과 응답을 가로채서 특정 작업을 수행하는데 사용
웹 애플리케이션에 요청이 들어오기 전 또는 응답이 나가기 전에 처리
FilterChain을 통해 다음 필터 혹은 서블릿으로 요청을 전달
보통 URL을 대상으로 함

예제

import java.io.IOException; public class AuthenticationFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse resp = (HttpServletResponse) servletResponse; HttpSession session = req.getSession(); User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { resp.sendRedirect("/login-form"); }else { filterChain.doFilter(servletRequest, servletResponse); } } } import com.metacoding.authblog._core.filter.AuthenticationFilter; import com.metacoding.authblog._core.filter.MerongFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean // 빈으로 등록하면 리턴값이 IoC 등록 public FilterRegistrationBean addAuthFilter() { FilterRegistrationBean rg = new FilterRegistrationBean(); rg.setFilter(new AuthenticationFilter()); // 필터를 등록 rg.addUrlPatterns("/board/*"); // 필터를 실행할 uri 패턴 rg.addUrlPatterns("/user/*"); rg.setOrder(1); // filter의 실행 순서 return rg; } }
 

인터셉터

💡
Spring MVC에서 제공하는 기능으로, Http 요청을 컨트롤러에 전달히가 전과 후에 특정 작업을 수행
DispatcherServlet과 Controller 사이에서 동작
필터보다 Spring 컨텍스트에 가까운 레벨에서 동작
보통 Controller 및 handler를 대상으로 함

예제

public class LoggingInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("Before handling request: " + request.getRequestURI()); return true; // true면 다음 단계 진행 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("After handling request: " + request.getRequestURI()); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("Request completed"); } } @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**"); } }

AOP

💡
특정 공텅 기능을 애플리케이션의 핵심 비즈니스 로직과 분리해 모듈화 한 것
메서드 호출 전/후, 예외 발생 시점 등에 특정 작업을 수행
주로 공통 관심사를 처리
프록시 기반
대상 코드에 변경을 가하지 않고 동작
보통 메서드 및 클래스를 대상으로 함

예제

@Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @After("execution(* com.example.service.*.*(..))") public void logAfter(JoinPoint joinPoint) { System.out.println("After method: " + joinPoint.getSignature().getName()); } }
 
Share article

송승현의 블로그