본문 바로가기
Java Web Programming/4. JSP

[JSP/Model2] Model2 basic / 1단계_Model2 MVC pattern + Singleton pattern (forward 방식, redirect 방식)

by 파프리카_ 2020. 8. 28.
728x90
반응형

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 화면 켜짐

 

728x90
반응형