데이터를 담거나 DB로 데이터를 보내는 작업을 하는 객체를 말한다.
View 상의 사용자 입력을 담아 가지고 있는 역할을 하며, Controller에서 상태 변화를 알려주면 자기자신의 상태를 변경하여 View에게 알려주는 역할을 한다.
DTO를 통해 상태를 주고 받으며 DB와의 데이터 통신을 위해 DAO를 사용한다.
Model을 화면상에 보여주는 부분을 말한다.
Model의 변화된 상태를 가져와서 보여준다.
View에서의 데이터 입력을 Controller에 전달한다.
Controller가 선택한 View를 보여준다.
Model과 View간의 데이터 전달 및 결과에 대한 View를 선택하여 응답하는 역할을 한다.
MVC 구조 활용 예시
사용자 등록하는 기능 구현해본다.
0. 사용자 정보를 관리하기 위한 DB 테이블을 생성한다.
1. 사용자 등록을 위한 html 페이지를 작성한다. (View)
MVC_Test_Register.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>회원가입</title>
</head>
<body>
<!--
submit 버튼 클릭시 action에 정의한 행위(register.do)를 하도록 연결해주는 부분이
WebContent/WEB-INF/web.xml 이다.
-->
<form name="registerForm" action="register.do" method="post">
번호 : <input type="text" name="num"/><br/>
이름 : <input type="text" name="name"/><br/>
전화 : <input type="text" name="tel"/><br/>
주소 : <input type="text" name="addr"/><br/>
<input type="submit" value="가입"/>
</form>
</body>
</html>
2. 사용자 페이지에서 넘어오는 데이터 저장을 위한 DTO 클래스를 작성한다. (Model)
MVC_Test_MemberDTO.java
package com.study;
import java.io.Serializable;
public class MVC_Test_MemberDTO implements Serializable {
private int num;
private String name;
private String tel;
private String addr;
public int getNum() {
return num;
}
public void setNum(int _num) {
this.num = _num;
}
public String getName() {
return name;
}
public void setName(String _name) {
this.name = _name;
}
public String getTel() {
return tel;
}
public void setTel(String _tel) {
this.tel = _tel;
}
public String getAddr() {
return addr;
}
public void setAddr(String _addr) {
this.addr = _addr;
}
}
3. DTO에 저장된 데이터를 DB로 저장하는 작업을 하는 DAO 클래스를 작성한다. (Model)
MVC_Test_MemberDAO.java
package com.study;
import java.sql.*;
public class MVC_Test_MemberDAO {
private static Connection conn;
// 생성자에 드라이버를 찾도록 해놓는다.
public MVC_Test_MemberDAO() {
try {
Class.forName("org.gjt.mm.mysql.Driver");
} catch (ClassNotFoundException _ex) {
System.out.println("드라이버를 찾을 수 없습니다.");
}
try {
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test"
, "root"
, "93948195");
} catch (SQLException _ex) {
System.out.println("SQL 오류: " + _ex.getLocalizedMessage());
}
}
public boolean insertMember(MVC_Test_MemberDTO _dto) {
boolean retval = false;
String query = "insert into MVC_Test_Member values (?, ?, ?, ?)";
try {
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setInt(1, _dto.getNum());
pstmt.setString(2, _dto.getName());
pstmt.setString(3, _dto.getTel());
pstmt.setString(4, _dto.getAddr());
if (pstmt.executeUpdate() < 1) {
System.out.println("정상적으로 수행되지 않았습니다.");
} else {
retval = true;
}
pstmt.close();
} catch (SQLException _ex) {
System.out.println("SQL insert 오류: " + _ex.getLocalizedMessage());
}
return retval;
}
public void close() {
try {
if (conn != null) {
conn.close();
conn = null;
}
} catch(SQLException _ex) {
System.out.println("SQL 오류: " + _ex.getLocalizedMessage());
}
}
}
4. 사용자 페이지에서 넘어온 데이터를 DTO에 넣고 DAO 클래스의 관련 메서드에 전송하는 작업을 하고, 그 작업 결과에 따라 이동할 페이지를 결정하는 클래스를 작성한다. (Controller)
MVC_Test_MemberProcess.java
package com.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MVC_Test_MemberProcess extends HttpServlet {
/* 이 객테를 호출하는 html의 method가 post일 경우 [doPost]가 자동 호출 된다.
get일 경우 [doGet]이 자동 호출된다.
post든 get이든 둘다 호출하려면 service를 구현한다. */
@Override
public void doPost(HttpServletRequest _request, HttpServletResponse _response)
throws ServletException, IOException {
String uri = _request.getRequestURI();
System.out.println("URI: " + uri);
String cmd = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf(".do"));
System.out.println("CMD: " + cmd);
if (cmd != null && cmd.trim().equals("register")) {
String num = _request.getParameter("num");
String name = _request.getParameter("name");
String tel = _request.getParameter("tel");
String addr = _request.getParameter("addr");
MVC_Test_MemberDTO dto = new MVC_Test_MemberDTO();
dto.setNum(Integer.parseInt(num));
dto.setName(name);
dto.setTel(tel);
dto.setAddr(addr);
MVC_Test_MemberDAO dao = new MVC_Test_MemberDAO();
if (dao.insertMember(dto)) {
_response.sendRedirect("MVC_Test_Success.htm");
} else {
_response.sendRedirect("MVC_Test_Fail.htm");
}
} else if (cmd.trim().equals("update")) {
// 해당 작업 수행
}
}
}
5. 서블릿 정보를 등록한다.
web.xml
....
<servlet>
<servlet-name>myController</servlet-name> <!-- 1. myController라는 서블릿이 있다. -->
<servlet-class>com.study.MVC_Test_MemberProcess</servlet-class> <!-- 2. 이 서블릿은 MVC_Test_MemberProcess 클래스를 의미한다. -->
</servlet>
<servlet-mapping>
<servlet-name>myController</servlet-name> <!-- 2. url-pattern에 해당하는 서블릿은 myController 이다. -->
<url-pattern>*.do</url-pattern> <!-- 1. url에 *.do 라는 url이 있으면... -->
</servlet-mapping>
....
6. 처리 결과에 따른 뷰 페이지를 작성한다. (View)
MVC_Test_Success.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Success</title>
</head>
<body>
데이터 저장 성공!
</body>
</html>
MVC_Test_Failure.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Fail</title>
</head>
<body>
저장에 실패하였습니다.
</body>
</html>
서버에 올려 확인해보자.
MVC_Test.rar