- DTO 와 VO 의 차이점2019년 10월 16일
- 조별하
- 작성자
- 2019.10.16.:24
오늘은 DTO와 VO에 관하여 알아보자
DTO는 Data Transfer Object의 약자로서,
VO ( Value Object )랑 혼용해서 쓴다.
보통은 DTO와 VO를 혼용해서 사용들 하지만,
두 약자가 어떻게 다른지 알아보고 가도록 하자
DTO란?
풀 명칭에서 유츄 할 수 있드시, 데이터를 오브젝트로 변환하는 객체이다.
중요한 것은 주체가 누구인가를 아는 것이 중요하다.
Data Transfer Object에서 Object는 우리가 만드는 DTO 클래스이다. PersonDTO를 예를들자면, 아래와 같다.package kr.co.basicspring.test03; public class LoginVO { // Value Object private String id; private String pw; public LoginVO() {} public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } @Override public String toString() { return "LoginVO [id=" + id + ", pw=" + pw + "]"; } }
위 클래스는 id, pw 필드에 데이터를 쓰고/읽는 역할인 setter/getter가 존재한다.
여기서 중요한건 Property(프로퍼티) 개념이다. 자바에서, 프로퍼티라는 개념을 사용하기 위해 우리는 지켜야 할 약속이 있다. setter/getter에서 set과 get 이후에 나오는 단어(또는 단어들)가 property라고 약속한다.
따라서, 윗 클래스에서의 프로퍼티는 id과 pw이다.
중요한 점은 프로퍼티는 멤버변수 id,pw로 결정되는 것이 아닌 getter/setter에서의 id과pw임을 명심해야한다.
다른 말로 하자면 멤버변수의 변수명은 아무렇게나 지어도 영향이 없고 setter/getter로 프로퍼티를 표현 한다는 의미이다.이러한 프로퍼티 개념을 왜 설명하냐면, DTO에 들어갈 데이터 셋팅 때문이다. 자바는 다양한 프레임워크에서 데이터 자동화 처리를 위해 리플렉션 기법을 사용한다. 데이터 자동화 처리에서 제일 중요한것은 표준규격이다. 예를 들어, 윗 클래스 DTO에서 property가 id,pw면 id, pw의 키값으로 들어온 데이터는 리플렉션 기법으로 setter를 실행시켜 데이터를 넣을 수 있다. 중요한 것은, 우리가 setter를 요청하는 것 이 아닌, 프레임워크단(우리눈에 안보이는)에서 setter가 실행된다는 점이다. 그로 인하여, Layer간(쉽게 한가지 예를 들자면, 서버 코딩 -> view 코딩)에 데이터를 넘길때는 DTO를 쓰면 편하다는 것이다. 데이터가 자동적으로 클래스화가 된다는 것이다. 한가지 더 예를 들자면,
form 에서 id 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 , 값을 받아야할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 id속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 LoginDTO를 자료형으로 값을 받을 수 있다는 것이다. 결론적으로, key & value로 존재하는 데이터는 자동화 처리된 DTO로 변환되여 우리는 손 쉽게 데이터가 셋팅된 오브젝트를 받을 수 있다. 우리가 흔히 마주치는 JSP에서 JavaBeans 또한 표준규격 DTO며, json 조차도 프로퍼티 규격만 잘 지킨다면, 얼마든지 편하게 DTO로 받을 수 있다.
VO란?
DTO와 마찬가지로 풀 명칭에서 유추 할 수 있드시, 값 오브젝트이다. 값 오브젝트는 말 그대로 값을 위해 쓰는것이다.
자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다.
불변 클래스라 하면, readOnly 특징을 가진다. 예를 들자면 String,Integer,Color 클래스등이 있다.
이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다.
Color 클래스를 예로 들어 설명 해보자면, Red를 표현 하기 위해서는 Color.RED등 과 같이 값을 표현하기 위해 getter 기능만이 존재한다.
왜 DTO랑 VO랑 혼용해서 사용할까?
DTO도 VO도 결론적으로는, 직접 데이터를 넣어주기 보다는 넣어진 데이터를 getter를 통해 사용하므로 주 목적은 같다. 하지만 앞서 설명했드시, DTO는 불변 클래스 성격과는 거리가 멀다. 또한, DTO는 인스턴스 개념이고 VO는 리터럴 값 개념이다. (엄연히 말해서 리터럴을 흉내 낸것이지만)
출처: https://mommoo.tistory.com/61 [개발자로 홀로 서기]'JAVA 교육 > Spring' 카테고리의 다른 글
2019/10/16 Maven 라이브러리 다운 방법 (0) 2019.10.16 2019/10/16 Spring 로그인 폼 (0) 2019.10.16 2019/10/15 Spring 요청 명령어 를 받는 다양한 방식 & Filter(필터) (0) 2019.10.15 2019/10/15 Spring 프로젝트생성 및 환경구축 (사칙연산 test) (0) 2019.10.15 2019/10/14 Framework (myBatis ) (0) 2019.10.14 다음글이전글이전 글이 없습니다.댓글