개발천재

[Spring Boot] Intercepter와 HandlerInterceptor 본문

개발 준비/Spring Boot

[Spring Boot] Intercepter와 HandlerInterceptor

세리블리 2025. 2. 18. 23:40
반응형

Intercepter 이해하기

Interceptor(인터셉터)는 요청과 응답 사이에 끼어서 추가적인 작업을 수행하는 도구이다. 쉽게 말해서, "도와주는 역할"을 하는 사람과 비슷하다.

인터셉터는 마치 문을 통과하려는 사람을 체크하는 경비원과 같다. 사람들이 문을 통과할 때, 경비원이 들어가기 전에(요청 처리 전에) 확인하거나, 들어온 후(요청 처리 후) 필요한 일을 한다. 예를 들면 사용자가 웹사이트에 요청을 보내려고 할 때, 경비원이 이 사람이 로그인 했는지, 특정 권한이 있는지 확인할 수 있다. 또는 요청을 처리한 후에는 경비원이 무사히 문을 통과한 후, 문을 닫고 나서 체크할 수도 있다.

 

Interceptor의  역할

요청 처리 전

클라이언트(사용자)가 요청을 보낼 때, 예를 들어 로그인 상태 체크, 권한 체크, 사용자의 입력값 검증을 먼저 할 수 있다.


요청 처리 후

서버가 요청을 처리한 후에, 예를 들어 응답을 수정하거나 추가적인 작업(로그 기록, 응답 헤더 추가)을 할 수 있다.

 

 


 

 

HandlerInterceptor 이해하기

HandlerInterceptor는 스프링에서 HTTP 요청을 처리하기 전에, 처리 중에, 또는 처리 후에 특정 작업을 실행할 수 있게 해주는 인터셉터이다. 쉽게 말해, 요청과 응답 사이에 끼어서 추가적인 작업을 할 수 있는 도구이다.

HandlerInterceptor는 마치 문을 통과하는 사람을 체크하는 경비원과 비슷하다고 할 수 있다. 요청이 오면, 경비원이 그 사람이 들어갈 수 있는지 확인합니다. 경비원은 들어가기 전(요청 처리 전)이나 들어온 후(요청 처리 후) 특정 작업을 할 수 있다. 예를 들어, 경비원이 들어가기 전에 신분증을 확인하거나, 들어온 후에는 문을 닫거나 로그를 남길 수 있다.

 

 

HandlerInterceptor의 역할

요청 처리 전

요청이 실제로 처리되기 전에, 예를 들어 로그인 여부를 체크하거나 권한을 확인할 수 있다.


요청 처리 후

요청이 처리된 후에, 응답을 수정하거나 추가 작업을 할 수 있다.

 

응답 전 후 작업

요청을 처리하고 나서 응답을 보내기 전에, 예를 들어 로그를 찍거나, 응답 헤더를 추가하는 작업을 할 수 있다.

 

 

HandlerInterceptor 주요 메서드

preHandle()

컨트롤러로 요청이 전달되기 직전에 호출.
로그인 체크, 인증 처리 등에 사용.


postHandle()

컨트롤러 메서드 실행이 끝나고 뷰가 렌더링되기 전에 호출.
요청 처리 후 데이터 가공, 공통 데이터 설정 등.

 

afterCompletion()

뷰 렌더링이 완료된 후, 요청 처리의 마지막 단계에서 호출.
리소스 해제, 로그 출력 등.

 

 

HandlerIntercepter 사용 예시

1. 인터셉터 설정
HandlerInterceptor를 사용하려면, 먼저 인터셉터 클래스를 만들어야 한다. Spring 프로젝트에서 HandlerInterceptor는 주로 config 패키지나 interceptor 패키지에 생성한다.

 

interceptor 패키지를 만들어 그 안에 LoginInterceptor, AuthInterceptor 등 인터셉터 관련 클래스를 모아두는 것이 일반적이고, config 패키지에는 WebConfig처럼 설정 클래스를 두어 인터셉터, CORS 설정, 메시지 컨버터 등을 관리한다.

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    // 요청 처리 전
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("요청이 들어오기 전에 처리할 작업");
        // true를 반환하면 요청을 계속 처리, false를 반환하면 요청 처리를 멈춤
        return true;
    }

    // 요청 처리 후
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("요청 처리 후에 처리할 작업");
    }

    // 뷰가 렌더링된 후
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("응답이 완료된 후에 처리할 작업");
    }
}



2. 인터셉터 등록
이제 위에서 만든 MyInterceptor를 스프링 설정에 등록한다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 인터셉터 등록
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")  // 모든 경로에 대해 인터셉터를 적용
                .excludePathPatterns("/login"); // 특정 경로는 제외
    }
}

 

 

 

HandlerInterceptor는어디에 활용할 수 있을까?

  • 로그인 체크: 사용자가 로그인하지 않았다면, 요청을 처리하기 전에 로그인 페이지로 리다이렉트
  • 권한 검사: 특정 페이지에 대한 접근 권한이 있는지 확인
  • 로그 기록: 요청이 들어올 때마다 로그를 찍어 요청의 흐름을 추적
  • 성능 측정: 요청 처리 시간을 측정하고 성능을 모니터링
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 로그인 여부 확인
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            response.sendRedirect("/login");  // 로그인하지 않았다면 로그인 페이지로 리다이렉트
            return false;  // 요청을 계속 처리하지 않도록 false 반환
        }
        return true;  // 로그인된 사용자라면 계속 요청 처리
    }
}


이처럼 HandlerInterceptor를 사용하면, 요청을 처리하는 흐름을 제어하고, 중복되는 작업을 한 곳에서 처리할 수 있어 코드가 깔끔하고 유지보수가 용이해진다.

반응형