티스토리 뷰

2) 인터셉터를 이용해 Controller 공통 로직 처리하기

  • guestbook에다가 인터셉터를 담기 위한  kr.or.connect.guestbook.interceptor 패키지를 만듭니다. 그리고 LogInterceptor.java를 만듭니다. 이 클래스는 HandlerInterceptorAdapter 클래스를 상속받도록 합니다. 그리고 preHandle postHandle이라는 메서드를 오버라이딩합니다.
  • preHandle이라는 메서드는 Controller 메서드가 실행되기 전에 실행이 되고 postHandle 메서드의 내용은 Controller의 메서드가 실행된 후에 실행되게 됩니다.
  • 각각의 메서드에 sysout을 달아 콘솔에 출력할 내용을 입력합니다.

  • 인터셉터를 만들면 해당 인터셉터를 등록합니다. config 패키지의 WebMvcContextConfiguration.java에서 해당 인터셉터를 등록하는데 등록하는 방법은 addInterceptors라고 하는 메서드를 오버라이딩해서 아까 만들어놨던 LogInterceptor 객체를 인자에다가 넣어주면 됩니다.

  • 실행을 해보면 전에 WebMvcContextConfiguration에 정의했던 addViewControllers 메서드가 있습니다. 해당 메서드는 그냥 /로 요청하게 되면 컨트롤러 없이도 지정된 ViewName으로 화면을 보여주라는 메서드입니다. 스프링이 내부적으로 컨트롤러를 설정해서 해당 메서드를 사용합니다.
  • 그래서 인터셉터가 호출되고 메시지가 콘솔에 출력이 됩니다. 해당 부분은 전에 만든 적이 없는 Controller죠. 뭔지는 모르겠지만 어쨌든 해당 객체를 호출을 했다고 합니다그리고 index를 view를 사용한다는 메시지를 볼 수 있습니다.

  • index.jsp는 list로 redirect하도록 작성되어 있습니다. list는 Controller 중에 GuestbookController가 담당합니다. 그래서 GuestbookController list가 호출되면서 메시지가 출력되는 것을 볼 수 있습니다.

실습코드

LogInterceptor.java

package kr.or.connect.guestbook.interceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.ModelAndView;

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

 

public class LogInterceptor extends HandlerInterceptorAdapter{

 

           @Override

           public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

                                  ModelAndView modelAndView) throws Exception {

                      System.out.println(handler.toString() + " 가 종료되었습니다.  " + modelAndView.getViewName() + " view로 사용합니다.");

           }

 

           @Override

           public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

                                  throws Exception {

                      System.out.println(handler.toString() + " 를 호출했습니다.");

                      return true;

           }

 

}

  

생각해보기

  • 인터셉터를 이용해 어떤 일들을 공통처리할 수 있을까요? 인터셉터 사용예를 조사해보세요.

참고 자료

[참고링크] Introduction to Spring MVC HandlerInterceptor
http://www.baeldung.com/spring-mvc-handlerinterceptor

[참고링크] Spring MVC Interceptor HandlerInterceptorAdapter, HandlerInterceptor Example - JournalDev
https://www.journaldev.com/2676/spring-mvc-interceptor-example-handlerinterceptor-handlerinterceptoradapter

 

Comments