При работе с моделями баз данных в качестве разработчика Java мы легко сталкиваемся с несколькими концепциями, такими как DTO и VO.

Эта статья призвана прояснить каждую концепцию и объяснить, когда и почему мы должны их использовать.

Это в значительной степени обычный поток многоуровневой архитектуры Spring.

Controller ← DTO → Service ← DTO → DAO(Mapper) ← DB

DTO (объект передачи данных) — это просто объект Java для передачи данных между каждым уровнем.

В примере платформы электронной коммерции предположим, что я хочу получить подробную информацию о магазине A.

public class Store {
    int storeSeq;
    String storeName;
    String storeAddress;
    ...(getters/setters)
}
public class StoreService {
    Store storeA = storeMapper.selectStoreByStoreSeq(storeSeq);
}

Объект «Магазин» будет полностью передан из базы данных в контроллер. Объект изменяемый. (Он содержит метод установки).

Итак, мы установили DTO. Что такое ВО?

Чтобы ответить на этот вопрос, нам нужно понять реальные проблемы, с которыми мы сталкиваемся.

  • Есть некоторые поля, которые нельзя предоставить конечным пользователям. В приведенном выше примере я хочу скрыть storeSeq от конечных пользователей в целях безопасности.
  • Я хочу сделать объект неизменяемым, чтобы объект выполнял свою задачу по передаче данных между слоями и не менялся по пути.

Это когда объект-ценность (VO) становится полезным. Объект-ценность, как следует из этого слова, представляет собой объект, имеющий ценность. Это неизменяемый объект с переопределенным equals и методом hashCode.

ВО по сути является объектом только для чтения для сравнения и передачи данных.

Какое-то время мне было довольно сложно понять разницу между DTO и VO. Когда вы работаете над побочным проектом, который не требует сложной и многословной кодовой базы, в большинстве случаев DTO поможет. Однако, когда функция продукта изменится или количество ваших разработчиков увеличится, отделение VO от DTO сильно повлияет на производительность труда.