티스토리 뷰

JSP/인프런 JSP

18. DAO와 DTO

GrapeMilk 2020. 2. 23. 12:07

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를 이용하여 처리함(모듈화)으로써, 서블릿의 코드(메소드만 호출하면 됨)는 심플해짐. 

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
댓글