데이터를 담거나 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!DOCTYPE html>
< html >
< head >
< meta charset = "EUC-KR" >
< title >회원가입</ title >
</ head >
< body >
< 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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(
, "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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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 {
@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
1 2 3 4 5 6 7 8 9 10 11 | ....
< servlet >
< servlet-name >myController</ servlet-name >
< servlet-class >com.study.MVC_Test_MemberProcess</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >myController</ servlet-name >
< url-pattern >*.do</ url-pattern >
</ servlet-mapping >
....
|
6. 처리 결과에 따른 뷰 페이지를 작성한다. (View)
MVC_Test_Success.htm
1 2 3 4 5 6 7 8 9 10 | <!DOCTYPE html>
< html >
< head >
< meta charset = "EUC-KR" >
< title >Success</ title >
</ head >
< body >
데이터 저장 성공!
</ body >
</ html >
|
MVC_Test_Failure.htm
1 2 3 4 5 6 7 8 9 10 | <!DOCTYPE html>
< html >
< head >
< meta charset = "EUC-KR" >
< title >Fail</ title >
</ head >
< body >
저장에 실패하였습니다.
</ body >
</ html >
|
서버에 올려 확인해보자.
MVC_Test.rar