IT/기초 지식

[DDD] Entity, VO, DTO 등 관련 용어 정리

개발자 두더지 2023. 7. 3. 21:44
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

 

워크 프레임(Java)에서의 문맥


Entity

 Java Persistence API, AOD.NET등등, 각종 프레임 워크에서 대체로 "O/R맵핑의 단위"로 사용되고 있는 워드. 워크 프레임의 힘을 빌려 데이터 베이스의 구구현을 의식하지 않고 데이터 구조를 획득할 수 있다.

 

Plain Old Java Object(POJO)

 Entity와 같은 특정 워크 프레임에 의존하는 기능이 필수가 아닌, 용어 유래의 "보통의 오브젝트"를 사용하는 것이 좋을 때, 그것을 강조하고 싶을 때 사용하기 위해 Martin Fowler가 만든 단어이다.

 

Data Transfer Object(DTO)

 비즈니스 로직이 포함되지 않은 데이터의 용기로 메소드를 가지지 않는다. 원래 DTO 패턴이 생긴 계기는 원격 프레젠테이션 층에서 DTO인스턴스를 다루고 싶다는 요구이다. DTO를 비즈니스 층에서 조립하여 시리얼라이즈하고, 그것을 네트워크를 통해서 송신하여 프레젠테이션 층에서 디시리얼라이즈한다.

 한편 Sun커뮤니티에서는 예전에 DTO를 Value Object라고 불렀다. 이 Value Object는 DDD 문맥과 별도의 것이므로 주의할 필요가 있다.

 

Domain Payload Object(DPO)

 그러나 Local DTO에는 결점이 있다. 대개의 경우 DTO를 사용하면 모든 데이터에 데해서 동일한 정의를 두 번써야한다는 비용이 든다는 점에서 비판이 되고 있다.

 그리고 프레젠테이션층이 네트워크적으로 떨어져 있지 않은 경우 이 패턴을 사용하면 어플리케이션의 설계가 불필요하게 복잡해진다.

 그로 인해 탄생한 패턴이 DPO이다. 버논이 DDD에서 해설하고 있는 DPO의 구조는 "DDD에서의 집약으로의 참조를 보유한 오브젝트에 뷰(View)용의 속성이 나타난다"라는 것이다. DTO보다 낮은 비용으로 작성하는 것이 장점이다.

 

Data Access Object(DAO)

 DTO를 레이어화 아키텍처에서 Data층에서 꺼내 Model 층에 전달하는 역할을 하는 것이다. DAO 자신은 속성을 가지지 않는다.

 

 

DDD에서의 문맥


 모델층(DDD에서는 도메인층이라고 부른다)을 다른 것에서 부터 잘라 나눠가며 그 안에 도메인 모델을 제대로 설계하는 방법이다. 

 

도메인 모델

 그럼 도메인 모델은 무엇인가? 모든 소프트 웨어 프로그램에서는 이 프로그램을 사용할 유저의 어떤 활동이나 관심과 관계가 있다. 유저가 프로그램을 적용할 그 대상 영역이 소프트웨어 도메인이 된다. 도메인 모델이란 특정 그림이 아닌 그림이 전달하고자 하는 생각이다.

 

Entity

 DDD에서 말하는 Entity는 앞서 설명한 O/R 맵핑의 대상이 되는(영속화이라는 개념을 포함해) Entity와 언뜻 비슷해보이나 다른 개념이다. 

 DDD에 있어서 Entity는 "고유한 식별자에 의해 특정된다"라는 특징을 가지고 있다. 라이프 사이클을 통한 연속성을 가지고, 그 속성에서 부터 독립적으로 동일성을 유지하고 있다면 그것이 Entity가 된다.

 동일한 개념이라도 "시스템이 동일성을 구분한다"는 필요가 있는지 없는지로 Entity인지 아닌지가 바뀐다. 예를 들어 동일한 스타디움 좌석이라도 지정석은 좌석 번호(식별자)로 구분되므로 Entity이다. 자유석은 구분되어 있지 않으므로 Entity가 아니다.

 

Value Obejct(값 오브젝트, VO)

 Entity가 아닌 것은 Value Object라고 한다. 라이프 사이클의 추적이 불필요하고, 식별자가 없으며 구성 전체에 따라 동일성을 판단할 때에는 값 오브젝트를 사용한다. 값 오브젝트는 불변이 바람직하며 계측 값이나 설명이 바뀌었을 때에는 전체는 완전히 바꿔서 동작에 큰 부작용이 없어야한다.

 

도메인 이벤트

 DDD에 등장했다. 도메인내에서 일어난 어떠한 일들이다. 

 

Aggregate(집약)

 DDD에서 많이 얘기되지는 않지만 중요한 개념이 집약이다. Entity나 VO를 정리한 오브젝트 그래프이다.

 

Repository

 영속화의 수단이다. 집약의 인스턴스를 그것에 대응하는 리포지토리 내에 둔다. 이 리포지토리를 사용한 인스턴스를 획득한다. 리포지토리가 있음으로써, 도메인에서는 뒷면에 있는 영속화 메커니즘을 신경 쓸 필요가 없어진다.


참고자료

https://qiita.com/takasek/items/70ab5a61756ee620aee6#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%91%A8%E3%82%8Ajava%E5%AF%84%E3%82%8A%E3%81%AE%E6%96%87%E8%84%88

728x90