새소식

🍹 (주) 강의 주제/✏️ Spring은 어노테이션에 있다

[Spring] DTO와 VO의 차이점은?

728x90

🤔 Question

👉 스프링 프레임워크를 사용하다 보면 DTO와 VO라는 용어를 자주 접하게 됩니다. 둘 다 비슷하게 생긴 객체인데, 왜 굳이 나누어서 사용하는 걸까요? 그리고 실무에서는 어떻게 구분해야 할까요?

 

📦 DTO(Data Transfer Object)란?

👉 DTO는 말 그대로 데이터를 전달하기 위한 객체입니다. 주로 Controller ↔ Service ↔ Repository 계층 사이에서 데이터를 옮길 때 사용합니다. 화면에서 넘어온 요청 값이나, API 응답 값을 담는 용도로 많이 쓰입니다.

👉 DTO의 가장 큰 특징은 변경 가능(mutable)하다는 점입니다. setter를 통해 값이 바뀌는 것을 전제로 만들어지며, 비즈니스 로직을 가지지 않는 것이 일반적입니다.

 

📦 VO(Value Object)란?

👉 VO는 값 그 자체를 표현하는 객체입니다. 단순히 데이터를 전달하는 목적이 아니라, 특정 개념이나 의미를 가진 값을 표현합니다. 예를 들어 금액, 이메일, 좌표 같은 것들이 VO로 표현되기 좋습니다.

👉 VO의 핵심 특징은 불변성(immutable)입니다. 한 번 생성되면 내부 값이 바뀌지 않으며, 값이 같다면 같은 객체로 취급합니다. 그래서 equals()와 hashCode() 구현이 매우 중요합니다.

 

⚖️ DTO와 VO의 핵심 차이

👉 DTO는 전달이 목적이고, VO는 의미와 값의 표현이 목적입니다. DTO는 상황에 따라 값이 바뀌는 것이 자연스럽지만, VO는 값이 바뀌면 새로운 객체를 만들어야 합니다.

👉 또한 DTO는 계층 간 통신을 위해 존재하고, VO는 도메인 모델의 일부로 취급됩니다. 즉, DTO는 바깥 세상과 소통하기 위한 객체이고, VO는 도메인을 더 안전하고 명확하게 만들기 위한 객체입니다.

 

🛠 실무에서는 어떻게 쓰일까?

👉 실무에서는 API 요청/응답, 화면 데이터 전달에는 DTO를 사용하고, 도메인 내부에서 중요한 값(금액, 기간, 상태 등)은 VO로 분리하는 경우가 많습니다. 이렇게 하면 코드의 의도가 명확해지고, 실수를 줄일 수 있습니다.

👉 특히 DDD(Domain-Driven Design)를 적용하는 프로젝트에서는 VO 사용이 거의 필수에 가깝습니다. 반면, 단순 CRUD 위주의 프로젝트라면 DTO 위주로만 구성되는 경우도 많습니다.

 

정리

👉 DTO와 VO는 겉모습은 비슷하지만 역할은 완전히 다릅니다. DTO는 데이터 전달용 상자이고, VO는 의미를 가진 값 객체입니다. 이 차이를 이해하고 나누어 사용하면 코드의 가독성과 안정성이 크게 향상됩니다.

 

 

If I was of any help to you, please buy me coffee 😿😢😥

If you have any questions, please leave them in the comments

🧭 References

[1] reference : https://doctorson0309.tistory.com/

[2] Ads : https://apps.apple.com/us/app/beluga-classic-film-filters/id6744041061

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.