Java

[Java] Interceptor(인터셉터)란?

고즈너키 2023. 6. 8. 16:18

Intro

자바에서 인터셉터는 애플리케이션의 요청과 응답을 가로채고 처리하는 기능을 제공하는 인터페이스입니다. 

조금 더 풀어 설명 드리면, 클라이언트로부터 요청이 Controller에 전달되기 전, 혹은 Controller에서 응답이 클라이언트로 전달되기전 중간 단계라고 생각하시면 될 것 같습니다.

일반적으로 웹 애플리케이션에서 인터셉터는 HTTP 요청과 응답을 가로채서 로깅, 인증, 권한 부여 등과 같은 공통 작업을 수행하는 데 사용됩니다. 아래에 간단한 예제를 통해 소개해 드리겠습니다.

Interceptor 기본 개념 예시

1. 인터셉터 인터페이스 생성

public interface MyInterceptor {
    void preHandle();
    void postHandle();
    void afterCompletion();
}

MyInterceptor 인터페이스는 preHandle(), postHandle(), afterCompletion() 세 가지 메서드를 정의하고 있습니다. 

2. 인터셉터 구현

public class MyInterceptorImpl implements MyInterceptor {
    @Override
    public void preHandle() {
        System.out.println("인터셉터: preHandle 메서드 호출");
        // 요청 전처리 작업 수행
    }
    
    @Override
    public void postHandle() {
        System.out.println("인터셉터: postHandle 메서드 호출");
        // 요청 후처리 작업 수행
    }
    
    @Override
    public void afterCompletion() {
        System.out.println("인터셉터: afterCompletion 메서드 호출");
        // 응답 완료 후 작업 수행
    }
}

MyInterceptorImpl 클래스는 이 인터페이스를 구현하여 각 메서드를 구체적으로 구현합니다.

3. 인터셉터를 사용하는 클래스 생성

public class UserController {
    private MyInterceptor interceptor;
    
    public UserController(MyInterceptor interceptor) {
        this.interceptor = interceptor;
    }
    
    public void handleRequest() {
        interceptor.preHandle();
        // 요청 처리 작업 수행
        interceptor.postHandle();
        interceptor.afterCompletion();
    }
}

UserController 클래스는 생성자를 통해 인터셉터를 주입받고, handleRequest() 메서드에서 인터셉터의 메서드를 호출하여 요청 처리 전후의 작업을 수행합니다.

4. 실행 클래스에서 인터셉터를 생성하여 사용

public class Main {
    public static void main(String[] args) {
        MyInterceptor interceptor = new MyInterceptorImpl();
        UserController controller = new UserController(interceptor);
        controller.handleRequest();
    }
}

 

Main 클래스에서는 인터셉터 객체를 생성하여 컨트롤러에 주입하고 handleRequest() 메서드를 호출합니다.

 

Spring 프레임워크에서의 인터셉터 예시

1. 인터셉터 구현

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

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("인터셉터: preHandle 메서드 호출");
        // 요청 전처리 작업 수행
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("인터셉터: postHandle 메서드 호출");
        // 요청 후처리 작업 수행
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        System.out.println("인터셉터: afterCompletion 메서드 호출");
        // 응답 완료 후 작업 수행
    }
}

MyInterceptor 클래스는 HandlerInterceptor 인터페이스를 구현합니다. preHandle() 메서드는 요청 전에 호출되며, postHandle() 메서드는 요청 처리 후에 호출되고 afterCompletion() 메서드는 응답 완료 후 호출됩니다. 각 메서드에서 원하는 작업을 수행할 수 있습니다.

2. 인터셉터 등록

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

public class MyInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

MyInterceptorConfig 클래스는 WebMvcConfigurer 인터페이스를 구현하여 addInterceptors() 메서드를 재정의합니다. 이 메서드에서 인터셉터를 등록합니다.

3. Spring 구성 파일에 인터셉터 설정 추가

<mvc:interceptors>
    <bean class="com.example.MyInterceptorConfig" />
</mvc:interceptors>

마지막으로, Spring 구성 파일(XML 파일)에 인터셉터 설정을 추가합니다. <mvc:interceptors> 요소 안에 MyInterceptorConfig 클래스를 빈으로 등록합니다.

 

주 사용 용도

  • 인증과 권한 부여: 인터셉터를 사용하여 요청의 인증과 권한 부여를 처리할 수 있습니다. 예를 들어, 사용자의 로그인 상태를 확인하거나 특정 사용자의 권한을 확인하여 접근 제어를 할 수 있습니다.

  • 로깅: 인터셉터를 사용하여 요청과 응답에 대한 로그를 기록할 수 있습니다. 이를 통해 애플리케이션의 동작을 추적하고 디버깅에 도움을 줄 수 있습니다.

  • 캐싱: 인터셉터를 사용하여 요청의 결과를 캐싱하여 성능을 향상시킬 수 있습니다. 예를 들어, 동일한 요청에 대한 결과를 캐시에서 반환하여 서버 부하를 줄일 수 있습니다.

  • 예외 처리: 인터셉터를 사용하여 예외 처리를 수행할 수 있습니다. 예외가 발생했을 때 특정한 처리를 하거나 예외를 변환하여 클라이언트에게 적절한 응답을 전달할 수 있습니다.

  • 요청 및 응답 변환: 인터셉터를 사용하여 요청이나 응답을 변환할 수 있습니다. 예를 들어, 요청 데이터의 형식을 변경하거나 응답 데이터를 가공하여 클라이언트에게 전달할 수 있습니다.

  • 성능 모니터링: 인터셉터를 사용하여 애플리케이션의 성능을 모니터링할 수 있습니다. 요청의 처리 시간을 측정하거나 특정 작업에 대한 통계 정보를 수집할 수 있습니다.
인터셉터는 애플리케이션의 여러 계층에서 사용될 수 있으며, 공통적인 작업을 처리하는 데 유용합니다. 예를 들어, 웹 애플리케이션에서는 인터셉터를 사용하여 인증, 로깅, 캐싱 등과 같은 공통 작업을 중앙에서 처리할 수 있습니다. 이렇게 함으로써 코드 중복을 줄이고 유지 보수성을 향상시킬 수 있습니다.