본문 바로가기

Spring

3-5. Spring MVC 적용

앞서 직접 개발한 Controller 관련 파일을 모두 삭제합니다.
가장 먼저 BoardWeb 프로젝트에서 ..view.controller 패키지를 삭제합니다.

컴파일 되지 않은 Controller 클래스들을 수정합니다.
기존에 사용하던 모든 Controller 클래스들은 스프링에서 제공하는 Controller 인터페이스로 구현합니다.

로그인 기능 구현

package com.springtest.biz.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.springtest.biz.user.UserVO;
import com.springtest.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;
	}
}

Controller를 직접 구현했던 Controller가 아닌 스프링에서 제공하는 Controller로 변경합니다.
또한 String 리턴이 아닌 ModelAndView 리턴으로 변경합니다.

이후 작성된 LoginController가 클라이언트의 "/login.do" 요청에 대해서 동작하게 하기 위해
스프링 설정 파일인 presentation-layer.xml 에 HanlderMapping과 LoginController를 <bean> 등록합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- HandlerMapping 등록 -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/login.do">login</prop>
			</props>
		</property>
	</bean>
	
	<!-- Controller 등록 -->
	<bean id="login" class="com.springtest.biz.view.user.LoginController"></bean>
</beans>

글 목록 검색 기능 구현

package com.springtest.view.board;

import java.util.List;

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.springtest.biz.board.BoardVO;
import com.springtest.biz.board.impl.BoardDAO;

public class GetBoardListController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("글 목록 검색 처리");
		
		// 사용자 입력 정보 추출 및 DB 연동 처리
		BoardVO vo = new BoardVO();
		BoardDAO boardDAO = new BoardDAO();
		List<BoardVO> boardList = boardDAO.getBoardList(vo);
		
		// 검색 결과와 화면 정보를 ModelAndView에 저장하고 리턴
		ModelAndView mav= new ModelAndView();
		mav.addObject("boardList", boardList);
		mav.setViewName("getBoardList.jsp");
		return mav;
	}
	
}

글 상세 조회 기능 구현

package com.springtest.view.board;

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.springtest.biz.board.BoardVO;
import com.springtest.biz.board.impl.BoardDAO;

public class GetBoardController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("글 상세 조회 처리");
		
		// 검색할 게시글 번호 추출
		String seq= request.getParameter("seq");

		// DB 연동 처리
		BoardVO vo = new BoardVO();
		vo.setSeq(Integer.parseInt(seq));
		
		BoardDAO boardDAO = new BoardDAO();
		BoardVO board = boardDAO.getBoard(vo);
		
		// 검색 결과와 화면 정보를 ModelAndView에 저장하고 리턴
		ModelAndView mav= new ModelAndView();
		mav.addObject("board", board);
		mav.setViewName("getBoard.jsp");
		return mav;
	}
	
}

글 등록 기능 구현

이후 등록할 등록, 수정, 삭제, 로그아웃 관련 HandlerMapping 정보를 스프링 설정 파일에 추가했습니다.

package com.springtest.view.board;

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.springtest.biz.board.BoardVO;
import com.springtest.biz.board.impl.BoardDAO;

public class InsertBoardController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("글 등록 처리");
		// 1. 사용자 입력 정보 추출
		//request.setCharacterEncoding("EUC-KR");
		String title = request.getParameter("title");
		String writer = request.getParameter("writer");
		String content = request.getParameter("content");
		
		// 2. DB 연동 처리
		BoardVO vo = new BoardVO();
		vo.setTitle(title);
		vo.setWriter(writer);
		vo.setContent(content);
		
		BoardDAO boardDAO = new BoardDAO();
		boardDAO.insertBoard(vo);
		
		// 3. 화면 네비게이션
		ModelAndView mav = new ModelAndView();
		mav.setViewName("getBoardList.do");
		return mav;
	}
	
}

글 수정 기능 구현

package com.springtest.view.board;

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.springtest.biz.board.BoardVO;
import com.springtest.biz.board.impl.BoardDAO;

public class UpdateBoardController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("글 수정 처리");
		
		// 1.사용자 입력 정보 추출
		//request.setCharacterEncoding("EUC-KR");
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		String seq = request.getParameter("seq");
		
		// 2.DB 연동 처리
		BoardVO vo = new BoardVO();
		vo.setTitle(title);
		vo.setContent(content);
		vo.setSeq(Integer.parseInt(seq));
		
		BoardDAO boardDAO = new BoardDAO();
		boardDAO.updateBoard(vo);
		
		// 3. 화면 네비게이션
		ModelAndView mav = new ModelAndView();
		mav.setViewName("getBoardList.do");
		return mav;
	}
	
}

글 삭제 기능 구현

package com.springtest.view.board;

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.springtest.biz.board.BoardVO;
import com.springtest.biz.board.impl.BoardDAO;

public class DeleteBoardController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("글 삭제 처리");

		String seq = request.getParameter("seq");
		
		BoardVO vo = new BoardVO();
		vo.setSeq(Integer.parseInt(seq));
		
		BoardDAO boardDAO = new BoardDAO();
		boardDAO.deleteBoard(vo);
		
		// 3. 화면 네비게이션
		ModelAndView mav = new ModelAndView();
		mav.setViewName("getBoardList.do");
		return mav;
	}
	
}

로그아웃 기능 구현

package com.springtest.biz.view.user;

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;

public class LogoutController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("로그아웃 처리");

		HttpSession session = request.getSession();
		session.invalidate();

		ModelAndView mav = new ModelAndView();
		mav.setViewName("login.jsp");
		return mav;
	}
}

View Resolver 활용하기

클라이언트로부터의 직접적인 JSP 호출을 차단할 수 있어 View Resolver의 사용을 필수 입니다.

위 두 파일을 해당 경로를 만들어 넣어줍니다.
WEB-INF 폴더는 절대 브라우저에서 접근할 수 없습니다.
하지만 InternalResourceViewResolver를 아래와 같이 설정하면
WEB-INF 폴더에 있는 JSP파일을 View 화면으로 사용할 수 있고, 직접적인 JSP 호출은 차단합니다.

presentation-layer.xml

위 새로운 설정으로 인해 로그인 기능 실행을 하면 실행이 되지 않을 것 입니다.
만약 로그인 실패 시 "/WEB-INF/board/login.jsp.jsp" 파일을 실행하고
성공하면 "/WEB-INF/board/getBoardList.do.jsp" 파일이 실행하기 때문입니다.

View Resolver의 설정을 무시하고 리다이렉트하는 키워드 "redirect:"를 앞에 부여줍니다.
그리고 로그인에 성공했을 때 실행되는 GetBoardListController에서 확장자 ".jsp"를 제거합니다.

상세 정보를 출력하는 GetBoardController 클래스도 View 이름을 getBoard 로 설정합니다.

InsertBoardController,  UpdateBoardController, DeleteBoardController 클래스는
View Resolver를 무시하고 갱신을 위해 "redirect:" 키워드를 붙여줍니다.

LogoutController는 로그아웃 처리 후에 로그인 화면으로 이동할 수 있도록 login.jsp 화면으로 넘깁니다.