본문 바로가기
카테고리 없음

DTO와 VO, 의문에 대한 답변 (DTO와 VO는 왜 혼용되는가, DTO는 왜 사용하는가, VO는 무엇인가)

by 손너잘 2021. 2. 26.

이번 우테코 테코톡에서 인비의 DTO와 VO에 대한 발표가 있었다.

테코톡이 끝나고 루트가 DTO와 VO에 대한 질문을 남겼는데, 생각해 보니 같은 의문점이 들어서 자료를 찾아봤다.

 

이번 글은 DTO와 VO에 대해 설명하느 글이 아니다. DTO와 VO에 대한 사람들의 의문에 대한 답변을 준비해 봤다.

 

댓글로 남긴 답변을 약간 다듬어서 블로그에 남겨본다.

 


 

저도 DTO VO를 공부하다가 알게된 사실이 있어서 공유 드립니다!
인비가 자세하게 설명해 줘서 추가자료라고 생각하시면 좋을 것 같아요.루트의 질문을 받고 저도 문득 DTO와 VO에대해 궁금해져서 자료를 좀 찾아봤어요.
그리고 그 정답이 들어있는 자료를 찾았습니다!
그것은 바로, 마틴 파울러 아저씨의 저서입니다 (Patterns of Enterprise Application Architecture - Martin Fowler).

 

DTO와 VO의 개념을 처음 제시한 본인의 책인 만큼. 신뢰도는 100프로라고 보셔도 될겁니다.

 

첫번째. 왜 사람들이 VO와 DTO를 헷갈려 하는가?


마틴파울러에 의하면, 마틴파울러가 DTO와 VO에 대해 저술할 때, 이미 VO라는 개념이 존재했던 것 같아요(후에 제시된건지, 미리 있던건지는 잘 모르겠네요)

[Alur et al.] discuss this pattern under the name Value Object, which I said earlier is equivalent to my Data Transfer Object; my Value Object (486) is a different pattern entirely. 

Alur 외 몇몇이 쓴 논문 혹은 책에 VO라는 개념이 존재하고, 이는 마틴아저씨의 DTO와 완전히 동일한 개념이라고 합니다. 여기에서부터 사람들이 많이 햇갈려 한 것 같아요. 현대에 와서는 마틴아저씨의 개념이 대세로 자리 잡았지만, 이전에 있던 VO의 개념도 같이 사용되면서 DTO와 VO의 개념을 많이들 혼동하는걸로 예상되네요.또한 위 글에 보면 마틴아저씨가 주장하는 VO는 DTO와는 또 다른 개념이라고 못박아 놨습니다.

 

두번째. DTO는 왜 사용하는가?
많은 글들을 보면, 레이어 간의 정보이동이 그 목적이라고 말은 하는데, 사실 진짜 목적은 네트워크 오버헤드를 줄이기 위함이라고 하네요 

When you’re working with a remote interface, such as Remote Facade (388), each call to it is expensive. As a result you need to reduce the number of calls, and that means that you need to transfer more data with each call. One way to do this is to use lots of parameters. However, this is often awkward to pro- gram—indeed, it’s often impossible with languages such as Java that return only a single value.

원격 호출 시, 여러 데이터를 전송할 때 이전에는 데이터를 하나씩 보냈나봐요. 이러면 데이터의 개수만큼 네트워크 호출이 많아지고 결국 비싼 비용을 치루게 되겠죠.
그래서 마틴 아저씨는 데이터를 하나로 묶어서 보내는 방법을 고안한걸로 보여요. 이게 DTO의 본래 목적이라고 볼 수 있겠죠.이때 데이터의 이동에 있어, 서버와 클라이언트간의 통신이기 때문에 결국 서로 다른 레이어간의 데이터 공유가 이 이유가 되고, 따라서 DTO는 레이어간의 데이터 이동을 위한 객체다! 라고 점점 정의 내려져 온걸로 보이네요.

 

세번째 그러면 VO는 뭔가?
마틴 아저씨의 말에 의하면 말 그대로 값 객체라고 하네요. 불변의….
왜 값객체는 불변이어야 하는지 이유를 보면 엘리어싱 버그라는것 때문이라고 합니다.
책에 있는 예제를 보면 Martin과 Cindy가 같은 날 고용됐고, 고용 날짜들 동일한 인스턴스의 날짜 객체로 가지고 있었따고 하면, 마틴의 고용날짜를 바꿀 때 신디의 고용날짜도 변경되는 경우가 있는데, 이게 엘리어싱 버그라고합니다.
이러한 현상을 막기 위해 값 객체는 불변! 으로 한다고 해요.그래서 결론은, 인비와 마찬가지로 DTO와 VO는 다르다. 애초에 용도가 다르기 때문에 혼용되어서는 안된다가 저의 의견입니다!

 

더 자세한 내용은 

 

https://github.com/himanshugpt/ebooks-1/blob/master/Patterns%20of%20Enterprise%20Application%20Architecture%20-%20Martin%20Fowler.pdf

 

himanshugpt/ebooks-1

Collection of eBooks . Contribute to himanshugpt/ebooks-1 development by creating an account on GitHub.

github.com

 

참고 바라요~

댓글