Back-End

DTO, DAO, VO 차이점

stars_one 2025. 4. 11. 23:48

 

 

 

이름이 헷갈리는 DTO, DAO, VO 를 알아보도록 하자.

 

나도 잘 모르던 이번 기회에 개념을 명확히 해보려고 한다.

 

 

DAO

 

 

DAO는 Data Access Object의 약자로, DB의 데이터에 접근하기 위한 객체를 가리킨다.

 

DB에 접근하기 위한 로직을 따로 분리해서 객체로 만든다.

 직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

 

예를 들자면, 이런식이다.

public class UserDaoImpl implements UserDao {

    private JdbcTemplate jdbcTemplate;

    // JdbcTemplate 설정자 주입
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void addUser(User user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }

    @Override
    public User getUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
    }


}

 

 

 

DTO

 

DTO는 데이터 전송 객체로(Data Transfer Object),

주로 데이터베이스와 애플리케이션 간의 데이터 전송을 위해 사용되는 객체이다.

 

DTO는 데이터 전송을 목적으로 하며, 데이터베이스의 엔터티와 매우 유사한 구조를 가진다.

왜냐하면, DTO는 데이터 전송 후 저장을 목적으로 하기 때문이다.

 

아래는 UserDTO이다.

public class UserDTO {
    private String name;
    private String email;
    private String password;

    // Getters and Setters ...
   
}

 

 

VO

 

VO는 Value Object의 약자로, Read-Only 속성을 가진 값 오브젝트이다.

 

자바에서 단순히 값 타입을 표현하기 위하여 불변 클래스(Read-Only)를 만들어 사용한다. 따라서 getter기능만 존재한다.

 

불변성을 가지고, 주로 비즈니스 로직에서 사용된다고 볼 수 있다.

 

public class Money {
    private final BigDecimal amount;
    private final Currency currency;

    public Money(BigDecimal amount, Currency currency) {
        this.amount = amount;
        this.currency = currency;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public Currency getCurrency() {
        return currency;
    }
}

 

728x90