반응형

DTO(Data Transfer Object)

 

개념


이름과 같이 계층 간 데이터 교환을 위해 사용하는 객체다.

*여기서 말하는 계층이란, View - Controller - Service - DAO와 같은 각 계층을 말한다.

VO와 혼용되어 쓰이나, 이는 보통 DTO를 지칭하는 말이다.

데이터를 담을 private 변수와 그 변수를 조작할 수 있는 Getter, Setter 메서드로 구성돼있음..

 

데이터를 오브젝트로 변환하는 객체 Getter, Setter 메서드로 구성!

 

 

사용 이유


form, ajax에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 ,

값을 받아야 할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name 속성의 이름이랑 매칭 되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 UserDTO를 자료형으로 값을 받을 수 있음

 

말이 어려워졌는데, 한 상황으로 정리하겠습니다.

DB : 데이터 줄게

DAO : 일일이 담기 귀찮다. 딱 맞는 바구니에 담을 수 없을까?

DAO : 아 유레카! 주는 데이터에 맞춰서 데이터 형식들을 만들어 놓은

클래스를 만들어야겠군 이름은 DTO라고 불러야겠다.

 

DB 값 → DAO Service DTO

 

문법


List<Company>  result = menuservice.getCompanyList();
//getCompanyList() == select * from Company;
//DB 컬럼 이름에 맞춘 Company 클래스(DTO)에 자동으로 데이터 삽입됨
//예시 DTO
public class Company {

private int id;

private String name;

private String address;

private String registration_number;

private String representative;

private String description;

private String created_on;

private String updated_on;

public int getId() {
return id;

}

public void setId(int id) {
this.id = id;

}

public String getName() {
return name;

}

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

}

public String getAddress() {
return address;

}

public void setAddress(String address) {
this.address = address;

}

public String getRegistration_number() {
return registration_number;

}

public void setRegistration_number(String registration_number) {
this.registration_number = registration_number;

}

public String getRepresentative() {
return representative;

}

public void setRepresentative(String representative) {
this.representative = representative;

}

public String getDescription() {
return description;

}

public void setDescription(String description) {
this.description = description;

}

public String getCreated_on() {
return created_on;

}

public void setCreated_on(String created_on) {
this.created_on = created_on;

}

public String getUpdated_on() {
return updated_on;

}

public void setUpdated_on(String updated_on) {
this.updated_on = updated_on;
}

@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", address=" + address + ", registration_number="
+ registration_number + ", representative=" + representative + ", description=" + description
+ ", created_on=" + created_on + ", updated_on=" + updated_on + "]";
}
}

VO(Value Object)

 

개념


값을 가진 객체

데이터만 가지고 있다는 것만 보면 DTO와 비슷한데,

가장 큰 특징은 value가 같으면 같은 객체라고 보는 거예요.

Company a = new Company("대기업");
Company b = new Company("대기업");

a.hashCode();
b.hashCode();

해쉬 값이 동일하다. 즉 같은 것으로 판단

 

그리고  read-only 값을 가지고 있음 즉, 변하지 않는 immutable 한 성질을 가지고 있음. 중간에 값을 바꿀 수가 없음.

 

 

문법


DTO와 VO를 구분할 수 있는 아주 좋은 형태

get/set = DTO

get = VO

 

setter는 없고 getter만 있는 형태!

public class BoardVO {
	
	private int id;
	private String subject;
	private String context;
	private String attachments;
	private int likes;
	private int views;
	private int writer;
	private Date create_time;
	public int getId() {
		return id;
	}
	public String getSubject() {
		return subject;
	}
	public String getContext() {
		return context;
	}
	public String getAttachments() {
		return attachments;
	}
	public int getLikes() {
		return likes;
	}
	public int getViews() {
		return views;
	}
	public int getWriter() {
		return writer;
	}
	public Date getCreate_time() {
		return create_time;
	}
	
	@Override
	public String toString() {
		return "BoardVO [id=" + id + ", subject=" + subject + ", context=" + context + ", attachments=" + attachments
				+ ", likes=" + likes + ", views=" + views + ", writer=" + writer + ", create_time=" + create_time + "]";
	}
	
}

DTO VS HashMap


DTO 쓰지 않고 HashMap을 쓰면 안 될까?

 

가장 큰 이유는 compile time 오류와 관련 있습니다.

HashMap은 컴파일 시에 오류를 잡아내질 못합니다.

 

DTO

dto.setName("gildong");
String name = dto.getName();

HashMap

map.put("name", "gildong");
String name = map.get("name");

정리


HashMap 단점

 

1. 해쉬 맵은 get이나 put에서의 key가 잘못돼도 컴파일 시에는 에러를 잡아내질 못함.

     즉, map.put("names")라고 해도 에러가 나질 않죠.

     반면에, dto.steNames() 나 dto.getNames()는 에러가 나서 컴파일조차 되지 않을 겁니다.

 

2. 데이터 타입에 대한 에러를 잡아내질 못합니다.

    String인지 Integer인지를 컴파일 시에는 모르죠.

 

3. 해쉬 맵은 프로그램 말고도 별도의 정보가 필요합니다.

    dto는 그 자체가 필요한 정보를 담고 있습니다.

    name, address, age 등 dto의 정의만 봐도 대충은 알 수 있는데 반하여,

    해쉬 맵은 이 데이터를 정의한 다른 문서가 필요합니다.

    이는 규모가 큰 프로그램일수록 더 필요하죠.

 

HashMap 장점 및 사용 이유

 

1. 데이터의 필드들이 가변적인 경우

2. 매우 복잡한 구조로 되어 있어 DTO로 규정하기는 곤란한 경우

3. DTO가 너무나 많아지는 경우

4. 한 select 문 쿼리에 여러 개의 count 정보를 담을 때

5. 한번 쓸건데, 이걸 위해 DTO를 만들기도 뭐할 때

 

반응형

+ Recent posts