티스토리 뷰
Goal
- DAO와 DTO의 개념에 대해 이해한다.
- DAO, DTO를 사용하는 이유에 대해 이해한다.
- DAO, DTO를 사용한 예제를 코드를 통해 알아본다.
1. DAO와 DTO란?
- 브라우저를 통해서 클라이언트가 Server로 request를 하면, 웹 서버는 DB가 필요한 경우에 DB에접근해서 여러가지 작업(insert, update 등)을 하고, 다시 DB로부터 결과값을 받아, 적당히 가공 한후, 클라이언트에게 response를 함.
- DAO : 이러한 과정에서, 웹 서버(웹 컨테이너)는 DB에의 접속 뿐만아니라, 다양한 많은 기능을 수행함. 그 중에서 DB에 접근(통신)하는 기능을 OBJECT로 모듈화하여 분리 시킨 것이 DAO(Data Access Object)임.
- DTO : Java와 DB가 관리하는 Data의 형태가 다르기 때문에(ex, 숫자자료를 Java에서는 int.. DB는 number) DB의 Data형태를 Java형태로 가공해 주는 객체. VO라 부르기도 함. 즉, DB의 형식 그대로 어떠한 인스턴스를 사용할 수 있도록 만들어 놓은 객체
1) 웹서버와 DAO, DTO의 관계도
2. 기존 방식과 차이 비교
- 기존에는 하나의 서블릿 파일에서 데이터와의 모든 통신이 이루어졌음(BookServlet코드의 파일이 길어짐).
- 모듈화를 통해 서블릿 파일에서 DB와 작업을 수행하는 모든 기능은 DBO로 빼내고, DB와 작업을 수행할 때 같은 형식으로 값을 받아오는 역할을 하는 객체는 DAO파일로 뽑아낸다.
- DAO파일는 DB와 작업을 할때, DTO파일은 데이터를 변환하는 작업을 수행함
- DB와 통신하는 부분을 DAO와 DTO를 이용하여 처리함(모듈화)으로써, 서블릿의 코드(메소드만 호출하면 됨)는 심플해짐.
3. 코드 예제
3-1 초기 코드
-하나의 Servelt에 DB와 통신하는 코드와 Java코드가 같이 있음.
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
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("/newbook2")
public class NewBook2 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"; //Driver
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; //DB의 IP와 port번호
String id = "SYS as sysdba";
String pw = "1234";
Connection con = null; //connection 객체
Statement stmt = null; // statement 객체
ResultSet res = null;
try {
Class.forName(driver); //driverloading
con = DriverManager.getConnection(url, id, pw);
stmt = con.createStatement();
String sql = "SELECT * FROM member";
res = stmt.executeQuery(sql); //select일 떄만 executeQuery 사용
// select from을 통해 받아온 data를 res셋에 받아놓는다.
while (res.next()) {
String memberID = res.getString("member_ID");
String memberPW = res.getString("member_PW");
String memberName = res.getString("member_NAME");
String memberPhone = res.getString("member_PHONE");
out.print("memberID : " + memberID + ", ");
out.print("memberPW : " + memberPW + ", ");
out.print("memberName : " + memberName + ", ");
out.print("memberPhone : " + memberPhone + "<br>");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3-2 DAO 객체 생성
package com.servelt.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import com.servelt.dto.BookDTO;
//DAO객체를 이용해서 DB에서 데이터를 가져옴
public class BookDAO {
String driver = "oracle.jdbc.driver.OracleDriver"; //Driver
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; //DB의 IP와 port번호
String id = "SYS as sysdba";
String pw = "1234";
public BookDAO() {
try {
Class.forName(driver); //1) driver로딩
} catch (Exception e) {
e.printStackTrace();
}
}
//2) select() 메서드 호출을 하면
public ArrayList<BookDTO> select(){
//3) ArrayList를 만들어서, DB에서 가져온 값들은 담는다.
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 member";
pstmt = con.prepareStatement(sql);
res = pstmt.executeQuery();
while (res.next()) {
String memberID = res.getString("member_ID");
String memberPW = res.getString("member_PW");
String memberName = res.getString("member_NAME");
String memberPhone = res.getString("member_PHONE");
BookDTO bookDTO = new BookDTO(memberID, memberPW, memberName, memberPhone);
list.add(bookDTO); //4) add로 담고
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(res != null) //5) 자원반납
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list; //6) list반납
}
}
3-3 DTO 객체 생성
package com.servelt.dto;
public class BookDTO {
String memberId;
String memberPW;
String memberName;
String memberPhone;
public BookDTO(String memberId, String memberPW, String memberName, String memberPhone) {
this.memberId = memberId;
this.memberPW = memberPW;
this.memberName = memberName;
this.memberPhone = memberPhone;
}
public String getMemberId() {
return memberId;
}
public String getMemberPW() {
return memberPW;
}
public String getMemberName() {
return memberName;
}
public String getMemberPhone() {
return memberPhone;
}
}
3-4 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;
import com.servelt.dao.BookDAO;
import com.servelt.dto.BookDTO;
@WebServlet("/newbook2")
public class BookServelt extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
BookDAO bookDAO = new BookDAO(); //객체를 만드는 순간, driver를 로딩함.
ArrayList<BookDTO> list = bookDAO.select();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
기존의 Servlet코드에서 데이터 베이스와 통신하기 위한 기능을 모듈화하여 코드를 간결하게 만들고, 묘듈화코드를 통해 재사용성을 높힘.
'JSP > 인프런 JSP' 카테고리의 다른 글
21. 파일 업로드 (0) | 2020.03.01 |
---|---|
19. Connection Pool (0) | 2020.02.23 |
17. JDBC (0) | 2020.02.21 |
16. 데이터베이스 -1 (0) | 2020.02.21 |
14. 자바 빈 (0) | 2020.02.19 |
- 20200428
- 20200319
- 20200504
- 20200317
- 20200804
- 20200427
- 20200429
- 20200406
- 20200413
- 20200424
- 20200425
- 20200415
- 20200423
- 20200624
- 20200403
- 20200417
- 20200420
- likelion
- 20200512
- 20200510
- 생활코딩리눅스
- 20201204
- 20200503
- 20200421
- 20200330
- 백준
- 20200502
- chapter7
- 20200622
- chapter8
- Total
- Today
- Yesterday