78. 프런트 컨트롤러의 도입 (4)
6. MemberAddServlet 클래스를 페이지 컨트롤러로 만들기
회원 등록 서블릿 spms.servlets.MemberAddServlet 클래스에 대해 프런트 컨트롤러를 적용한다.
package spms.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import spms.dao.MemberDao;
import spms.vo.Member;
//프런트 컨트롤러 적용
@WebServlet("/member/add")
public class MemberAddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//신규 회원 링크 클릭시 GET 요청(a태그로 만들어진 링크 클릭)이 발생하기에 doGet() 메소드를 오버라이딩
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setContentType("text/html; charset=UTF-8");
//RequestDispatcher rd = request.getRequestDispatcher("/member/MemberForm.jsp");
//rd.forward(request, response);
//JSP URL 정보 프런트 컨트롤러에게 알리기 위해 ServletRequest 보관소에 저장
request.setAttribute("viewUrl", "/member/MemberForm.jsp");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
try {
ServletContext sc = this.getServletContext();
//ServletContext에 저장된 DAO 객체 사용
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
/*memberDao.insert(new Member()
.setEmail(request.getParameter("email"))
.setPassword(request.getParameter("password"))
.setName(request.getParameter("name")));*/
//Member 객체 ServletRequest 보관소에서 꺼내기
Member member = (Member)request.getAttribute("member");
memberDao.insert(member);
//리다이렉트를 이용한 리프래시
//response.sendRedirect("list");
//리다이렉트를 위한 뷰 URL 설정
request.setAttribute("viewUrl", "redirect:list.do");
} catch (Exception e) {//JDBC 프로그래밍에서 예외처리
throw new ServletException(e);
/*e.printStackTrace();
request.setAttribute("error", e);
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response);*/
} finally {}
}
}
- 뷰로 포워딩하는 코드를 제거
GET 요처을 처리하는 doGet() 메서드에서 MemberForm.jsp로 포워딩하는 코드를 제거한다. 대신 MemberForm.jsp의 URL을 ServletRequest에 저장한다.
//RequestDispatcher rd = request.getRequestDispatcher("/member/MemberForm.jsp");
//rd.forward(request, response);
//JSP URL 정보 프런트 컨트롤러에게 알리기 위해 ServletRequest 보관소에 저장
request.setAttribute("viewUrl", "/member/MemberForm.jsp");
- 요청 매개변수의 값을 꺼내는 코드를 제거
회원 등록을 요구하는 POST 요청이 들어오면 doPost() 메서드가 호출된다. 클라이언트가 보낸 회원 정보를 꺼내기 위해 getParameter() 메서드를 호출하는 대신, 프런트 컨트롤러가 준비해 놓은 Member 객체를 ServletRequest 보관소에서 꺼내도록 doPost() 메서드를 변경한다.
/*memberDao.insert(new Member().setEmail(request.getParameter("email"))
.setPassword(request.getParameter("password"))
.setName(request.getParameter("name")));*/
//Member 객체 ServletRequest 보관소에서 꺼내기
Member member = (Member)request.getAttribute("member");
memberDao.insert(member);
- 리다이렉트를 위한 뷰 URL 설정
회원 정보를 데이터베이스에 저장한 다음, 회원 목록 페이지로 리다이렉트 해야 하는데, 기존 코드를 제거하고 ServletRequest에 리다이렉트 URL을 저장한다.
//리다이렉트를 이용한 리프래시
//response.sendRedirect("list");
//리다이렉트를 위한 뷰 URL 설정
request.setAttribute("viewUrl", "redirect:list.do");
뷰 URL이 "redirect:" 문자열로 시작할 경우, 프런트 컨트롤러는 그 URL로 리다이렉트 한다. 따라서 리다이렉트 해야 하는 경우 반드시 URL 앞부분에 "redirect:" 문자열을 붙여야 한다.
- 오류 처리 코드 제거
MemberListServlet 클래스와 마찬가지로 오류가 발생했을 때 오류 처리 페이지로 실행을 위임하는 코드를 제거하고, 그 자리에 ServletException 객체를 던지는 코드를 넣는다.
throw new ServletException(e);
/*e.printStackTrace();
request.setAttribute("error", e);
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response);*/
- 회원 등록 폼의 action URL에 .do 붙이기
회원 등록 폼을 출력하는 MemberForm.jsp 에서 <form> 태그의 action 값을 변경한다.
<h1>회원 등록2</h1>
<form action='add.do' method='post'>
이름: <input type='text' name='name'><br>
이메일: <input type='text' name='email'><br>
암호: <input type='password' name='password'><br>
<input type='submit' value='추가'>
<input type='reset' value='취소'>
</form>
7. 회원 등록 테스트
톰캣 서버를 다시 시작하거나 서블릿 클래스가 자동 로딩된 후, 회원 목록 페이지에서 '신규 회원' 링크를 클릭한다(그림 1).

회원 정보 등록폼에 값을 입력한 후 '추가' 버튼을 클릭한다(그림 2).

회원 정보가 등록된 다음, 회원 목록 페이지로 리다이렉트 된다. 회원 목록 페이지를 보면 방금 등록한 회원 정보를 볼 수 있다(그림 3).

회원 목록과 회원 등록뿐만 아니라 회원 정보 조회, 변경, 삭제, 로그인, 로그아웃 서블릿에 대해서도 프런트 컨트롤러를 적용하였고 각 .jsp 파일의 action URL에 .do 를 붙였고, Header.jsp 페이지에 있는 링크 또는 폼의 URL에 .do 를 붙이고, 기존에 <jsp:useBean> 태그 및 <% %>, <%= %> 태그를 EL 태그로 교체했다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr