본문 바로가기
Backend/Java

[Java] DAO, DTO, VO

by unknownomad 2021. 11. 19.

DAO: Data Access Object

1. 정의

DB의 데이터에 접근하기 위한 객체

 

2. 역할

DB 접근을 위한 로직 및 비지니스 로직 분리 목적으로 사용

 

3. 특징

DB와 연결할 Connection까지 설정되어 있는 경우 많음

Ex) Mybatis 등 사용할 시, 커넥션풀까지 제공 ➡ 즉, 별도의 DAO 만드는 경우는 드묾

 

4. 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

1. 정의

계층 간 데이터 교환 위한 자바 빈즈

Ex) Controller, View, Business Layer, Persistent Layer 등 각 계층 간 데이터 교환 위한 객체

 

2. 특징

  • 로직 없는 순수 데이터 객체
  • getter/setter 메소드만 가진 클래스

 

3. DTO 예제

public class PersonDTO {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 자바는 문법적으로 프로퍼티(Property, 데이터)를 제공하지 않음
    ➡ 지켜야 할 규약 존재

  • getter/setter의 getWord()/setWord() 에서의 Word: 프로퍼티라고 약속
    상기 클래스의 프로퍼티: name, age

  • 핵심) 프로퍼티: 멤버변수 name, age가 아닌, getter/setter의 메서드 뒤에 붙는 단어인 name, age
    (즉, 멤버변수는 다른 이름으로 지어도 영향 X, getter/setter로 프로퍼티 표현)

  • 자바는 데이터 자동화 처리 위해 리플렉션 기법 사용, 이때 가장 중요한 것은 표준 규격
    Ex) 상기 클래스 DTO의 프로퍼티인 name, age의 키값으로 들어온 데이터:
    리플렉션 기법으로 setter 실행 ➡ 데이터 삽입 가능
    (setter를 직접 요청 X, 눈에 보이지 않는 프레임워크 내부에서 setter가 실행됨)

  • 이러한 이유로 레이어 간 데이터 전달 시(특히 서버 ➡ 뷰로 이동) DTO 사용하면 매우 용이함
    뷰의 form에서 name 필드 값을 프로퍼티에 맞춰 넘김
    ➡ 데이터를 받는 곳에서 name 속성의 이름과 매칭되는 프로퍼티에 자동으로 DTO가 인스턴스화 됨
    ➡ PersonDTO를 자료형의 값으로 받을 수 있음
    즉, key-value 로 존재하는 데이터: 자동화 처리된 DTO로 변환되어 데이터가 세팅된 객체를 쉽게 받을 수 있음

 


VO: Value Object

1. 정의

값 객체, 즉, 값을 위해 쓰임

 

2. 특징

  • 자바는 값 타입 표현을 위해 불변 클래스를 만들어 사용
  • 불변 = readOnly
  • getter기능만 존재
  • 중간에 값 변경 불가 ➡ 새로 만들어야 함

3. VO vs DTO

1) 공통점

전달된 값을 getter 통해 사용

 

2) 차이점

  • DTO: 가변적 클래스(setter 존재, 값 변경 가능)
  • VO: 불변적 클래스(읽기 전용)

 


출처: https://lemontia.tistory.com/591

댓글