[java] Spring Framework의 인터셉터 기능 활용하기

Spring Framework는 웹 애플리케이션 개발을 위한 강력한 기능을 제공하는 프레임워크입니다. 이 중에서도 인터셉터(Interceptor) 기능은 웹 애플리케이션의 요청과 응답을 가로채어 처리하는 데 사용됩니다. 이번 글에서는 Spring Framework에서 인터셉터를 사용하는 방법에 대해 알아보겠습니다.

1. 인터셉터란?

인터셉터는 컨트롤러(Controller)의 앞뒤에서 동작하는 객체입니다. 클라이언트의 요청을 가로채어 원하는 로직을 수행할 수 있으며, 응답을 가로채어 추가적인 처리를 할 수도 있습니다. 인터셉터를 사용하면 공통적인 기능을 한 곳에서 관리할 수 있어 코드의 중복을 줄일 수 있습니다.

2. 인터셉터 구현하기

먼저, 인터셉터를 구현하기 위해서는 HandlerInterceptorAdapter 클래스를 상속받아야 합니다. 아래의 예시 코드를 참고해보세요.

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class CustomInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 요청 전에 수행할 로직 작성
        return true; // 다음 단계로 진행
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 응답 전에 수행할 로직 작성
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 요청이 처리된 후에 수행할 로직 작성
    }
}

위의 코드는 CustomInterceptor라는 클래스를 생성하여 HandlerInterceptorAdapter를 상속받은 것입니다. preHandle, postHandle, afterCompletion 메서드를 오버라이딩하여 필요한 로직을 작성할 수 있습니다.

3. 인터셉터 등록하기

인터셉터를 사용하기 위해서는 해당 인터셉터를 스프링 빈으로 등록해야 합니다. 이를 위해 스프링의 설정 파일에 아래와 같이 등록합니다.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 적용 대상 URL 패턴 -->
        <bean class="com.example.CustomInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

위의 코드는 CustomInterceptor 클래스를 <bean> 태그로 등록한 것입니다. <mvc:mapping> 태그에 적용 대상 URL 패턴을 설정하여 어떤 요청에 인터셉터를 적용할 것인지 지정할 수 있습니다.

4. 인터셉터 사용하기

인터셉터가 등록되면 해당 패턴의 요청이 들어올 때마다 인터셉터의 로직이 실행됩니다. 인터셉터는 주로 요청의 유효성 검사, 권한 체크, 로깅 등의 공통적인 기능을 수행하는 데 사용됩니다.

만약 preHandle 메서드에서 return false를 하게 되면, 해당 요청은 더 이상 컨트롤러로 진행되지 않고 즉시 처리가 완료됩니다.

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String sayHello() {
        // 컨트롤러 로직 작성
        return "hello"; // View 이름 반환
    }
}

위의 예시는 MyController 클래스에 RequestMapping 어노테이션이 적용된 sayHello 메서드가 있는 것입니다. 이 메서드에 해당하는 URL이 요청되면 인터셉터의 로직이 먼저 수행되고, 그 다음에 컨트롤러의 로직이 실행됩니다.

결론

Spring Framework에서 인터셉터를 사용하면 웹 애플리케이션의 공통 기능을 효과적으로 관리할 수 있습니다. 컨트롤러의 앞뒤에서 동작하는 인터셉터를 구현하고 등록함으로써 공통된 작업을 간소화할 수 있습니다. 이를 통해 개발자는 보다 효율적으로 코드를 작성할 수 있으며, 유지 보수 역시 쉬워집니다.