VO, DTO, DAO

2021. 2. 27. 15:23공부 정리/Back end

1. VO (Value Object)


값 그 자체를 표현하는 객체로 로직을 포함할 수 있으며, 객체의 불변성을 보장한다.

package kr.or.connect.daoexam.dto;

public class Role {
	private final int roleId;
	private final String description;
	
	public Role(int roleId, String description) {
    	this.roleId = roleId;
        this.description = description;
    }
    
    public static Role of(int roleId, String description){
    	return new Role(roleId, description);
    }
    
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Role role = (Role) o;
    return roleId == role.roleId && description == role.description;
    }
	
}

값 그 자체를 표현하는 객체이기에 데이터 전달을 위해 가장 효율적인 방법이지만 클래스 선언을 위해 많은 코드가 필요하다.

파일수가 많아지는 것을 감수하고 Networt traffic의 이득을 가진다.

 

2. DTO (Data Transfer Object)


계층 간 데이터 교환을 위한 java Beans이다. (계층이란 컨트롤러 뷰, 비즈니스 계층, 퍼시스턴스 계층을 의미)

일반적으로 DTO는 로직을 가지고 있지 않고, 순수한 데이터 객체다.

필드와 getter, setter를 가진다.

추가적으로 toString(), equals(), hashCode()등의 Object 메소드를 오버라이딩 할 수 있다.

package kr.or.connect.daoexam.dto;

public class Role {
	private int roleId;
	private String description;
	
	public int getRoleId() {
		return roleId;
	}
	public void setRoleId(int roleId) {
		this.roleId = roleId;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	@Override
	public String toString() {
		return "Role [roleId=" + roleId + ", description=" + description + "]";
	}
	
}

 

3. DAO (Data Access Object)


데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체다.

보통 데이터베이스를 조작하는 기능을 전담하는 목적으로 만들어진다.

package kr.or.connect.daoexam.dao;

import static kr.or.connect.daoexam.dao.RoleDaoSqls.*;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;

import kr.or.connect.daoexam.dto.Role;
@Repository
public class RoleDao {
	private NamedParameterJdbcTemplate jdbc;
	private SimpleJdbcInsert insertAction;
	private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);

	public RoleDao(DataSource dataSource) {
		this.jdbc = new NamedParameterJdbcTemplate(dataSource);
		this.insertAction = new SimpleJdbcInsert(dataSource)
                .withTableName("role");
	}
	
	public List<Role> selectAll(){
		return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
	}

}

 

4. VO VS DTO


VO: 서로 다른 이름을 가진 VO 인스턴스라 해도 모든 속성이 같다면 두 인스턴스는 같은 객체라고 할 수 있다.

Role role1 = new Role(1, "abc");
Role role2 = new Role(1, "abc");

boolean bol = role1.equals(role2);

VO에서 equals()를 오버라이딩할 때 같은 결과가 나온다.

 

DTO: 메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 객체다.

Role role1 = new Role();
role1.setRoleId(1);
role1.setDescription("abc");

Role role2 = new Role();
role2.setRoleId(1);
role2.setDescription("abc");

role1 != role2;

 

VO에서 equals()를 오버라이딩할 때 두 객체는 같다는 결과를 보이지만,

DTO에서는 서로 다른 객체로 보는 차이가 있다.

 

 

 

참고 & 출처

https://youngjinmo.github.io/2021/04/dto-vo-entity

https://m.blog.naver.com/ljc8808/220462395989

https://www.boostcourse.org/web316/lecture/254339/?isDesc=false

 

'공부 정리 > Back end' 카테고리의 다른 글

MVC  (0) 2020.12.07
container  (0) 2020.11.20
REST API -Web API  (0) 2020.11.12
Maven  (0) 2020.11.11
servlet, WAS  (0) 2020.11.06