[영상후기] [10분 테코톡] 📍인비의 DTO vs VO

박철현·2023년 4월 23일
0

영상후기

목록 보기
103/160

movie

  • DTO : 데이터 전달용

  • VO : 값 표현용

  • DTO(Data Transfer Object) : 데이터를 전달하기 위해 사용하는 객체

    • 계층 간 데이터를 전달하기 위한 객체
      • 컨트롤러 <-> 서비스
    • getter/setter 메서드 만을 가짐(다른 로직은x)
      • 순수하게 데이터를 전달하기 위해 사용하는 객체이기 때문
    • 보내는 쪽에서 setter로 세팅 -> 받는쪽에서 getter 활용
  • DTO가 Setter 메서드를 가질 경우 데이터가 가변적으로 볼 수 있음

    • Setter 메서드를 삭제하고 생성자를 활용하여 속성값을 초기화하는 불변객체로 만들면 DTO가 전달되는 과정 중에 변조되지 않음을 보장
      • 전달 과정 중 데이터 불변성 보장
  • 엔티티 클래스 : 요청이나 응답 값을 전달하는 클래스를 사용하면 안됨

    • 데이터베이스와 매핑되어 있는 핵심 클래스이기 때문(테이블 생성, 스키마 변경)
  • 뷰 : 비즈니스 요구사항에서 자주 변경되는 부분

  • DTO를 사용하지 않고 Entity를 사용한 경우

    • 만일 Entity를 요청이나 응답 값을 전달하는 클래스로 사용한다면, 뷰가 변경될 때마다 그에 맞춰서 매번 같이 변경해야 함
    • 엔티티 클래스를 변경하게 되면 관련된 무수히 많은 클래스 들에게 영향을 끼치게 됨
  • 요청이나 응답 값을 전달하는 클래스로는 반드시 뷰에 변경에 따라 다른 클래스들에게 영향을 끼치지 않고 자유롭게 변경할 수 있는 DTO를 사용해야 함

    • 응답 값으로 여러 테이블들을 조인한 결과값을 줘야 하는 경우가 빈번하기 때문에 엔티티 클래스 만으로는 응답 값을 표현하기 어려운 경우가 많음
    • 분리하는 것이 좋음
  • VO(Value Object) : 값 그 자체만을 나타내고 값으로만 비교되는 객체

    • 값 자체를 표현해야 하기에 불변 객체여야 함(setter가 아닌 생성자를 통해서만 값을 초기화)
      • 만원짜리 지폐 : 고유번호가 다르더라고 금액(만원)으로만 같다고봄
      • VO / 고유 번호 : 각 객체의 주소로 볼 수 있음
    • Getter/Setter 이외의 메서드 포함할 수 있음
  • 완전한 VO로 사용하기 위해서는 Equals()와 Hashcode() 메서드를 오버라이드 해줘야 함

  • DTO vs VO

DTOVO
용도레이어 간 데이터 전달값 자체 표현
동등 결정속성값이 모두 같다고 해서 같은 객체가 아님속성값이 모두 같으면 같은 객체
가변/불변setter 존재(가변)/ 존재 x : 불변불변
로직getter/setter외 로직을 갖지 않는다getter/setter외 로직을 가질 수 있다.
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보