1. DAO ( Data Access Object ) / VO ( Value Object )
- DAO
- DB 질의를 통해 데이터에 접근하는 객체
- DB의 한 테이블당 DAO 클래스를 하나씩 만들어 두면 유지보수가 쉬워집니다.
- 예를 들어, User, Post 라는 두 테이블이 있을 때, User 테이블의 데이터를 접근하고 싶다면 UserDAO 클래스를 만들고, 마차간지로 Post 테이블에 접근하고 싶다면 PostDAO 클래스를 만들어서 관리를 할 수 있습니다.
- VO
- DB의 한 테이블에 존재하는 컬럼들을 멤버 변수로 작성하여, 테이블의 컬럼 값을 java에서 객체로 다루기 위해 사용합니다.
- 즉, 데이터들을 캡슐화 해서 객체로 만든 것입니다.
- 예를 들어 User 테이블에 id, name, phone 컬럼이 있다면, UserVO 클래스에는 id, name, phone 멤버 변수가 존재하고 이에 대한 접근은 getter, setter로 다룹니다.
2. DAO와 VO의 흐름
DAO와 VO를 어떻게 다루는지 살펴보기 위해, 회원가입 상황을 가정해보겠습니다.
회원가입 페이지에는 아이디, 비밀번호와 같은 데이터들을 입력할 수 있는 form이 있을 것이고,
Servlet에서는 회원 데이터가 넘어오면 이 값들을 DB의 User 테이블에 저장해야 합니다.
User 테이블에는 id와 password라는 칼럼이 있다고 가정하겠습니다.
UserVO와 UserDAO는 다음과 같은 작업을 수행합니다.
- UserVO
- id, password 멤버 변수를 갖고 있음
- 사용자의 입력 값을 각 변수에 할당 시키는 작업을 수행
- UserDAO
- DB에 JDBC로 연결하여, Connection을 생성
- 회원 정보를 VO 객체로 받아서 DB에 INSERT 하기 위한 쿼리를 작성하여 실행
3. DAO , VO 구현
이제 위의 상황을 구현해보도록 하겠습니다.
MVC 패턴에 맞게 Servlet과 JSP을 사용할 것입니다.
여기서 JSP는 단순 HTML 문서와 같고, Serlvet은 Controller답게 요청을 처리하고 데이터를 추가하는 코드가 작성되어 있습니다.
디렉토리 구조는 다음과 같습니다.
1) UserVO 클래스 생성
먼저 VO 클래스를 만듭니다.
VO라고 해서 특별한 파일이 아니고, 그냥 클래스 파일을 만들면 됩니다.
/Java Resources/UserVO.java
public class UserVO {
private String name;
private String email;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
- VO 클래스는 캡슐화 하고자 하는 DB 테이블의 컬럼명과 동일하게 멤버 변수를 갖으면 됩니다.
- 예제에서는 name, email, pwd 컬럼이라고 가정하겠습니다.
- private으로 선언
- getter와 setter를 통해 멤버 변수에 접근합니다.
- 참고로 Spring이나 JSP를 보완한 JSTL라이브러리에서는 VO 멤버변수를 getter, setter로 접근하도록 자동으로 처리하기 때문에, getter와 setter 메서드를 작성하는 것이 좋습니다.
빠르게 getter, setter를 작성하려면 IDE를 이용합니다.
이클립스 상단 탭 -> Source
Generate Getters and Setters
2) UserDAO 클래스 생성
다음으로 UserDAO 클래스를 만듭니다.
/Java Resources/UserDAO.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UserDAO {
private Connection getConnection() throws SQLException {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/test";
conn = DriverManager.getConnection(url, "test", "test");
}
catch (ClassNotFoundException e) {
System.out.println(" 드라이버 로딩 실패 ");
}
return conn;
}
public boolean insert(UserVO vo ) {
boolean result = false;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
// Column
// PK , name , email , password
String sql = "INSERT INTO user VALUES (null, ?, ?, ?);";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, vo.getName());
pstmt.setString(2, vo.getEmail());
pstmt.setString(3, vo.getPwd());
int count = pstmt.executeUpdate();
result = (count == 1);
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
if( conn != null ) {
conn.close();
}
if( pstmt != null ) {
pstmt.close();
}
}
catch(SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
DB에 Connection을 하고, 쿼리를 수행하는 부분, 즉 JDBC를 사용하는 부분은 여기를 참고해주세요.
보시는 바와 같이 DAO의 역할은 DB에 접근해서 쿼리를 수행하는 것이 전부입니다.
여기서 insert() 메서드는 인자로 UserVO 객체를 받고 있다는 점에 주목해주세요.
뒤에서 작성할 Servlet에서 UserDAO.insert() 메서드를 호출하는데, 이 때 클라이언트가 입력한 정보들을 전달해주기 때문입니다.
3) 설정
위의 코드가 실행되려면, JDBC 라이브러리를 프로젝트 폴더에 추가하는 작업이 필요합니다.
웹 프로젝트를 우클릭하여 Properties를 클릭합니다.
위의 순서대로 클릭하여, User Library를 등록하도록 하겠습니다.
- User Library 클릭 후 next
- 우측의 User Libraries 클릭
- 우측 가장 위에 있는 New 클릭
- 라이브러리 이름을 입력 ( 저는 JDBC 라는 이름으로 작성했습니다. )
- 우측의 Add External JARs 클릭
- 벤더 사의 Connector.jar 파일을 등록
- apply를 클릭하여 JDBC Driver를 등록
한 가지 더, 톰캣이 JDBC를 알기 위한 작업이 필요합니다. ( 설정이 꽤 복잡하네요.. ㅎㅎ )
프로젝트 폴더 우클릭하여 Properties를 클릭합니다.
위의 순서대로 클릭을 하신 후, 방금 전에 추가한 User Library를 등록하면 됩니다.
그러면 톰캣이 JDBC 라이브러리를 알고 사용할 수 있게 되었씁니다.
4) Servlet 작성
이어서 Servlet 클래스를 작성해보겠습니다.
/Java Resources/UserSerlvet.java
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;
@WebServlet("/add")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
UserVO vo = new UserVO();
vo.setName(request.getParameter("name"));
vo.setEmail(request.getParameter("email"));
vo.setPwd(request.getParameter("pwd"));
UserDAO dao = new UserDAO();
dao.insert(vo);
response.sendRedirect("/daovo/form.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 요청 객체의 getParameter() 메서드를 호출하여, 클라이언트로부터 회원정보 데이터( name , email , password )의 정보들을 받은 뒤에 그 값들을 UserVO 객체에 할당합니다.
- UserDAO 객체의 insert() 메서드를 호출하여 인자로 UserVO 객체를 전달합니다.
- 그러면 위에서 봤던 것 처럼 DAO 객체에서는 쿼리를 날려서 DB에 해당 유저 정보를 insert 합니다.
- 회원 정보가 등록되면, 클라이언트에게 응답 페이지를 보여줘야 하므로 jsp파일로 redirect 합니다.
redirect된 jsp파일은 회원가입 입력 폼으로 다음으로 살펴보겠습니다.
5) JSP 파일 생성
마지막으로 회원가입 입력 form인 JSP파일을 만들겠습니다.
/WebContent/form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/daovo/add" method="get">
<p><input type="text" name="name" placeholder="이름"></p>
<p><input type="text" name="email" placeholder="이메일"></p>
<p><input type="password" name="pwd" placeholder="비밀번호"></p>
<p><input type="submit" value="회원가입"></p>
</form>
</body>
</html>
간단한 form태그만 있는 HTML 문서입니다.
회원가입 버튼을 누르면 /daovo/add URL로 요청이 됩니다.
Servlet에서 URL 매핑을 /add 으로 정의했기 때문에, /daovo/add 라는 요청이 오면 UserServlet이 실행됩니다.
6) 테스트
이제 톰캣에 daovo 웹 프로젝트를 등록하고, URL에 localhost:8080/daovo/form.jsp 를 입력해서 회원가입 하면, DB에 데이터가 추가되는 것을 확인할 수 있을 것입니다.
테이블을 정의하는 내용까지 언급하는 것은 글이 길어지기 때문에 생략을 했는데, 간단하게 테이블을 만들어서 테스트 해보셔도 좋을 것 같습니다.
이상으로 Servlet/JSP MVC 패턴으로 DAO와 VO를 간단하게 테스트 해보았습니다.
이렇게 Serlvet으로 요청을 받아서 JSP로 뷰 페이지를 뿌려주는 모델2 방식이 일반적입니다.
그러면 JSP가 컨트롤러 역할까지 하는 모델1 방식은 어떤 문제점이 있을까요?
다음 글에서는 모델1 방식의 문제점을 알아보기 위해, 게시판을 만들어 보도록 하겠습니다.