23.02.20

이동욱·2023년 8월 6일
0

NaverCloudCamp

목록 보기
28/42

학습내용

  1. Spring Web Controller 사용법
  2. default method
  3. interceptor

Spring Web Controller

기초 코드를 생각하면서 사용하기

  1. @RequestParam
public String testView03(@RequestParam("abc") int no, @RequestParam("def") String name) {
		System.out.println("no : " + no + "======= name : " + name);
		return "/test/testView.jsp";
	}

기존코드

	String str = request.getParameter("abc");
	int no = Integer.parseInt(str);
	
	String def = request.getParameter("def");
public String testView04(@RequestParam("abc") int no, @RequestParam(value = "def", required = false) String name) {
		System.out.println("no : " + no + "======= name : " + name);
		return "/test/testView.jsp";
	}
  1. @ModelAttribute
public ModelAndView logon05(@ModelAttribute("user") User user) {		
		ModelAndView mv = new ModelAndView();
		mv.setViewName("/user/logonResult.jsp");		
		return mv;
	}

생략된 코드(request로 부터 데이터를 가져오고 binding까지 처리한 뒤 requestScope에 넣어준다)

	User user = new User();
	user.setUserName(request.getParameter("userName"));
	
	request.setAttribute("user", user);

default method

interface를 implements시 interface에 명시된 method들중 일부만 구현하고 싶을 때 default method를 사용한다.(java8 이후로 추가 된 기능)
interface method에 구현 내용을 적용 시킬 수 있다.

아래는 SpringFramework에서 제공하는 HandlerInterceptor이다.
HandlerInterceptor는 default default method로 preHandler(), postHandle(), afterCompletion()를 제공하며 이를 구현하는
하위 class들은 위 method를 전부 구현하지 않아도 된다.

public interface HandlerInterceptor {
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}
}

Interceptor

경우에 따라서 Controller를 실행시키고싶은 경우와 실행시키고싶지 않은 경우가 존재한다.
Interceptor는 HandlerMapping에서 Controller를 호출하기 전에 Interceptor의 조건에 맞지 않으면 Controller를 호출하지 않는다.
SpringFramework는 HandlerInterceptorAdapter를 통해 해당 기능을 제공하며
Controller 호출전에 실행되는 preHandle(), Controller 호출 후 실행되는 postHandle(), view 생성 후 실행되는 afterCompletion()을 제공한다.

session에 user정보의 유무를 확인하는 Interceptor

public class LogonCheckInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("[LogonCheckInterceptor] init");
		HttpSession session = request.getSession(true);
		
		if(session.isNew() || session.getAttribute("user") == null) {
			session.setAttribute("user", new User());
		}
		
		User sessionUser = (User) session.getAttribute("user");
		if(sessionUser.isActive()) {
			String uri = request.getRequestURI();
			
			if(uri.indexOf("logonAction") != -1 || uri.indexOf("logon") != -1) {
				RequestDispatcher dispatcher =  request.getRequestDispatcher("/user002/home.jsp");
				
				dispatcher.forward(request, response);
				System.out.println("[LogonCheckInterceptor] end");
				return false;
			}
			
			System.out.println("[로그인 상태]");
			System.out.println("[LogonCheckInterceptor] end");
			return true;
		}else {
			String uri = request.getRequestURI();
			
			System.out.println("LogonCheckInterceptor uri = " + uri);
			if(uri.indexOf("logonAction") != -1 || uri.indexOf("logon") != -1) {
				System.out.println("[로그인 시도 상태]");
				System.out.println("[LogonCheckInterceptor] end");
				return true;
			}
			RequestDispatcher dispatcher =  request.getRequestDispatcher("/user002/logon.jsp");
			
			dispatcher.forward(request, response);
			System.out.println("[LogonCheckInterceptor] end");
			return false;
		}
	}
}

Interceptor 역시 bean이기에 xml에 등록하는 작업과 HandlerMapping에 해당 Interceptor를 wiring하는 작업이 필요하다

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
		<property name="order" value = "0"/>
		<property name="interceptors" ref="logonCheckInterceptor"/>
	</bean>
	
	<bean id="logonCheckInterceptor" class="spring.common.web.LogonCheckInterceptor"/>

Question

Q) model, modelAndView 차이
A) model은 requestScope에 정보를 저장하는 역할까지만 수행하지만 modelAndView는 requestScope에 정보를 저장하고 path 정보를 ViewResolver에 전달하는
역할까지 수행한다.

profile
Backend Developer

0개의 댓글