DAO는 Data Access Object의 약자이고 DTO는 Data Transfer Object의 약자입니다.
둘다 객체라고 할수 있습니다.
브라우저를 통해서 웹서버쪽으로 요청을 하게됩니다.
요청을 하면 웹서버는 데이터베이스가 필요한 경우 데이터베이스에 접근하여 데이터베이스에서 쿼리를 수행하고 결과값을 받아서 웹서버에서 가공을 한후에 다시 브라우저로 응답하게됩니다.
그런데 웹서버는 데이터베이스로 접속하는 기능 말고도 많은 기능을 합니다.
그중에서 데이터베이스로 접근하여 통신하는 기능을 오브젝트로 따로 만들어 둔 객체가 DAO객체입니다.
데이터베이스에서 관리하는 데이터와 자바에서 관리하는 데이터의 형식은 분명 다를 것입니다.
자바에서는 int와 같은 타입으로 숫자를 관리하지만 데이터베이스에서는 number타입으로 관리를 하는 등 컬럼과 변수의 형식은 분명 다릅니다.
이런 데이터의 형식이 다른 데이터베이스와 자바의 중간 매개체 역할을 해주는 것이 DTO입니다.
저는 주로 DTO라는 이름으로 이 객체를 불렀었는데 VO라고 하기도합니다!
앞선 포스팅에서 JDBC를 구현할때는 서블릿안에 DAO역할을 하는 객체를 함께 구현 했었는데 이번에는 DAO와 DTO를 따로 모듈화 시켜서 구현하려고합니다.
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
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("/bs")
public class BookServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
/*
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "scott";
String pw = "tiger";
Connection con = null;
Statement stmt = null;
ResultSet res = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url, id, pw);
stmt = con.createStatement();
String sql = "SELECT * FROM book";
res = stmt.executeQuery(sql);
while (res.next()) {
int bookId = res.getInt("book_id");
String bookName = res.getString("book_name");
String bookLoc = res.getString("book_loc");
out.print("bookId : " + bookId + ", ");
out.print("bookName : " + bookName + ", ");
out.print("bookLoc : " + bookLoc + "</br>");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(res != null) res.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
*/
BookDAO bookDAO = new BookDAO();
ArrayList<BookDTO> list = bookDAO.select();
for (int i = 0; i < list.size(); i++) {
BookDTO dto = list.get(i);
int bookId = dto.getBookId();
String bookName = dto.getBookName();
String bookLoc = dto.getBookLoc();
out.println("bookId : " + bookId + ", ");
out.println("bookName : " + bookName + ", ");
out.println("bookLoc : " + bookLoc + "</br>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
앞서서는 Servlet을 만들때 위의 코드에 주석처리가 되어있는 부분을 직접 구현을 했었는데 이제 DAO와 DTO를 구현함으로서 해당 부분은 DAO로 빠지게 될 예정입니다.
package com.servlet;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class BookDAO {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "scott";
String pw = "tiger";
public BookDAO() {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<BookDTO> select() {
ArrayList<BookDTO> list = new ArrayList<BookDTO>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet res = null;
try {
con = DriverManager.getConnection(url, id, pw);
String sql = "SELECT * FROM book";
pstmt = con.prepareStatement(sql);
res = pstmt.executeQuery();
while (res.next()) {
int bookId = res.getInt("book_id");
String bookName = res.getString("book_name");
String bookLoc = res.getString("book_loc");
BookDTO bookDTO = new BookDTO(bookId, bookName, bookLoc);
list.add(bookDTO);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(res != null) res.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
}
이처럼 DAO객체를 만들어서 DAO객체안에 해당 기능을 구현했습니다.
package com.servlet;
public class BookDTO {
int bookId;
String bookName;
String bookLoc;
public BookDTO(int bookId, String bookName, String bookLoc) {
this.bookId = bookId;
this.bookName = bookName;
this.bookLoc = bookLoc;
}
public int getBookId() {
return bookId;
}
public String getBookName() {
return bookName;
}
public String getBookLoc() {
return bookLoc;
}
}
데이터베이스와 자바간의 데이터의 중간역할을 해주는 DTO가 필요합니다!
컬럼이름을 그대로 변수이름으로 만들어주면 됩니다!
이 글은 실전 JSP (renew ver.) - 신입 프로그래머를 위한 강좌를 수강하며 공부한 내용을 정리한 글입니다.
https://www.inflearn.com/course/실전-jsp_renew/dashboard
'Java 관련 > JSP & Servlet' 카테고리의 다른 글
[JSP & Servlet] Connection Pool (0) | 2022.08.25 |
---|---|
[JSP & Servlet] JDBC (0) | 2022.08.23 |
[JSP & Servlet] filter를 통한 한글처리 (0) | 2022.08.22 |
[JSP & Servlet] JSP Servlet의 한글처리 (0) | 2022.08.21 |
[JSP & Servlet] Session (1) | 2022.08.20 |