๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/Spring Quick Start

Spring MVC๋ฅผ ์ ์šฉํ•œ ๊ฒŒ์‹œํŒ ๊ฐœ๋ฐœ

Spring Quick Start(์ฑ…)์˜ Day3 class05~07 ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ธฐ๋กํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์‹ค์Šตํ•œ ์ฝ”๋“œ์˜ ๋งํฌ์ž…๋‹ˆ๋‹ค.


1. DispatcherServlet ๋“ฑ๋ก

WEB-INF/web.xml ํŒŒ์ผ์— ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” DispatcherServlet ๋“ฑ๋กํ•˜๊ธฐ

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ".do" ์š”์ฒญ์ด ์žˆ์–ด์•ผ DispatcherServlet ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet<servlet-class>
    <servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

 

2. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๊ตฌ๋™

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์œผ๋กœ DispatcherServlet ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

DispatcherServlet์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ HandlerMapping, Controller, ViewResolver ๊ฐ์ฒด๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ๋™ํ•œ๋‹ค.

 

3. ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ ๋“ฑ๋ก

web.xml์—์„œ servlet-name์ด action์ด๋ผ์„œ DispatcherSevlet์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌ๋™ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด WEB-INF/action-servlet.xml ํŒŒ์ผ์„ ์ฐพ์•„ ๋กœ๋”ฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ WEB-INF ์•„๋ž˜์— action-servlet.xml ์ด๋ฆ„์œผ๋กœ Spring Configuration ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด default์ด๋‹ค.

 

4. Controller ์ธํ„ฐํŽ˜์ด์Šค ์ดํ•ด

์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” Controller ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋Ÿฌํ•˜๋‹ค.

์ด์ „์— ์Šคํ”„๋ง์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์—ˆ๋˜ MVC ๋ชจ๋ธ(hoit1302.tistory.com/47์˜ 1. Controller)๊ณผ ๋น„๊ตํ•˜๋ฉด ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด ๊ฐ’๋งŒ ModelAndView๋กœ ๋ฐ”๋€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

package org.springframework.web.servlet.mvc;

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

import org.springframework.web.servlet.ModelAndView;

public interface Controller {
	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 
    		throws Exception;
}

 

5. ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์˜ Controller ๊ตฌํ˜„

ํด๋ž˜์Šค ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, Model๊ณผ View ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜์—ฌ ๋ฆฌํ„ดํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ModelAndView ๊ฐ์ฒด์— ํ•„์š”ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜๋ฉด ๋œ๋‹ค.

 

5.1 LoginController ๊ตฌํ˜„

package com.springbook.view.user;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

public class LoginController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ");
		
		// 1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ •๋ณด ์ถ”์ถœ
		String id = request.getParameter("id");
		String password = request.getParameter("password");

		// 2. DB ์—ฐ๋™ ์ฒ˜๋ฆฌ
		UserVO vo = new UserVO();
		vo.setId(id);
		vo.setPassword(password);

		UserDAO userDAO = new UserDAO();
		UserVO user = userDAO.getUser(vo);

		// 3. ํ™”๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜
		ModelAndView mav = new ModelAndView();
		if (user != null) {
			mav.setViewName("getBoardList.do");
		} else {
			mav.setViewName("login.jsp");
		}
		return mav;
	}

}

5.2 getBoardListController ๊ตฌํ˜„

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๋ฅผ ์„ธ์…˜์ด ์•„๋‹Œ ModelAndView ๊ฐ์ฒด์— ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

package com.springbook.view.board;

import java.util.List;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;

public class GetBoardListController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("๊ธ€ ๋ชฉ๋ก ๊ฒ€์ƒ‰ ์ฒ˜๋ฆฌ");
		
		// 1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ •๋ณด ์ถ”์ถœ(๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์€ ๋‚˜์ค‘์— ๊ตฌํ˜„)
		// 2. DB ์—ฐ๋™ ์ฒ˜๋ฆฌ
		BoardVO vo = new BoardVO();
		BoardDAO boardDAO = new BoardDAO();
		List<BoardVO> boardList = boardDAO.getBoardList(vo);
		
//		// 3. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ๋ชฉ๋ก ํ™”๋ฉด์„ ๋ฆฌํ„ดํ•œ๋‹ค.
//		HttpSession session = request.getSession();
//		session.setAttribute("boardList", boardList);
//		return "getBoardList";
		
		// 3. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ํ™”๋ฉด ์ •๋ณด๋ฅผ ModelAndView์— ์ €์žฅํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค.
		ModelAndView mav = new ModelAndView();
		mav.addObject("boardList", boardList); 	// Model ์ •๋ณด ์ €์žฅ
		mav.setViewName("getBoardList"); 	// View ์ •๋ณด ์ €์žฅ
		return mav;
	}
}

๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค๋„ ๋งŽ์œผ๋‚˜ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋‚ด์šฉ์€ ์—†์œผ๋ฏ€๋กœ ํ›„๋žต.

6. HadlerMapping ๋“ฑ๋ก

	<!-- HandlerMapping ๋“ฑ๋ก -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/login.do">login</prop>
				<prop key="/getBoardList.do">getBoardList</prop>
				<prop key="/getBoard.do">getBoard</prop>
				<prop key="/insertBoard.do">insertBoard</prop>
				<prop key="/updateBoard.do">updateBoard</prop>
				<prop key="/deleteBoard.do">deleteBoard</prop>
				<prop key="/logout.do">logout</prop>
			</props>
		</property>
	</bean>

	<!-- Controller ๋“ฑ๋ก -->
	<bean id="login" class="com.springbook.view.user.LoginController"></bean>
	<bean id="getBoardList" class="com.springbook.view.board.GetBoardListController"></bean>
	<bean id="getBoard" class="com.springbook.view.board.GetBoardController"></bean>
	<bean id="insertBoard" class="com.springbook.view.board.InsertBoardController"></bean>
	<bean id="updateBoard" class="com.springbook.view.board.UpdateBoardController"></bean>
	<bean id="deleteBoard" class="com.springbook.view.board.DeleteBoardController"></bean>
	<bean id="logout" class="com.springbook.view.user.LogoutController"></bean>

"/login.do" ์š”์ฒญ์€ id๊ฐ€ login์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด์™€ ๋งคํ•‘๋˜์–ด ์žˆ๋‹ค.

๊ฐ controller ํด๋ž˜์Šค๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

7. ViewResolver ํ™œ์šฉํ•˜๊ธฐ

ViewResolver๋ฅผ ์ด์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ์ง์ ‘์ ์ธ JSP ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์›น ํ”„๋กœ์ ํŠธ์—์„œ ViewResolver ์‚ฌ์šฉ์€ ๊ฑฐ์˜ ํ•„์ˆ˜์ด๋‹ค.

์•ž์„œ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ getBoardList.jsp ํŒŒ์ผ์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

GetBoardListController๋ถ€ํ„ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ์ ˆํžˆ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ViewResolver ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

7.1 viewresolver ๋“ฑ๋ก

WEB-INF ํด๋”๋Š” ์ ˆ๋Œ€ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ InternalResourceViewResolver๋กœ ์„ค์ •ํ•˜๋ฉด WEB-INF ํด๋”์— ์žˆ๋Š” JSP ํŒŒ์ผ์„ View ํ™”๋ฉด์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    <!-- ViewResolver ๋“ฑ๋ก -->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/board/"> </property>
        <property name="suffix" value=".jsp"> </property>
    </bean>

7.2 controller ์ˆ˜์ •

InternalResourceViewResolver๋ฅผ ๋“ฑ๋กํ–ˆ์„ ๋•Œ๋Š” ๋ชจ๋“  view ์ด๋ฆ„์—์„œ ํ™•์žฅ์ž '.jsp'๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

[์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ GetBoardController.java]
		// 3. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ํ™”๋ฉด ์ •๋ณด๋ฅผ ModelAndView์— ์ €์žฅํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค.
		ModelAndView mav = new ModelAndView();
		mav.addObject("board", board); 	 // Model ์ •๋ณด ์ €์žฅ
		mav.setViewName("getBoard"); 	 // View ์ •๋ณด ์ €์žฅ
		return mav;

์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘

view ์ด๋ฆ„ ์•ž์— redirect:๋ฅผ ๋ถ™์ด๋ฉด viewresolver๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋”๋ผ๋„ ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค.

ํ™•์žฅ์ž๊ฐ€ '.do'์ธ ์š”์ฒญ์€ ์•ž์— 'redirect:'์„ ๋ถ™์—ฌ์„œ viewresolver๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

[์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘ LoginController.java]
		// 3. ํ™”๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜
		ModelAndView mav = new ModelAndView();
		if (user != null) {
			mav.setViewName("redirect:getBoardList.do");
		} else {
			mav.setViewName("redirect:login.jsp");
		}
		return mav;