[Darabase] DAO vs DTO(VO) 비교

[Darabase] DAO vs DTO(VO) 비교


DAO(Data Access Object)

  • Database의 data에 접근을 위한 객체
  • DB에 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용

DAO설명

  • Web Server와 DB가 연결하기 위해서 매번 connection 객체를 생성하는데, 이것을 해결하기 위해 나온것은 connection pool이다.
    • Connection pool : connection 객체를 미리 만들어 놓고 그것을 가져다 씀
  • 하지만 유저 한명이 접속해서 한번에 하나의 커넥션만 일으키지 않고 게시판 하나만 봐도 목록볼때 한번, 글 읽을때마다 한번, 글쓸때 한번 등등... 엄청나게 많은 커넥션이 일어난다.
    • 커넥션 풀은 커넥션을 또 만드는 오버헤드를 효율적으로 하기 위해 DB에 접속하는 객체를 전용으로 하나만 만들고, 모든 페이지에서 그 객체를 호출해서사용
  • DAO객체 : 커넥션 하나만 가져오고 그 커넥션을 가져온 객체가 모든 DB와 연결을 하는것
  • DAO는 DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트
  • 사용자는 자신이 필요한 interface를 DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용 할 수 있도록 반환해줌
  • DB에 대한  접근을 DAO가 담당하도록 하여 DB엑세스를 DAO에서만 하게 되면 다수의 원격호출을 통한 오버헤드를 VO나 DTO를 통해 줄일 수 있고 다수의 DB호출문제를 해결할 수 있음
  • 또한, 단순히 읽기만 하는 연산이므로 트랜잭션 간의 오버헤드를 감소할 수 있음


DAO클래스 예제

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

public class TestDao {

    public void add(TestDto dto) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");

        PreparedStatement preparedStatement = connection.prepareStatement("insert into users(id,name,password) value(?,?,?)");


        preparedStatement.setString(1, dto.getName());
        preparedStatement.setInt(2, dto.getValue());
        preparedStatement.setString(3, dto.getData());
        preparedStatement.executeUpdate();
        preparedStatement.close();
        
        connection.close();

    }
}



DTO(Data Transfer Object)(=VO)

  • DTO는 VO(Value Object)로 바꿔 말할 수 있는데 계층간 데이터 교환을 위한 자바빈즈
  • 여기서 말하는 계층간은 Controller, View, Business Layer, Persistent Layer를 말함
  • 각 계층간의 데이터 교환을 위한 객체를 DTO또는 VO라고 부름
    • VO는 DTO와 같은 개념이지만 Read Only속성을 가짐
  • 일반적은 DTO는 로직을 갖고 있지 않는 순수한 데이터 객체이며 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스

DTO 클래스 예제

public class TestDto {

    private String name;
    private int value;
    private String data;

    public String getName() { //getter
        return name;
    }

    public void setName(String name) { //setter
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
출처

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?