Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

To Dare Is To Do!

DTO vs VO vs Entity 본문

Spring

DTO vs VO vs Entity

Nick_Choi 2023. 11. 7. 16:53

과거 프로젝트를 진행할 때 어디서는 domain, 또 다른 곳에서는 DTO 등 비슷한 개념과 역할을 가지는 것 같은데 정확히 어떤 차이가 있는지 궁금했던 경험이 있다. 

이번 기회에 DTO와 VO 그리고 Entity의 개념에 대해서 정리해 보고 해당 개념을 적절한 상황에 사용할 수 있도록 하자!

 

DTO

Data Transfer Object의 약자인 DTO는 계층(Controller - Service - Repository)간 데이터 전달을 위해 사용하는 객체이다.

데이터를 주고 받을 때 데이터를 담아서 교환할 수 있도록 하는 바구니라고 하면 이해하기 쉬우며 이 바구니는 주로 View와 Controller 사이에서 많이 사용되곤 한다.

 

 DTO는 데이터 교환만을 위한 객체이기 때문에 따로 비즈니스 로직을 갖지 않고 getter / setter 메소드만을 가진다.

또한 setter 메소드로 인해 가변 객체로서 활용될 수도 생성자를 통해 초기화한다면 불변객체로 활용할 수도 있다.

public class MemberDto {
	private String name;
    private int age;
    
    public String getName() {
     return name;
    }
    
    public void setName(String nanme) { // setter를 통해 가변 객체로 활용 가능!
    	this.name = name;
    }
 
    public String getAge() {
     return age;
    }
    
    public void setAge(int age) { // setter를 통해 가변 객체로 활용 가능!
    	this.age = age;
    }

 

public class MemberDto {
	private String name;
    private int age;
    
    public MemberDto(String name, int age) { // 생성자를 통해 불변 객체로 활용 가능!
    	this.name = name;
    	this.age = age;
    }
    
    public String getName() {
     return name;
    }
    

    public String getAge() {
     return age;
    }

 

 

VO

Value Object의 약자인 VO는 값 자체를 표현하는 객체이다. 객체들의 주소가 서로 달라도 값만 같으면 VO는 동일한 객체로 취급한다.

 

비유를 해보면 우리가 흔히 볼 수 있는 만원권은 각각의 고유번호(주소)가 모두 다르지만 갖고 있는 가치(값)는 모두 같기 때문에 나의 만원과 상대방의 만원은 같은 돈이다!

 

VO는 비즈니스 로직과 getter 메소드를 가질 수 있으나 setter 메소드는 가질 수 없다.

또한 equals()와 hashCode()를 오버라이딩하여 값을 비교한다.

 

public class Money {
	private final int value;
    
    public Money(int value) {
    	this.value = value;
    }
    
    public int getChange() { // 비즈니스 로직 사용 가능
    	return value - 5000;
    }

 

 

Entity

실제 DB 테이블과 매핑되는 핵심 클래스로 DB의 테이블에 존재하는 컬럼들을 필드로 가지는 객체이다.

떄문에 데이터를 요청하거나 응답값을 전달할 때 Entity를 사용해선 안 된다. View와 같은 외부의 요소가 변경될 때 DB의 테이블이나 스키마에 영향을 미칠 수 있기 때문이다.

 

Entity는 id로 구분되고 비즈니스 로직을 포함할 수 있다.

setter 메소드를 사용할 수 있으나 객체의 일관성 및 안정성에 문제를 발생시킬 수 있기 때문에 사용을 지양한다.

 

정리

  DTO VO Entity
정의 레이어 간 데이터 전송 객체 값 표현 객체 DB 테이블 매핑 객체
상태 변경 여부 가변 or 불변 객체 불변 객체 가변 or 불변 객체
비즈니스 로직 포함 여부 로직 포함 불가능 로직 포함 가능 로직 포함 불가능

 

 


참고

Techoble - DTO vs VO vs Entity

Techoble - VO란 무엇일까?

 

'Spring' 카테고리의 다른 글

객체 지향 설계의 5가지 원칙(SOLID)  (1) 2023.12.23
DTO와 Entity의 변환  (0) 2023.11.16
HTTP Method  (1) 2023.11.06
Spring 3계층 속 DI  (0) 2023.11.05
직접 만들고 뜯어본 Controller  (1) 2023.11.03