DAO, DTO 란?

kimm·2023년 8월 8일
0

DAO (Data Access Object)

  • DB의 data에 접근하기 위한 객체로 실제로 DB에 접근하는 객체
  • 프로젝트의 서비스 모델과 실제 DB를 연결하는 역할

DTO (Data Transfer Object)

  • 계층 간 데이터 교환을 하기 위해 사용하는 객체
  • 로직을 가지지 않는 순수한 데이터 객체
  • Entity를 Controller와 같은 클라이언트단과 직접 마주하는 계층에
    직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.

출처 : https://kbwplace.tistory.com/162


DAO와 DTO를 사용하기 전 일반적인 서블릿 코드
Java와 Oracle을 연결하여 DB에서 책 데이터를 검색하는 간단한 코드

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("/book")
public class Book extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		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 = "khs";
		String pw = "1234";
		
		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 + ", ");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (res != null)	res.close();
				if (stmt != null)	res.close();
				if (con != null)	res.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

이 일반적인 서블릿을 DAO와 DTO를 이용하여 분리해서 간단하게 나타내볼 것이다.


"BookDAO"

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:xe";
	String id = "khs";
	String pw = "1234";
	
	public BookDAO() {
		// 클래스 로딩, 드라이버 로딩 처리 로직
		try {
			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// 메서드 호출시 DB로부터 받은 값들을 list에 담음
	public ArrayList<BookDTO> select() {
		ArrayList<BookDTO> list = new ArrayList<>();
		
		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)	res.close();
				if (con != null)	res.close();
			} catch(Exception e2) {
				e2.printStackTrace();
			}
		}
		return list;
	}
}

"BookDTO"

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



"Book"

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

@WebServlet("/book")
public class Book extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		// dao 객체 생성 시 드라이버 로딩
		BookDAO bookDAO = new BookDAO();
		ArrayList<BookDTO> list = bookDAO.select();
		
		for (BookDTO dto : list) {
			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);
	}
}

Book 서블릿 코드가 굉장히 간단해진 것을 볼 수 있다. CRUD 로직들을 BookDAO에서 구현하고 Book 서블릿에서는 필요 메서드만 호출하면 될 것 같다.
profile
벨린이

0개의 댓글