VO(Value Object), DTO(Data Transfer Object), Entitiy

JoonYoung Maeng·2022년 3월 5일
0
post-thumbnail

⁉️  “VO = DTO?” “VO ≠ DTO!”

흔히 개발을 할 때 DTO, VO에 대해 찾아보면 두 개의 객체는 동일한 역할을 한다고 잘 못 설명 되어있는 경우가 빈번하다.

결론 부터 말하면 VO와 DTO는 동일한 객체가 아니다!

📌 DTO (Data Transfer Object)

DTO는 “Data Transfer Object”의 약자로 단어의 뜻에서 알 수 있듯 데이터 전송용 객체를 의미한다.

레이어 간의 데이터 전달이 주 목적인 객체이다. 따라서, DTO 클래스 내에 Getter/Setter 메소드를 가질 수는 있지만 이외의 비즈니스 로직을 가질 수는 없다.

Client → Controller → Service → Repository → DB 방향의 레이어 간 데이터가 이동할 때에는 View 에서 받은 값들을 DTO 클래스에 할당 하기 때문에 Setter가 사용되는 것에 문제가 없다.

하지만, 반대의 경우를 보면 Repository (Persistence Layer)에서 Service (Business Layer)로 전달 하는 경우에 Setter가 사용 된다면 DB에서 꺼낸 값이 변경될 우려가 생긴다.

image

따라서, DTO 클래스는 Setter 메소드를 가질 수는 있지만 권장되지 않고, 대신 값을 생성자를 통해 할당하는 것이 좋다. 생성자 초기화를 통해 불변 객체로 사용한다면, 데이터 전달 과정에서 데이터가 바뀌지 않을 수 있다.

📌 VO (Value Object)

VO는 “Value Object”의 약자로 값 자체를 표현하는 객체이다. 객체를 비교할 때 값이 동일하더라도 객체를 참조하는 주소가 다르다면 다른 객체로 판단한다.

String str = "zayson";
String str2 = "zayson"; 

System.out.println(str == str2); // false;

VO는 객체를 값을 비교해서 동일한 객체인지 아닌지 판단할 수 있도록 equals() 메소드와 hashCode() 메소드를 오버라이딩 해준다.

따라서, VO 내부의 필드 값이 모두 동일한 경우 같은 객체로 판단한다.

또한, VO는 값이 변하지 않는 불변 객체이기 때문에 Setter 메소드를 가질 수 없고, Getter메소드만 가질 수 있다. Setter 메소드를 갖지 않기 때문에 생성자를 통해 객체를 초기화 해준다.

VO는 DTO와 다르게 비즈니스 로직을 가질 수 있다.

📌 Entity

Entity는 DB에 실제로 접근하는 객체를 말한다. 따라서, Entity는 DB와 매핑되는 테이블의 모든 컬럼을 필드로 가지고 있어야 하며 요청이나 응답 데이터를 전달하는 객체로 사용하면 안된다.

VO와 비슷하게 Getter 메소드만을 갖고, 생성자를 통해서 객체에 값을 지정한다.

또한, builder 패턴을 사용함으로써 필요한 값들만 지정해서 객체를 생성하는 것이 가능하고 도메인 관련 로직을 가질 수 있다.

✔️ Entity와 DTO를 구분하는 이유

Entity 자체를 DTO와 동일하게 데이터를 전달하는 데 사용할 수는 있다.

하지만, Entity는 실제 DB와 매핑 되는 객체인 만큼 여러 다른 클래스에 영향 (요청 혹은 응답을 통해 데이터를 전달 할 때 데이터가 변경되는 경우) 을 끼칠 수 있기 때문에, 데이터를 전달하는 용도 (Business Layer, Presentation Layer) 와 DB 내 실제 데이터를 갖는 것 (Persistence Layer)을 구분하는 것이 필요하다.

🗒️ DTO, VO, Entity 요약

분류DTOVOENTITY
정의레이어 사이의 데이터 전달용 객체값 자체를 표현하는 개체실제 DB에 접근해 테이블과 매핑되는 객체
상태 변경 여부Getter만 사용하는 경우 불변 객체, Setter도 사용하는 경우 가변 객체불변 객체불변, 가변 객체
로직 포함 여부Getter / Setter 이외 로직을 포함할 수 없다.비즈니스 로직을 포함할 수 있다.도메인 로직을 포함할 수 있다.

📄 참조

[10분 테코톡] 인비의 DTO vs VO : https://youtu.be/z5fUkck_RZM

[10분 테코톡] 라흐의 DTO vs VO : https://youtu.be/J_Dr6R0Ov8E

Entity, DTO, VO 바로 알기 : https://velog.io/@gillog/Entity-DTO-VO-바로-알기

profile
백엔드 개발자 지망생입니다!

0개의 댓글