농담곰담곰이의곰담농

[Spring Boot] Interceptor 프로젝트에 적용해보았다.

by 브이담곰

간단한 프로젝트에서, CRUD를 구현하다가 작업을 수행할 때마다 업데이트 된 리스트를 보여주어야 하므로, 전체 List를 불러오는 코드가 메서드들에 중복되서 작성되어있다는 것을 알았다.

 

수업시간에 배운 Interceptor을 이용해서 코드를 깔끔하게 정리할 수 있다고 생각해서, 활용해보기로 했다.

 

Spring Interceptor란?

Spring 프레임워크에서 제공하는 기능 중 하나로, 클라이언트의 요청을 가로채서 처리하는 역할을 한다. 이를 통해 공통적인 로직(로깅, 성능 측정, 캐싱)을 처리하거나, 보안(인증, 권한)등의 목적으로 조건을 검사하고 해당 요청을 처리하거나, 무시할 수 있다.

특정 요청 URL에만 적용되도록 매핑할 수 있다는 점이 필터와 유사하지만, 필터와 다르게 Interceptor는 스프링 웹 애플리케이션 컨텍스트에 구성하기 때문에 컨테이너의 기능을 자유롭게 활용할 수 있으며 그 내부에 선언된 모든 빈을 참조할 수 있다.

 

Interceptor을 사용하기 위해 아래와 같은 과정으로 하였다.

1. WebConfig 클래스 생성

Interceptor를 사용하려면 WebMvcConfigurer 인터페이스를 구현하는 설정 클래스를 만들고 addInterceptors() 메소드를 오버라이드해서 등록해야한다. 중요한 점은 등록 순서에 따라 Interceptor가 실행되는 순서를 결정한다는 것이다.

@Configuration // 빈(bean)정의 클래스
public class WebConfig implements WebMvcConfigurer {

    @Autowired // 스프링 컨테이너에 등록된 빈(Bean) 중에서 해당 타입과 일치하는 객체를 찾아서 자동으로 주입
    CategoryListInterceptor categoryListInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(categoryListInterceptor)
                .addPathPatterns("/category/**")
                .excludePathPatterns(
                        "/images/**",
                        "/js/**",
                        "/error"
                );
    }
}

 

2. Interceptor 생성

HandlerInterceptor 클래스의 구현체를 생성하고 Component로 빈을 등록한다.

postHandler 메소드를 오버라이드해서 구현을 시작한다.

 

@Component
public class CategoryListInterceptor implements HandlerInterceptor {

    @Autowired
    CategoryService categoryService; // 의존성 주입

    // 메서드가 실행되기 전에 전체 리스트를 업로드 해야하므로 postHandler을 override 한다.
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        // 카테고리 관련 뷰로 이동할 때만 가로챈다.
        if(modelAndView != null &&
                modelAndView.getViewName() != null &&
                modelAndView.getViewName().equals("category/list")){

            // Category List 조회
            List<CategoryDTO> categoryList = categoryService.findAllCategory();
            modelAndView.addObject("categoryList", categoryList);
        }

    }
}

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기