스프링 인터셉터(Spring Interceptor)는 스프링 프레임워크에서 제공하는 기능으로, 웹 애플리케이션에서 클라이언트 요청을 처리하는 전후에 특정 작업을 수행할 수 있도록 하는 기능입니다. 주로 요청(Request)와 응답(Response) 흐름을 제어하거나, 공통적인 로직을 각 요청마다 실행하고자 할 때 사용됩니다.
스프링 인터셉터의 주요 특징:
- 핸들러의 전처리 및 후처리:
- preHandle(): 컨트롤러의 메서드가 호출되기 전에 실행됩니다. 여기서
true
를 반환하면 요청이 계속 처리되고,false
를 반환하면 요청 처리를 중단할 수 있습니다. 주로 인증, 권한 검사 등에 사용됩니다. - postHandle(): 컨트롤러의 메서드가 호출된 후, 뷰가 렌더링되기 전에 실행됩니다. 컨트롤러에서 반환된 모델과 뷰 객체를 수정할 수 있습니다.
- afterCompletion(): 뷰가 렌더링된 후에 실행됩니다. 주로 리소스 정리 작업이나 로깅 등에 사용됩니다.
- 공통 로직 처리:
- 여러 요청에서 반복적으로 수행되는 공통 로직을 인터셉터에서 처리하여 코드 중복을 줄일 수 있습니다. 예를 들어, 모든 요청에 대해 로깅을 하거나, 특정 헤더가 존재하는지 확인하는 작업 등을 처리할 수 있습니다.
- 컨트롤러와 독립적:
- 스프링 인터셉터는 컨트롤러와 독립적으로 동작하므로, 특정 컨트롤러에 종속되지 않고 전역적으로 작동할 수 있습니다. 이는 공통적인 기능을 여러 컨트롤러에서 재사용할 수 있게 합니다.
1.구현체 만들기
HandlerInterceptor 를 상속받는 구현체 만들기
package shop.mtcoding.blog.core.interceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor; import shop.mtcoding.blog.core.error.ex.Exception401; import shop.mtcoding.blog.user.User; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) { throw new Exception401("인증되지 않았어요"); } return true; // false면 컨트롤러 진입안됨 } }
2.IOC에 띄우기
package shop.mtcoding.blog.core.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import shop.mtcoding.blog.core.interceptor.LoginInterceptor; @Configuration // Ioc에 저장됨 메모리에 띄운다. public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/api/**"); } }
3. 적용
@PostMapping("/api/board/{id}/update") public String update(@PathVariable("id") int id, @Valid BoardRequest.UpdateDTO updateDTO, Errors errors) { User sessionUser = (User) session.getAttribute("sessionUser"); boardService.게시글수정(id, updateDTO, sessionUser); /*boardRepository.updateById(title, content, id);*/ return "redirect:/board/" + id; } @PostMapping("/api/board/{id}/delete") public String delete(@PathVariable("id") int id) { User sessionUser = (User) session.getAttribute("sessionUser"); boardService.게시글삭제(id, sessionUser); return "redirect:/"; }
정리
스프링이 실행되면 InterceptorRegistry여기서 객체가 있는지 체크하고 있으면 이 인스턴스 객체에서 인터셉터를 진행
즉 스프링이 실행 -> Configuration이 있으므로 ioc컨테이너에 빈으로 등록됨 이때 여기 안의 내용들이 초기화 되는데 메소드 안에 InterceptorRegistry registry이게 있는데 이거는 특수하게 스프링이 가지고있는데 객체이므로 자동으로 autowird해줌
registry.addInterceptor(new LoginInterceptor())를 통해서 인스턴스가 만들어짐
그리고 스프링이 실행되는데 InterceptorRegistry 객체가 생성된게 있으니 여기 로직에 따라 /api로 오는 요청은 인터셉터가 가로챔
Share article