1. Model 2 아키텍처 구조
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F140464e5-abd9-4600-b5e2-a626469e3fa0%2F1.png)
- 작고 단순한 시스템을 개발하거나 개발 인력이 충분하지 않을 때는 구조가 단순한 Model 1 아키텍처를 사용하기도한다.
- 하지만, 시스템의 규모가 크고 기능이 복잡한 엔터프라이즈 시스템을 개발하면 Model 1 아키텍처는 적합하지 않다.
- Model 1의 문제점을 해결하기 위한 Model 2
- Model 2 아키텍처에서 가장 중요한 특징은 Controller의 등장이다.
- Model 1에서 JSP 파일에 있던 Controller Java 로직이 Controller(Servlet)으로 옮겨간다.
- 즉 Model 2 에서는 디자이너가 JSP파일을 관리하고 개발자가 Controller와 Model만 관리하게 된다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F8ff7353e-8ae0-4c9c-a16c-34bb0476d048%2F2.png)
2. Servlet (Controller)만들기
- 웹 브라우저에서 어떤 파일명이건 상관없이 확장자가 .do이면 무조건 Servlet이 뜨도록 처리한다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fe659317a-2260-4c0c-bf62-2d6328d1d983%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fb9222394-16c5-4b4b-9d00-d72da304588c%2Fimage.png)
- web.xml 확인하기
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F9bd414e3-47d0-4342-86f4-f4406f14f937%2Fimage.png)
- 서버확인하기
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F99a482d1-357a-41de-b33e-23a0b80160c4%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fd175cad7-104e-4d12-a1ee-da475e3ec65e%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F18dc788c-f292-49cd-b612-fd26eef42557%2F3.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fa955c085-1973-4058-8779-0133d4b23062%2F4.png)
- process 라는 메서드를 만들어서 request와 response를 매개변수로 path를 구할 수 있는 메서드를 만든다.
- doGet과 doPost에 모두 process라는 메서드를 실행해준다.
- 이때 doPost에는 .setCharacterEncodint("UTF-8")을 넣어서 한글출력에 문제없도록 설정한다.
글등록, 글수정 작업시 한글이 깨지지 않을 수 있다.
- 이렇게처리해주면 앞으로 인코딩은 Servlet에서 담당하므로 따로 처리하지 않아도된다.
추후 다른 인코딩으로 변경을 원하면 Servlet에서 변경하면 된다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fabaf0f48-fd86-4a75-b4b8-d1d431caad93%2Fimage.png)
- 이 작업은 최종적으로 분기처리하기위한 작업이다.
- 클라이언트의 요청 path에 따라 적절히 분기처리한다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fd07c56f6-be96-4704-a659-4c8ab7304cf2%2Fimage.png)
- 웹 페이지에 login.do를 입력하면 콘솔창에 분기처리해준 로그인처리가 입력된다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F5d8381a5-ea45-4c05-95ee-d8a5f254552b%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fe48bd1f2-e439-488d-88d9-f057922651b4%2F5.png)
- 나머지 메서드들도 Servlet에서 처리할 수 있도록 정리한다.
- 이때, list에 값을 담아오는 목록보기의 경우
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F471e536e-d10f-4f0e-8e52-8bfec1e5604c%2Fimage.png)
- 값이 담겨있는 List형의 boardList의 데이터를 session에 담아서 다른 페이지에 넘겨준다.
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F03ab7a00-2420-4938-9bdd-df04b3770717%2Fimage.png)
- Servlet에 작업이 완료되면, view가 없는 JSP파일은 다 삭제해서 정리해준다.
또한, JSP파일 내의 Java로직부분역시 지워준다.
- 정리완료확인
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Fff60d287-081d-4bfb-adff-0fbddbddd950%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F74855bfa-36e2-44ce-8229-7a776e3eb9db%2Fimage.png)
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2F6a3e6ee8-d409-4664-8b69-44ff80d6608e%2Fimage.png)
- Servlet 파일 소스보기
package com.springbook.biz.Controller;
import java.io.IOException;
import java.sql.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.boarddao.BoardDao;
import com.springbook.biz.boarddao.BoardDaoImpl;
import com.springbook.biz.users.UserVo;
import com.springbook.biz.usersdao.UserDao;
import com.springbook.biz.usersdao.UserDaoImpl;
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DispatcherServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
process(request,response);
}
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
String uri= request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/"));
System.out.println(path);
HttpSession session = request.getSession();
BoardVO vo = new BoardVO();
BoardDao dao = new BoardDaoImpl();
if(path.equals("/login.do")) {
System.out.println("로그인 처리");
String id = request.getParameter("id");
String password = request.getParameter("password");
UserVo uvo = new UserVo();
uvo.setId(id);
uvo.setPassword(password);
UserDao udao = new UserDaoImpl();
UserVo user = udao.getUser(uvo);
if( user.getId() != null){
session.setAttribute("id",user.getId());
response.sendRedirect("getBoardList.do");
}else{
response.sendRedirect("login.jsp");
}
}
else if(path.equals("/logout.do")) {
System.out.println("로그아웃 처리");
session.invalidate();
response.sendRedirect("login.jsp");
}
else if(path.equals("/insertBoard.do")) {
System.out.println("글 등록 처리");
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String content = request.getParameter("content");
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
dao.insertBoard(vo);
response.sendRedirect("getBoardList.do");
}
else if(path.equals("/updateBoard.do")) {
System.out.println("글 수정 처리");
int seq = Integer.parseInt(request.getParameter("seq"));
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String content = request.getParameter("content");
Date regDate = Date.valueOf(request.getParameter("regdate"));
int cnt = Integer.parseInt(request.getParameter("cnt"));
int mainSeq= Integer.parseInt(request.getParameter("mainSeq"));
vo.setSeq(seq);
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
vo.setRegDate(regDate);
vo.setCnt(cnt);
vo.setMainSeq(mainSeq);
dao.updateBoard(vo);
response.sendRedirect("getBoardList.do");
}
else if(path.equals("/deleteBoard.do")) {
System.out.println("글 삭제 처리");
int s = Integer.parseInt(request.getParameter("seq"));
dao.deleteBoard(s);
response.sendRedirect("getBoardList.do");
}
else if(path.equals("/getBoard.do")) {
System.out.println("글 상세조회 처리");
vo = new BoardVO();
int seq = Integer.parseInt(request.getParameter("seq"));
vo.setSeq(seq);
BoardVO board = dao.getBoard(vo);
dao.cntUpdate(seq);
session.setAttribute("board", board);
response.sendRedirect("getBoard.jsp");
}
else if(path.equals("/getBoardList.do")) {
System.out.println("글 목록검색 처리");
String ch1 = request.getParameter("ch1");
String ch2 = request.getParameter("ch2");
vo.setCh1(ch1);
vo.setCh2(ch2);
List<BoardVO> boardList = dao.getBoardList(vo);
session.setAttribute("boardList", boardList);
response.sendRedirect("getBoardList.jsp");
}
}
}
![](https://velog.velcdn.com/images%2Fyseonjin%2Fpost%2Ffe409a43-5ca2-4d27-90b7-ac9d76a76b66%2F6.png)