[Spring] DTO(Data Transfer Object)와 VO(Value Object)
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를 만들기도 뭐할 때
'Spring' 카테고리의 다른 글
[Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
---|---|
[Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
[Spring] @Scheduled (0) | 2019.10.30 |
[Spring] GET과 POST의 차이점과 문법 정리 (0) | 2019.10.21 |
[Spring] annotations 정리 (0) | 2019.10.16 |