DTO와 VO의 혼용 사용
초판에는 VO를 사용하다 혼동의 여지가 있어 TO로 다시 냈고
DTO는 TO앞 D(Data)의 줄임말 이다
결론 먼저
결론부터 말하자면 DTO는 데이터 전달용
VO는 값 표현용 이다.
DTO란?
DTO는
=Data TransFer Object의 약자이다 번역을 해보면 데이터를 전달하기 위해 사용하는 객체이며
데이터를 주고받을때 데이터를 담아서 전달하는데 사용하는 바구니라고 생각하면 이해하기가 쉽다
구체적으로 계층간 데이터를 전달하기 위해서 사용한다
Web Layer에 해당하는 컨트롤러가 있고 Service Layer에 해당하는 Service가 있다.
둘 사이에서 데이터를 주고받기 위해 DTO에 데이터를 담아 전달한다.
데이터 전달용인 DTO는
오직 getter/setter 메서드 만을 갖는다
다른 로직은 가지고 있지 않다 왜냐하면 순수하게 데이터 전달만을 위한 객체이기 때문이다.
보내는 쪽에서 setter 를 사용해 데이터를 DTO에 담아 보내고
받는쪽에서 getter를 사용해 전달받은 데이터로부터 데이터를 꺼내는 방식이다
위에서 처럼 CrewDTO라는 클래스가 있다
크루DTO는 이름과 닉네임 필드를 가지고 있다
앞에서 말한 DTO의 특성대로 메서드는 getter/setter 만 가지고 있고
그 외에 로직 메서드는 가지고 있지 않다
DTO를 불변객체로
위에서 DTO 는 setter 메서드를 가질수 있었는데 setter 메서드를 가질경우 해당 DTO는 데이터가 가변적이라고 할수있다
이유는 setter 메서드를 새로운 값을 설정하면 되기 때문이다.
하지만 오른쪽과같이 setter메서드를 삭제하고 생성자를 통해 속성값들을 초기화 하게 만들어
불변 객체로 만들면 DTO가 전달하는 데이터가 전달 과정중에 변조 되지않음을 보장할수있다
중간에서 개발자가 엉뚱한 값을 가지는 객체를 새로 만들어 넘기지않는 이상 전달과정에서 데이터 불변성을 보장할수있어서 더욱 안정적이다
DTO Class 와 Entity Class
엔티티 클래스는 절대로 요청이나 응답 값을 전달하는 클래스로 사용하면 안된다.
엔티티 클래스는 데이터베이스와 매핑되어 있는 핵심 클래스이기 때문이다.
엔티티 클래스 기준으로 테이블이 생성되고 스키마가 변경된다
뷰는 비지니스 요구사항에서 자주 변경되는 부분인데
만약에 엔티티 클래스를 요청이나 응답 값을 전달하는 클래스로 사용한다면
뷰가 변경될때마다 엔티티 클래스를 그에 맞춰서 매번 같이 변경해야 한다.
수많은 서비스나 비지니스 로직들이 엔티티 클래스를 기준으로 동작한다
엔티티 클래스를 변경하게 되어버리면 관련된 무수히 많은 클래스들에게 영향을 끼치게 된다
따라서 요청이나응답 값을 전달하는 클래스로는 반드시 뷰에 변경에 따라 다른 클래스들에게 영향을 끼치지않고
자유롭게 변경할 수 있는 DTO를 사용해야한다
또한 응답값으로 여러 테이블들을 조인한 결과값을 줘야 할 경우가 빈번하기 때문에
엔티티 클래스로만으로는 응답 값을 표현하기 어려운 경우가 많다
그래서 엔티티 클래스와 뷰의 결과 값을 전달해 주는 DTO는 꼭 분리해서 사용해야한다
VO란?
VO는 value object의 약자이다 해석 해보면 값 객체인데
좀 더 구체적으로는 값 그 자체를 표현하는 개체라는 뜻이다
실생활에서는 값으로 비교하는걸 예로들면 돈으로 예를 들수있다.
각각의 지폐들은 고유번호가 있는데 우리는 만 원짜리 지폐가 고유번호가 서로 다르다고해서
다른 만원이라고 하지않고 똑같은 만원으로 본다
이렇게 값 그 자체만을 나타내고 값으로만 비교되는 객체를 VO라고 한다
1 2 3 4 5 6 7 8 9 10 11 | public class Money { private final int value; public Money(int value){ this.value = value; } public int getHalfValue(){ return value/2; } } | cs |
여기 VO로 사용할 Money클래스가 있다 속성값으로 돈의 가치인 value 가 있다
VO는 값 자체를 표현하기 때문에 불변객체여야 한다
따라서 setter성격의 메서드는 포함되면 안되고 생성자를 통해서만 값을 초기화해야한다.
맨아래에 getHalfValue 로직이 있는데 DTO가 getter,setter 메서드 외 로직을 포함할 수 없는 걸과는 달리
VO는 이처럼 이외의 로직을 포함 할수 있다.
DTO vs VO
DTO의 용도는 레이어 간 데이터 전달
VO의 용도는 값 자체의 표현이다
객체의 동등 결정에서 DTO는 속성값들이 모두 같다고 해서 같은 DTO가 아니지만
VO는 속성값들이 모두 같으면 같은 VO다
가변 메서드에서 DTO는 setter 메서드가 존재하면 가변이지만 setter메서드가 존재하지 않을시 불변이다
VO는 값자체를 표현하기 때문에 불변이다
로직 부분에서 DTO는 getter,setter 메서드 외에 로직을 갖지 않지만 VO는 가질수 있다.
'JAVA' 카테고리의 다른 글
[자바]RestAPI (0) | 2024.05.07 |
---|---|
java람다/스트림 (0) | 2024.05.06 |
웹 MVC (0) | 2024.05.04 |
Spring 어노테이션 정리 (0) | 2024.05.03 |
httpServletRequest 주요기능 (0) | 2024.05.02 |
댓글