인터셉터 (Interceptor)
- 요청을 처리하기 전과 후에 실행되는 코드
- 컨트롤러에 도달하기 전과 후에 사용자 지정 작업을 수행할 수 있음
- Filter와 매우 유사한 형태
→ 차이점 : Spring Context에 등록되고, Spring Container에서 동작함
(Filter는 WAS에서 동작)
· 필터는 인증 과정에서 로깅 정도로만 사용함
(어떤 데이터가 들어 있는지 등)
- AOP와 유사한 기능 제공
: 선/후 처리함으로써, 비즈니스 로직과 분리시킴
- 용도
· 인증 단계 처리
· 로깅, 인가, 데이터 변환 등의 공통 작업 수행
- 필요에 따라 인터셉터를 여러 개 등록하거나, 특정 경로/패턴에만 적용할 수도 있음
# DispatcherServlet (디스패쳐 서블릿)
- 클라이언트가 어떤 요청을 했을 때, 스프링 컨테이너의 제일 앞에서 요청을 먼저 받아서
적합한 컨트롤러에게 요청을 위임해준느 프론트 컨트롤러
인터셉터 구현 방법
- 예시 코드 : https://young0105.tistory.com/201
1. HandlerInterceptor 인터페이스의 구현 클래스 정의
· Spring Boot MVC에서 제공하는 인터셉터
· AOP 개념과 다르게, 서블릿 필터처럼 동작함
· 클라이언트의 요청이 컨트롤러에 도달하기 전에 인터셉터 요청/응답을 가로채어 필요한 로직을 수행할 수 있음
1) preHandle() 메서드
- 컨트롤러가 실행되기 전에 호출되는 메서드
- 요청을 가로채서 필요한 작업을 수행한 후, 요청 처리가 계속되어야 하는지 여부 결정
· return true; : 요청 처리 계속 (Controller 메서드로 넘어감)
· return false; : 요청 처리 중단 (Controller 메서드로 넘어가지 않음)
- 활용 예시 : 인증 검사
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Component public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 인증 검사 HttpSession session = request.getSession(); User principal = (User) session.getAttribute(Define.PRINCIPAL); if (principal == null) { // 사용자 정의 예외 클래스 활용 throw new UnAuthorizedException("로그인 후 이용해주세요.", HttpStatus.UNAUTHORIZED); } return true; } } | cs |
2) postHandle() 메서드
- 컨트롤러 실행 후 호출되지만, 뷰가 렌더링되기 전에 호출되는 메서드
- 컨트롤러가 요청을 처리한 후에, 필요한 후처리 작업을 수행함
3) afterCompletion() 메서드
- 요청 처리가 완료되고, 뷰가 렌더링된 후에 호출되는 메서드
- 자원 정리, 추가 로깅 등의 작업을 수행함
# 순서 : preHandle() → Controller 메서드 → postHandle() → afterCompletion()
2. WebMvcConfigurer 인터페이스의 구현 클래스 정의 & 1번에서 정의한 클래스 등록
- addInterceptors() 메서드 오버라이드
→ 인터셉터 인스턴스 등록
- 활용 예시
: 인증이 필요한 페이지에 대해서만 인터셉터를 적용함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private AuthInterceptor authInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor) .addPathPatterns("/account/**") .addPathPatterns("/auth/**"); // 다중 path 추가 가능 // 추가 인터셉터 등록 가능 // registry.addInterceptor(new AdminInterceptor()); } } | cs |
'Java > Spring Boot' 카테고리의 다른 글
[Spring Boot] 인터셉터 구현 예시 (0) | 2023.04.13 |
---|---|
[Spring Boot] 세션 (Session) (0) | 2023.04.13 |
[Spring Boot] 필터 (Filter) (0) | 2023.04.12 |
[Spring Boot] JSP 템플릿 엔진 연결하기 (0) | 2023.04.12 |
[Spring Boot] 예외 처리 (exception) (0) | 2023.04.12 |