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

oyeon·2021년 3월 15일
0

Spring MVC에서 Session을 이용한 상태유지에서 이어짐

실습

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{
	// Controller의 메서드가 실행된 후에 실행
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(handler.toString() + " 가 종료되었습니다.  " + modelAndView.getViewName() + "을 view로 사용합니다.");
	}

	// Controller의 메서드가 실행되기 전에 실행
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(handler.toString() + " 를 호출했습니다.");
		return true;
	}
}

WebMvcContextConfiguration.java

  • addInterceptors 메서드 추가
  • 인자로 넘어온 InterceptorRegistry의 addInterceptor에 앞에서 만든 인터셉터 객체를 추가한다.
package kr.or.connect.guestbook.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import kr.or.connect.guestbook.interceptor.LogInterceptor;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "kr.or.connect.guestbook.controller" })
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter{

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
        registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
        registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
    }
 
    // default servlet handler를 사용하게 합니다.
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
   
    @Override
    public void addViewControllers(final ViewControllerRegistry registry) {
    	System.out.println("addViewControllers가 호출됩니다. ");
        registry.addViewController("/").setViewName("index");
    }
    
    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry){
    	registry.addInterceptor(new LogInterceptor());
    }
}

결과

실행 결과

@Override
public void addViewControllers(final ViewControllerRegistry registry) {
	System.out.println("addViewControllers가 호출됩니다. ");
        registry.addViewController("/").setViewName("index");
}

위 코드 부분에 의해 index를 view로 사용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
	response.sendRedirect("list");
%>

위 index.jsp 부분에서 list로 redirect를 하기 때문에 GuestbookController에서 list를 path로 GetMapping하는 list 메서드 실행.

@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
		ModelMap model,
		@CookieValue(value="count", defaultValue="0", required=true) String value,
		HttpServletResponse response
		){
	try{
		int i = Integer.parseInt(value);
		value = Integer.toString(++i);
	}catch(Exception ex){
		value = "1";
	}
		
	Cookie cookie = new Cookie("count", value);
	cookie.setMaxAge(60 * 60 * 24 * 365); // 1년간 유지
	cookie.setPath("/"); // /경로 이하에 모두 쿠키 적용
	response.addCookie(cookie);
		
	// start로 시작하는 방명록 목록 구하기
	List<Guestbook> list = guestbookService.getGuestbooks(start);
		
	// 전체 페이지 수 구하기
	int count = guestbookService.getCount();
	int pageCount = count / GuestbookService.LIMIT;
	if(count % GuestbookService.LIMIT > 0)
		pageCount++;
		
	// 페이지 수 만큼 start의 값을 리스트로 저장
	// ex. 페이지 수가 3이면 0, 5, 10 이 저장
	// list?start=0, list?start=5, list?start=10 으로 링크 걸림
	List<Integer> pageStartList = new ArrayList<>();
	for(int i = 0; i < pageCount; i++){
		pageStartList.add(i * GuestbookService.LIMIT);
	}
	model.addAttribute("list", list);
	model.addAttribute("count", count);
	model.addAttribute("pageStartList", pageStartList);
	model.addAttribute("cookieCount", value);
		
	return "list";
}

메서스가 실행된 후 종료 메시지와 list을 view로 사용한다는 메시지를 출력.(화면에서 방명록을 보여줌)

새로운 방명록 작성 후 결과

@PostMapping(path="/write")
public String write(@ModelAttribute Guestbook guestbook,
			HttpServletRequest request){
	String clientIp = request.getRemoteAddr();
	System.out.println("clientIp:" + clientIp);
	guestbookService.addGuestbook(guestbook, clientIp);
	return "redirect:list";
}

새로운 방명록 작성시 위의 메서드가 실행. 글 작성후 종료 메시지와 함께 redirect:list를 view로 사용한다는 메시지를 출력.
이후 다시 list 메서드를 호출하고 list를 view로 사용한다는 메시지와 함께 종료

profile
Enjoy to study

0개의 댓글