Model2 설계방식 (Architecture)의 주요 디자인 패턴은 MVC Design Pattern이다.
Singleton Pattern으로 Model계층의 DAO에 적용시켜 불필요하게 객체를 다수 생성하는 것을 방지하고
클래스 로딩 시, 단 한번의 객체를 생성해서 여러 컨트롤러에서 사용하도록 했다.
* 링크 → https://creamilk88.tistory.com/96
첫 단계 (webstudy17) 에서는 Model2 설계 방식에 MVC와 Singleton을 간단히 복습하고,
여기에 추가해서 두번째 단계(webstudy18)에서 FrontController Pattern을 추가하여 적용해볼 예정이다 !
webstudy17
예제 목차 |
1. 첫번째 예제 : 아이디로 차 정보 검색하기 |
2. 두번째 예제 : 차 정보 등록하기 - redirect 방식 |
Model
MockDAO에는 singleton pattern을 적용한다
/MockDAO.java
package model;
/*
* 테스를 위한 가짜 DAO
* (singleton pattern)
*/
public class MockDAO {
// 생성자 단 한 번 실행
private static MockDAO dao = new MockDAO();
// 생성자에 private 주기
// + Driver Loading
private MockDAO() {
}
// 생성자를 생성할 method를 static에 적재
public static MockDAO getInstance() {
return dao;
}
// 예제 1번
// selectCarById method
public CarVO selectCarById(String id) {
CarVO car = null;
if (id.equals("1234"))
car = new CarVO(id, "파프리카", "아우디", "판교");
return car;
}
// 예제 2번
// registerCar method
public void registerCar(CarVO carVO) {
System.out.println(carVO + " 정보를 DB TABLE에 INSERT");
}
}
/CarVO.java
package model;
public class CarVO {
private String id;
private String owner;
private String model;
private String address;
//기본 생성자
public CarVO() {
super();
}
//매개변수 있는 생성자(overroading)
public CarVO(String id, String owner, String model, String address) {
super();
this.id = id;
this.owner = owner;
this.model = model;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
View
/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Model2 basic</title>
</head>
<body>
<%-- webstudy18에서 FrontController Pattern을 추가한다 --%>
<h3>Model2 MVC + Singleton Pattern</h3>
<ul>
<li><a href="selectcar-form.jsp">차 검색 페이지</a></li>
<li><a href="registercar-form.jsp">차 등록 페이지</a></li>
</ul>
</body>
</html>
[ 시작 화면 ]
1. 첫번째 예제 : 아이디를 입력받아 차 정보 결과 조회하기
Controller : SelectCarByIdServlet 에서
MockDAO의 selectCarById() 메서드와 연동
차 정보가 존재하면
-> selectcar-ok.jsp 에서
-> 차 정보를 아이디, 차주명, 모델명, 주소를 제공
차 정보가 존재하지 않으면
-> selectcar-fail.jsp에서
-> alert : 차량 정보가 존재하지 않습니다
-> location.href로 selectcar-form.jsp로 이동
View
/selectcar-form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Select Car form</title>
</head>
<body>
<form action="SelectCarByIdServlet">
아이디 <input type="number" name="carId">
<input type="submit" value="Car 정보 검색">
</form>
</body>
</html>
/selectcar-ok.jsp
<%@page import="model.CarVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>차 상세 정보</title>
</head>
<body>
<% CarVO vo = (CarVO) request.getAttribute("vo"); %>
<%=vo.getId() %>에 해당하는 정보입니다.<br><br>
ID : <%=vo.getId() %><br>
OWNER : <%=vo.getOwner() %><br>
MODEL : <%=vo.getModel() %><br>
ADDRESS : <%=vo.getAddress() %><br>
</body>
</html>
/selectcar-fail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>오류 페이지</title>
</head>
<body>
<script type="text/javascript">
alert("차량 정보가 존재하지 않습니다");
location.href = "selectcar-form.jsp";
</script>
</body>
</html>
Controller
/SelectCarByIdServlet.java
package controller;
import java.io.IOException;
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 model.CarVO;
import model.MockDAO;
@WebServlet("/SelectCarByIdServlet")
public class SelectCarByIdServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//selectcar-form.jsp에서 id 정보 받아오기
String id = request.getParameter("carId");
// Model과 연동 (dao에서 service가 실행)
MockDAO dao = MockDAO.getInstance();
//id정보를 입력해서 차 정보를 반환받는다.
CarVO vo = dao.selectCarById(id);
//View에 연동 결과 공유
String movingUrl = "";
if (vo ==null) { // id가 없는 정보인 경우
movingUrl = "selectcar-fail.jsp";
} else { //id가 있는 정보인 경우
request.setAttribute("vo", vo);
movingUrl = "selectcar-ok.jsp";
}
//forward 방식으로 View로 이동
request.getRequestDispatcher(movingUrl).forward(request, response);
}
}
[ 브라우저 결과 ]
selectcar-form.jsp
-> DB에 있는 ID를 검색했을 때, selectcar-ok.jsp
-> DB에 없은 ID를 검색했을 때, selectcar-fail.jsp 에서 alert후, selectcar-form.jsp로 돌아감
2. 두번째 예제 : 차 정보(CarVO)를 DB Table에 insert(등록) 하기
controller.RegisterCarServlet 에서
MockDAO의 registerCar() 메서드를 이용해서 vo 객체를 생성한다.
이번에는 redirect 방식으로 Controller(Serlvet) -> View(JSP)로 이동한다.
결과 페이지는 car-register-result.jsp 이다.
* foward 방식은 클라이언트가 재 요청 시 동작이 반복될 수 있다.
(insert - 등록 시에는 적합하지 않다.)
View
/registercar-form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>차 등록 정보 Form</title>
</head>
<body>
<form action="RegisterCarServlet" method="POST">
아이디 <input type="number" name="carId"><br>
차주명 <input type="text" name="owner"><br>
모델명 <input type="text" name="model"><br>
주소 <input type="text" name="address"><br>
<input type="submit" value="등록하기"><br>
</form>
</body>
</html>
/car-register-result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>등록 결과</title>
</head>
<body bgcolor="yellow">
차량 정보가 등록되었습니다.
</body>
</html>
Controller
/RegisterCarServlet.java
package controller;
import java.io.IOException;
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 model.CarVO;
import model.MockDAO;
@WebServlet("/RegisterCarServlet")
public class RegisterCarServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//post 한글방식 인코딩
request.setCharacterEncoding("utf-8");
// registercar-form.jsp에서 정보 받아오기
String id = request.getParameter("carId");
String owner = request.getParameter("owner");
String model = request.getParameter("model");
String address = request.getParameter("address");
// Model과 연동
CarVO carVO = new CarVO(id, owner, model, address);
// registerCar() 함수를 이용해 등록
MockDAO.getInstance().registerCar(carVO);
// 연동 결과 View에 공유 ~> redirect에서는 의미X
//request.setAttribute("carVO", carVO);
// View로 이동 (redirect 방식)
response.sendRedirect("car-register-result.jsp");
}
}
[ 브라우저 결과 ]
registercar-form.jsp
-> 등록하기 결과 '등록하기' 누르면 car-register-result.jsp 화면 켜짐