MVC패턴은 디자인패턴 중 하나입니다.
디자인 패턴이란 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것을 말합니다.
어떠한 앱을 만든다고 한다면..그 앱을 유지보수를 하고 또 다른이들과 공유를 하면서 만들어야 할 떄 좀 더 쉽고 깔끔하게 만들 수 있는 방법을 우리는 고안해야 됩니다. 만약 이러한 방법들을 명확히 하지 않는다면.. 우리는 클래스 함수들을 일일히 다 만들어야 하게 될 겁니다.
라이브러리나 프레임워크가 그에 따른 예입니다.
Model, View, Controller
Controller을 조작하면 Controller은 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 0제어해서 사용자에게 전달한다.
실제 구조는
애플리케이션의 정보, 데이터를 나타냅니다. 데이터베이스, 처음의 정의하는 상수, 초기화값, 변수 등을 뜻합니다.
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.
- 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야만 한다.
input 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타냅니다. 즉, 데이터 및 객체의 입력, 그리고 보여주는 출력을 담당합니다.
- 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
- 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 된다.
- 변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.
데이터와 사용자인터페이스 요소들을 잇는 다리역할을 합니다. 즉, 사용자가 데이터를 클릭하고, 수정하는 것에 대한 "이벤트"들을 처리하는 부분을 뜻합니다.
- 모델이나 뷰에 대해서 알고 있어야 한다.
- 모델이나 뷰의 변경을 모니터링 해야 한다.
서로 분리되어 각자의 역할에 집중할 수 있게끔하여 개발을 하고 그렇게 애플리케이션을 만든다면, 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지게 되는 것입니다. 그러기 위한 MVC패턴입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Team Mgr</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function check() {
f = document.frm;
if(f.name.value==""){
alert("이름을 입력하세요");
f.name.focus();
return; //함수 빠져나옴
}
if(f.city.value==""){
alert("사는곳을 입력하세요");
f.city.focus();
return; //함수 빠져나옴
}
if(f.age.value==""){
alert("나이를 입력하세요");
f.age.focus();
return; //함수 빠져나옴
}
if(f.team.value==""){
alert("팀을 입력하세요");
f.team.focus();
return; //함수 빠져나옴
}
f.submit();//제출
}
function check2() {
document.frm.action = "teamInsertProc2.jsp";
document.frm.submit();
}
</script>
</head>
<body>
<div align = "center">
<h1>Team Insert</h1>
<form name="frm" method="post" action="teamInsertProc.jsp">
<table border="1">
<tr>
<td width="50" align="center">이름</td>
<td width="150"><input name="name" value="홍길동"></td>
</tr>
<tr>
<td align="center">사는곳</td>
<td><input name="city" value="부산"></td>
</tr>
<tr>
<td align="center">나이</td>
<td ><input name="age" value="27"></td>
</tr>
<tr>
<td align="center">팀명</td>
<td><input name="team" value="산적"></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="button" value="SAVE" onclick="check()">
<input type="button" value="SAVE2" onclick="check2()">
</td>
</tr>
</table>
</form><p>
<a href="teamList.jsp">LIST</a>
</div>
</body>
</html>
<%@page import = "ch09.TeamBean" %>
<%@page import = "java.util.Vector" %>
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch09.TeamMgr"/>
<%
Vector<TeamBean> vlist = mgr.listTeam();
//out.println(vlist.size());
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Team Mgr</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div align="center">
<h1>Team List</h1>
<table border="1">
<tr>
<th>번호</th>
<th>이름</th>
<th>사는곳</th>
<th>나이</th>
<th>팀명</th>
</tr>
<%
for(int i=0;i<vlist.size();i++)
{
TeamBean bean = vlist.get(i);
%>
<tr align = "center">
<td><%=bean.getNum() %></td>
<td>
<a href ="teamRead.jsp?num=<%=bean.getNum()%>"><%=bean.getName() %>
</td>
<td><%=bean.getCity() %></td>
<td><%=bean.getAge() %></td>
<td><%=bean.getTeam() %></td>
</tr>
<%
}//for
%>
</table><p>
<a href="teamInsert.html">INSERT</a>
</div>
</body>
</html>
<%@page import="ch09.TeamBean"%>
<%@page import="ch09.TeamMgr"%>
<%@page import="ch09.MyUtil"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
//teamList.jsp에서 num값을 넘겨받아 처리해야함
int num = 0;
TeamBean bean = null;
if(request.getParameter("num")==null){
//num값이 넘어오지 않음
response.sendRedirect("teamList.jsp");
return;
}else if(!MyUtil.isNumeric(request.getParameter("num"))){
//num이 숫자 형태로 넘어오지 않음
response.sendRedirect("teamList.jsp");
return;
}else{
num = MyUtil.parseInt(request, "num");
TeamMgr mgr = new TeamMgr();
bean = mgr.getTeam(num);
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Team Mgr</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div align="center">
<h1>Team Read</h1>
<table border="1">
<tr>
<td>번호</td>
<td><%=num%></td>
</tr>
<tr>
<td>이름</td>
<td><%=bean.getName()%></td>
</tr>
<tr>
<td>사는곳</td>
<td><%=bean.getCity()%></td>
</tr>
<tr>
<td>나이</td>
<td><%=bean.getAge()%></td>
</tr>
<tr>
<td>팀명</td>
<td><%=bean.getTeam()%></td>
</tr>
</table><p/>
<a href="teamList.jsp">LIST</a>
<a href="teamInsert.html">INSERT</a>
<a href="teamUpdate.jsp?num=<%=num %>">UPDATE</a>
<a href="teamDelete.jsp?num=<%=num %>">DELETE</a>
</div>
</body>
</html>
<!-- ch09/teamInsertProc.jsp -->
<%@page import="ch09.TeamMgr"%>
<%@page import="ch09.TeamBean"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
TeamMgr mgr = new TeamMgr();
TeamBean bean = new TeamBean();
String name = request.getParameter("name");
String city = request.getParameter("city");
int age = Integer.parseInt(request.getParameter("age"));
String team = request.getParameter("team");
bean.setName(name);
bean.setCity(city);
bean.setAge(age);
bean.setTeam(team);
mgr.insertTeam(bean);
response.sendRedirect("teamList.jsp");
%>
<!-- ch09/teamInsertProc2.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="bean" class="ch09.TeamBean"/>
<jsp:useBean id="mgr" class="ch09.TeamMgr"/>
<jsp:setProperty property="*" name="bean"/>
<%
mgr.insertTeam(bean); //저장
response.sendRedirect("teamList.jsp");
%>
<%@page import="ch09.MyUtil"%>
<%@page import="ch09.TeamBean"%>
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch09.TeamMgr"/>
<%
int num = MyUtil.parseInt(request,"num");
TeamBean bean = mgr.getTeam(num);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Team Mgr</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div align="center">
<h1>Team Update</h1>
<form name="frm" method="post" action="teamUpdateProc.jsp">
<table border="1">
<tr>
<td width="50" align="center">이름</td>
<td width="150"><input name="name" value="<%=bean.getName()%>"></td>
</tr>
<tr>
<td width="50" align="center">번호</td>
<td width="150"><input name="num" value="<%=num%>" readonly></td>
</tr>
<tr>
<td align="center">사는곳</td>
<td><input name="city" value="<%=bean.getCity()%>"></td>
</tr>
<tr>
<td align="center">나이</td>
<td ><input name="age" value="<%=bean.getAge()%>"></td>
</tr>
<tr>
<td align="center">팀명</td>
<td><input name="team" value="<%=bean.getTeam()%>"></td>
</tr>
<tr>
<td align="center" colspan="2">
<%-- <input type="hidden" name="num" value="<%=bean.getNum()%>"> --%>
<input type="submit" value="UPDATE">
</td>
</tr>
</table>
</form><p>
<a href="teamRead.jsp?num=<%=num%>">READ</a>
</div>
</body>
</html>
<!-- ch09/teamUpdateProc.jsp -->
<%@ page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch09.TeamMgr"/>
<jsp:useBean id="bean" class="ch09.TeamBean"/>
<jsp:setProperty property="*" name="bean"/>
<%
boolean result = mgr.updateTeam(bean);
out.print(result);
%>
<%@ page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch09.TeamMgr"/>
<%
int num = Integer.parseInt(request.getParameter("num"));
mgr.deleteTeam(num);
response.sendRedirect("teamList.jsp");
%>
package ch09;
import java.awt.font.GlyphVector;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
public class TeamMgr {
private DBConnectionMgr pool;
//생성자
public TeamMgr() {
pool = DBConnectionMgr.getInstance();
}
//리스트
public Vector<TeamBean> listTeam(){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
Vector<TeamBean> vlist = new Vector<TeamBean>();
try {
con = pool.getConnection();
sql = "select * from tblTeam";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
TeamBean bean = new TeamBean();
bean.setNum(rs.getInt("num"));
bean.setName(rs.getString("name"));
bean.setCity(rs.getString("city"));
bean.setAge(rs.getInt("age"));
bean.setTeam(rs.getString("team"));
vlist.addElement(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return vlist;
}
//저장
public void insertTeam(TeamBean bean) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "INSERT INTO tblteam "
+ "VALUES(NULL,?,?,?,?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bean.getName());
pstmt.setString(2, bean.getCity());
pstmt.setInt(3, bean.getAge());
pstmt.setString(4, bean.getTeam());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
return;
}
//한개의 레코드 가져오기
public TeamBean getTeam(int num) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
TeamBean bean = new TeamBean();
try {
con = pool.getConnection();
sql = "SELECT *"
+ " FROM tblteam "
+ " WHERE num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
while(rs.next()){
bean.setName(rs.getString("name"));
bean.setCity(rs.getString("city"));
bean.setAge(rs.getInt("age"));
bean.setTeam(rs.getString("team"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return bean;
}
//수정
public boolean updateTeam(TeamBean bean) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
boolean flag = false;
try {
con = pool.getConnection();
sql = "UPDATE tblteam "
+ " SET name = ?, city = ?,"
+ "age = ?, team = ? "
+ " WHERE num= ? ";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, bean.getName());
pstmt.setString(2, bean.getCity());
pstmt.setInt(3, bean.getAge());
pstmt.setString(4, bean.getTeam());
pstmt.setInt(5, bean.getNum());
int cnt = pstmt.executeUpdate();
if(cnt==1) flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
return flag;
}
//삭제
public void deleteTeam(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "DELETE FROM tblteam "
+ " WHERE num=?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
}
package ch09;
import javax.servlet.http.HttpServletRequest;
public class MyUtil {
//매개변수가 숫자이면 true, 숫자가 아니면 false
public static boolean isNumeric(String s) {
try {
Integer.parseInt(s);
return true;
} catch(NumberFormatException e) {
return false;
}
}
public static int parseInt(HttpServletRequest request,
String name) {
return Integer.parseInt(request.getParameter(name));
}
}