관리 메뉴

거니의 velog

(9) 인터셉터 사용하기 본문

Java_Spring Boot

(9) 인터셉터 사용하기

Unlimited00 2023. 11. 28. 17:32

* 이전에 구현했던 회원 기능에 이어서 인터셉터를 구현해 보자. 브라우저의 요청명을 인터셉터가 처리한 후 타일즈로 보낼 뷰이름을 가져오는 실습이다.


(1) 인터셉터 구현하기

* 인터셉터 기능은 프로젝트를 생성할 때 라이브러리에서 기본적으로 제공하므로 build.gradle이나 application.properties에는 따로 추가할 내용이 없다.

1. common.interceptor 패키지를 만들고 이전에 실습한 ViewNameInterceptor.java를 복사해 붙여 넣는다.

2. 인터셉트 설정 클래스인 IntercrptorConfig.java를 다음과 같이 구현한다.

package com.myboot03.common.inteceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter { // WebMvcConfigurerAdapter를 상속받는다.
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new ViewNameInterceptor())
				.addPathPatterns("/*.do")
				.addPathPatterns("/*/*.do") // 1단계, 2단계 요청에 대해 모두 인터셉터를 적용한다.
				.excludePathPatterns("/users/login"); // /users/login 요청에 대해서는 인터셉터 요청을 적용하지 않는다.
	}
	
}

3. 이제는 뷰이름을 일일이 지정할 필요 없이 request에서 getAttribute() 메서드로 뷰이름을 가져와 바로 타일즈로 전달한다.

[MemberControllerImpl.java]

package com.myboot03.member.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.myboot03.member.service.MemberService;
import com.myboot03.member.vo.MemberVO;

@Controller("memberController")
public class MemberControllerImpl implements MemberController {
	
	@Autowired
	private MemberService memberService;

	@Autowired
	private MemberVO memberVO;

	@Override
	@RequestMapping(value = "/member/listMembers.do", method = RequestMethod.GET)
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// public String listMembers(HttpServletRequest request, HttpServletResponse
		// response) throws Exception {
		String viewName = (String)request.getAttribute("viewName"); // 인터셉터에서 전달된 뷰이름을 가져온다.
		List membersList = memberService.listMembers();
		ModelAndView mav = new ModelAndView(viewName);
		//ModelAndView mav = new ModelAndView("/member/listMembers"); // 뷰이름을 직접 지정하지 않아도 된다.

		mav.addObject("membersList", membersList);
		return mav;
	}

	@Override
	@RequestMapping(value = "/member/addMember.do", method = RequestMethod.POST)
	public ModelAndView addMember(@ModelAttribute("member") MemberVO member, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		int result = 0;
		result = memberService.addMember(member);
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
		return mav;
	}

	@Override
	@RequestMapping(value = "/member/removeMember.do", method = RequestMethod.GET)
	public ModelAndView removeMember(@RequestParam("id") String id, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		memberService.removeMember(id);
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
		return mav;
	}

	@Override
	@RequestMapping(value = "/member/login.do", method = RequestMethod.POST)
	public ModelAndView login(@ModelAttribute("member") MemberVO member, RedirectAttributes rAttr,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		memberVO = memberService.login(member);
		if (memberVO != null) {
			HttpSession session = request.getSession();
			session.setAttribute("member", memberVO);
			session.setAttribute("isLogOn", true);

			String action = (String) session.getAttribute("action");
			session.removeAttribute("action");
			if (action != null) {
				mav.setViewName("redirect:" + action);
			} else {
				mav.setViewName("redirect:/member/listMembers.do");
			}

		} else {
			rAttr.addAttribute("result", "loginFailed");
			mav.setViewName("redirect:/member/loginForm.do");
		}

		return mav;
	}

	@Override
	@RequestMapping(value = "/member/logout.do", method = RequestMethod.GET)
	public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session = request.getSession();
		session.removeAttribute("member");
		session.setAttribute("isLogOn", false);

		ModelAndView mav = new ModelAndView();
		mav.setViewName("redirect:/member/listMembers.do");
		return mav;
	}

	@RequestMapping(value = "/member/*Form.do", method = RequestMethod.GET)
	private ModelAndView form(@RequestParam(value = "result", required = false) String result,
			@RequestParam(value = "action", required = false) String action, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String viewName = (String) request.getAttribute("viewName");
		HttpSession session = request.getSession();
		session.setAttribute("action", action);

		ModelAndView mav = new ModelAndView();
		mav.addObject("result", result);
		mav.setViewName(viewName);
		return mav;
	}

	@RequestMapping(value = { "/", "/main.do" }, method = RequestMethod.GET)
	private ModelAndView main(HttpServletRequest request, HttpServletResponse response) {
		String viewName = (String) request.getAttribute("viewName");
		ModelAndView mav = new ModelAndView();
		mav.setViewName(viewName);
		return mav;
	}
	
}

4. 프로젝트를 실행하고 다음 주소로 요청하여 결과를 확인한다.

- http://localhost:8090/member/listMembers.do

* 앞에서 배운 기능을 이용해 이전에 만든 게시판 기능은 여러분이 직접 구현해 보기 바란다. 더 나아가 쇼핑몰 기능도 스프링 부트에서 구현해 보기 바란다.


* 지금까지 JSP부터 스프링 부트까지 살펴봤다. 워낙 내용이 방대한 분야라 세부적인 내용을 다루지 못한 면도 있다. 그것은 이 내용을 바탕으로 여러분이 직접 살을 붙여나가길 바란다.