DAO와 DTO

2 minute read

DAO와 DTO !!

DAO와 DTO란 무엇인가??

  • DAO (Data Access Object) : Database의 data에 접근을 하기 위한 객체, 데이터베이스 관련 작업들을 함

    ex) driver설정 ,connection, 쿼리문 써주기

  • DTO (Data Transfer Object) : 데이터 전달 단위, 테이블의 컬럼들을 변수로 설정(캡슐화)

이전 JDBC에서는 데이터베이스관련 코드를 한 서블릿에 다 때려넣었지만, DAO와 DTO로 나누면 코드를 알아보기도 훨씬 쉬워지고 관리하기도 좋다.

image-20200320023555545

BookDTO.java

package com.servlet.dto;

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;
	}

	
}

BookDTO는 테이블에 있는 레코드이름들을 필드명으로 사용해주고 생성자,게터세터(생략)도 설정해준다.

BookDAO.java

package com.servlet.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.servlet.dto.BookDTO;


public class BookDAO {
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	String id = "scott";
	String pw = "tiger2";
	
	//데이터베이스 연결전 값 설정
	
	public BookDAO(){
		try {
			Class.forName(driver);
			//생성자에 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 e){
				e.printStackTrace();
			}	
		}
		
		return list;
	}
	
}

BookServlet.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 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.servlet.dao.BookDAO;
import com.servlet.dto.BookDTO;


@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();
		
		//기존에 이 서블릿에 한번에 다 써줬었다 -> DAO, DTO 로 나누어줌 
		/*
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
		String id = "scott";
		String pw = "tiger2";
		
		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.println("bookId : "+bookId+",");
				out.println("bookName : "+bookName+",");
				out.println("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 e){
				e.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);
	}

}

실행 결과

image-20200320024109071

아직은 나눈 코드가 낯선데, DAO DTO 분리하는 코드에 익숙해지도록 많이 봐야겠다 ㅎㅎ..

Comments