티스토리 뷰

WEB/DynamicWeb

[Web] DAO & DTO

춘햄 2021. 4. 28. 11:32

DTO?

DTO는 직전 포스팅에서도 언급했듯, 데이터베이스 레코드의 데이터를 맵핑하여 인스턴스로 사용하기 위해 존재하는 객체이다. 즉, 폼 필드의 이름을 그대로 가지고 있는 자바빈 객체를 맵핑하여 JSP가 사용할 수 있게끔 할 수 있도록 하는 객체.

이러한 객체를 DTO(Data Tranfer Object) 혹은 VO(Value Object) 패턴이라고 한다.

 

DTO를 생성할 시 주의 사항:

 

 1. JSP에서 사용하는 파라미터의 속성명

 2. DTO 클래스의 멤버 변수명

 3. 데이터베이스의 테이블 속성명

 

위 3가지가 모두 동일한 이름이여야 비즈니스 계층에서 쉽게 꺼내 사용할 수 있다.


◎DTO 객체 예시 코드

package com.choonham.dto;

public class GoodsDTO {

	private String code = null;
	private String title = null;
	private String writer = null;
	private int price = 0;
	
	public GoodsDTO() {
		
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
}

 


DAO?

 

DAO는 웹프로젝트를 구성할 때, DB를 사용하여 데이터를 조작하거나 조회하는 기능을 전담하도록 만드는 하나의 객체이다. DB에 대한 접근을 각 페이지가 개별적으로 수행하도록 제작하면, 사용자 한명 한명이 어떤 작업을 수행할 때마다 DB를 따로 호출하게 되는데, 이러면 해당 서버는 오버헤드를 견디지 못하고 터져버린다. (Too many connection...등)

이때, DAO를 사용하여 DB에 대한 접근을 DAO가 담당하도록 하여 데이터베이스 엑세스를 DAO 객체 하나에 몰아 다수의 원격 호출을 통해 오버헤드를 줄일 수 있다. 

 

 

DAO 생성시 주의 사항:

 1. 자기 자신을 static instance로 선언하여 인스턴스화 하지 않고 사용할 수 있지만, 직접적인 접근은 불가능하게끔 private로 명시한다.

 2. 생성자를 외부에서 객체 생성하지 못하도록 반드시 private 생성자를 가진다.

 3. 내부에서 객체를 반환할 수 있도록 메서드는 public

 4. Connection 객체는 반드시 단 한개만 static 으로 생성

 

==> 즉, DAO는 Singleton 패턴을 사용한다.


◎DAO 객체 예시 코드

package com.choonham.dao;

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

import com.choonham.dto.GoodsDTO;

/** 데이터베이스 접속, 쿼리 실행에 관련된 모든 메서드를 싱글톤 패턴으로 보유한다. **/
public class GoodsDAO {
	
	private static GoodsDAO instance = null;
	
	private GoodsDAO() {
		// TODO Auto-generated constructor stub
	}
	
	public static GoodsDAO  getInstance() {
		if(instance == null) {
			instance = new GoodsDAO();
		}
		return instance;
	}
	
	public Connection getConnection() {
		Connection conn = null;
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String userid = "choonham";
		String userpwd = "6725";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, userid, userpwd);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	
	/**코드 값을 이용하여 데이터 검색 **/
	public GoodsDTO getGoods(String code) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "SELECT * FROM GOODSINFO WHERE CODE = ?";
		GoodsDTO dto = null;
		
		try {
			conn = this.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, code);
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				dto = new GoodsDTO();
				dto.setCode(rs.getString("code"));
				dto.setTitle(rs.getString("title"));
				dto.setWriter(rs.getString("writer"));
				dto.setPrice(rs.getInt("price"));
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return dto;
	}
	
}

위 코드는 데이터베이스에 있는 자료를 검색하는 메서드만 작성하였지만, DAO는 앞서 언급했듯, 데이터를 다루는 모든 메서드를 가지고 있어야 한다.

Comments