DAO, DTO, VO
1. DAO (Data Access Object)
데이터베이스에 접근해서 데이터를 조회하거나 조작하는 기능을 담당하는 객체를 말한다. 데이터베이스 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용. DB에 대한 insert, update, delete, select를 처리한다.
사용자는 자신이 필요한 Interface를 DAO에게 던지고 DAO는 이 인터페이스를 구현한 객체를 사용자에게 편리하게 사용할 수 있도록 반환해준다. DB에 대한 접근을 DAO에서만 하게 되면 다수의 DB호출 문제를 해결할 수 있다. 또한 단순히 읽기만 하는 연산이므로 트랜잭션 간의 오버헤드를 감소할 수 있다. 그래서 Mybatis등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.
1-1. DAO 예제 클래스
-
DB와 연결할 Connection을 가져온다.
-
어떤 DB를 사용할 것이며, 어떤 드라이브와 로그인 정보를 사용할 것인가.
-
작업이 끝나면 사용한 리소스를 시스템에 돌려준다.
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();
}
}
2. DTO(Data Transfer Object)
계층간 데이터 교환을 위한 객체를 말한다. 계층간의 의미는 Controller, View, Business Layer, Persistent Layer를 말하며 Data도 일반적인 Database가 될 수도, 파일이나 메모리가 될 수도, 기타 다른 저장소가 될 수도 있다.
DTO를 사용하는 이유는 프로세스 간의 커뮤니케이션이 주로 개별 호출이 부담스러운 작업일 경우가 많은 원격 인터페이스(예:웹 서비스)에 의해 이루어지기 때문이다. 대부분의 개별 호출이 클라이언트와 서버 간의 왕복 시간을 소모하기 때문에, 호출 횟수를 줄이는 방법 중 하나는 몇 번의 호출에 의해 전송될 데이터를 모으는 DTO를 이용해서 한번만 호출하게 하는 것이기 때문이다.
DTO의 구현은 로직을 가지지 않는 순수한 데이터 객체이고 getter, setter 메소드만 가진 클래스로 작성한다.
2-1. DTO 클래스 예제
public class TestDto {
private String name;
private int value;
private String data;
public String getName() {
return name;
}
public void setName(String name) {
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;
}
}
3. VO(Value Object)
VO는 DTO와 혼용해서 쓰이긴 하지만 VO는 값 오브젝트로써 값을 위해 쓰입니다. 자바는 값 타입을 표현하기 위해 불변 클래스를 만들어서 사용하는데, 불변이라는 것은 readOnly 특징을 가집니다.
이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다는 특징이 있다.
예를들어 Color클래스를 보면 Red를 표현하기 위해 Color.RED 등을 사용하며 getter기능만이 존재함
참고
1. https://lemontia.tistory.com/591
2. https://jungwoon.github.io/common%20sense/2017/11/16/DAO-VO-DTO/