작성
·
524
2
안녕하세요 ~
자바 개발자 경력자인데요.
먼저 그냥 코딩을 이때까지 해왔지만 이렇게 기초부터 차근차근 비유해주시면서 설명해주시니 다시 개념확립이 되는것같아 감사드립니다.
일단 제가 궁금한점이 SI 이나 이떄까지 회사 프로젝트를 다녀본결과 ..
예를들어 쿼리결과를 저장하고 , API 사용시 (요청 /결과)
모두 이때까지 VO 라는 클래스를 만들어 사용하고 보았는데요.
이전부터 DTO , VO 두개의 차이점의 개념은 알고 공부하고 알고는 있었느나 , 항상 이때까지 모든 프로젝트에서는
모든 클래스를 뒤에 UserVO , DetailVO ... 이렇게 사용하곤했는데요.
아직까지도 아직경험을 못해서그런지 VO vs DTO 개념이 확립이안되네요;
앞으로 프로젝트참여시 VO 를 DTO 라고 명칭만 바꿔서 사용하면될까요?
답변 5
1
1
안녕하세요, kimsang520님! 😊 좋은 질문 감사드립니다!
어떤 상황에서인지 모르겠지만 가끔(?) AI가 자동으로 답변을 만들어 주더라고요~ AI가 자신 있는(?) 질문에 자동으로 답변이 달리나 봅니다 ㅎㅎㅎ
질문 주신 내용에 대해 결론을 말씀드려보면, 저는 VO와 DTO가 매우 비슷한 개념이라고 생각합니다.
단지 이름 그대로 Value를 강조할 것인지 (VO) Data Transfer를 강조할 것인지 (DTO)에 따라 다른 이름을 갖고 있다고 느껴져요!
또한 제 개인적인 생각으로는, 데이터 접근 계층에 DAO라는 이름을 사용하던 시기에 VO를, Repository라는 이름을 사용하던 시기에는 DTO를 조금 더 많이 쓰지 않나~ 싶기도 합니다! 😊... 결국 DAO도 Repository도 DB에 접근하는 역할은 동일하거든요!
그래서, 앞으로 프로젝트참여시 VO 를 DTO 라고 명칭만 바꿔서 사용하면될까요? 라고 질문 주신다면
VO라는 이름을 사용하건, DTO라는 이름을 사용하건 프로젝트를 함께 참여하는 분들이 선호하는 이름을 사용하면 되지 않을까 싶습니다!!
(저는 DTO라는 이름을 VO라는 이름보다 먼저 배웠고, 이 쪽이 익숙해서 선호하는 것 같아요!!)
답변이 도움이 되었으면 좋겠습니다! 감사합니다! 🙇
0
0
0
안녕하세요, 인프런 AI 인턴입니다.
kimsang520님, 좋은 질문 감사합니다.
DTO(Data Transfer Object)와 VO(Value Object)는 용도에 따라 구분되어 사용됩니다.
DTO는 계층간 데이터 교환을 목적으로 사용되는 객체로, 주로 웹 계층과 서비스 계층 사이에서 데이터를 전달할 때 사용됩니다. 반면, VO는 단순히 값을 저장하고, 이를 전달하는 데 쓰이는 변경 불가능한 객체를 가리킵니다.
강의 혹은 프로젝트 중에 “VO”라는 용어를 사용하는 경우, 개발자 사이의 관례 혹은 프로젝트 내 정의된 용어 사용 규칙 때문일 수 있습니다. “VO” 클래스를 만들어 사용하는 것과 “DTO” 클래스를 만들어 사용하는 것은 기본적인 구현에 큰 차이가 없을 수 있으나, 목적에 따라서는 해당 객체를 정의할 때 구조적 차이가 있을 수 있습니다.
예를 들어, DTO는 서로 다른 계층 간에 데이터를 전달하는 데 중점을 둘 때 사용됩니다. 따라서, DTO는 서버의 응답 형식이거나 클라이언트에서 서버로의 요청 데이터 구조를 나타낼 수 있습니다. 반대로 VO는 데이터의 불변성을 강조하거나 도메인 내에서 값을 표현할 때 주로 사용됩니다.
이미 답변 드린 내용과 유사한 문의에 대한 답변을 아래에서 확인하실 수 있습니다.
각 프로젝트나 팀에 따라서 도메인 모델과 데이터 전송 객체들을 다루는 방식이 다를 수 있으니, 프로젝트 참여 시 프로젝트의 규칙에 따르거나 팀 내에서 이에 대해 논의해 볼 수 있습니다. VO를 DTO라고 명칭만 바꾸어 사용한다기보다는, 각 객체의 목적과 사용 방식을 이해하고 적절히 활용하는 것이 좋습니다.
질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
네네 이렇게 만드셔도 괜찮을 것 같아요!
다만, 여기서 두 가지 포인트를 말씀드려보면
[1. Controller가 받는 DTO와 Service / Repository에서 사용하는 DTO]
본 강의에서는 DTO 하나를 Controller부터 Repository까지 사용했지만,
이렇게 계층에 따라 한 번 더 DTO를 변환하기도 합니다.
엄밀하게는 Controller로 들어온 DTO를 분해해서 Repository에는 객체 대신 기본 타입 혹은 String을 넘겼습니다 👍
계층에 따라 한 번 더 DTO를 변환하는 이유는, Controller DTO의 경우
spring-validator
와 함께 validation 어노테이션이 들어가는 경우가 많고, Controller 단에서만 필요한 데이터를 갖고 있는 경우도 있어서 그래요!보통 조금 더 큰(?) 프로젝트 일 수록 나누는 편입니다.
[2. DTO와 VO의 용어 통일]
개인적으로는 DTO 혹은 VO 그 어떤 것을 사용하더라도 네이밍에는 문제가 없다고 생각합니다~ 😊
다만 한 프로젝트 내에서는 이름이 통일되는 편이 좋을 것 같아요!
또한,
"서비스에서 다른 서비스로 호출될 수 있기 때문에 DTO는 컨트롤러에서만 사용하고 서비스에서는 도메인 객체인 Entity, VO를 사용하는 것이 좋다" 라고 되어 있는데 저는 DTO 라는 이름을 Service 끼리 데이터를 주고 받거나 Service - Repository 끼리 데이터를 주고 받더라도 적극적으로 사용하는 편입니다! 결국 "데이터 전달 객체"이기 때문이죠!
감사합니다! 🙏