Back-end/Spring-핵심& webMVC

DTO(DataTransferObject) vs. VO(Value Object)

prden 2022. 12. 11. 11:22

1. DTO와 VO 차이는 무엇인가?

1. DTO (데이터 전달용 객체)

  • Data Transfer Object
  • 각 계층(레이어) 간 데이터 교환을 위한 객체 (Controller, Service)
  • 값이 변할 수 있다. DTO dto1(1)!= DTO dto2(1)
  • 데이터 접근 이외의 기능을 가지지 않음(정렬, 직렬화 등 데이터 표현을 위한 기능은 가질 수 있음)
  • 로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메서드만 보유한 클래스
  • 하지만 DB에서 꺼낸 값을 임의로 변경할 필요가 없기 때문에 DTO클래스에는 setter가 없다..?
  • (대신 생성자를 통해 속성 값들을 초기화 하게 만들어 불변 객체로 만들면 DTO가 전달 과정 중에 변조되지 않음을 보장할 수 있다.)
  • 속성값이 모두 같다고 해서 같은 객체가 아니다. 
  • setter 존재시 가변, setter 존재하지 않을 경우 불변 객체 보장(생성자를 통해 속성 값 초기화 하는 경우)

1-1. 사용예시

2. VO(값 표현용)

  • 모든 레이어에서 사용 가능
  • 값이 변하지 않음 VO vo1(1)== VO vo2(1)
  • 특정한 비즈니스 로직을 가질 수 있음 (밑에 getHalfValue())

src = https://www.youtube.com/watch?v=z5fUkck_RZM

  • setter 포함하면 안되고 생성자를 통해서만 값을 초기화해야 함 
  • 값 그 자체를 표현하는 객체(값이 같다면 동일한 객체)이기 때문에 불변 객체이다.
  • 속성 값이 모두 같으면 같은 객체이다
  • 서로 다른 이름을 가진 VO의 인스턴스가 모든 속성이 같다면 같은 객체이다 -equals()와 hasCode()를 오버 라이딩
  • ->(값에 의해 동등성이 판단되는 객체)
  • hashCode리턴값이 같으면 equals()리턴값도 같은지 파악 후 둘다 같을 경우 동등객체로 취급(완전한  vo는 이 두개 메서드 오버라이딩 해줘야 한다.)

아래 : HashSet, HashMap, Hashtable의 동등 비교 방식 (https://prde.tistory.com/49)

src = https://www.youtube.com/watch?v=z5fUkck_RZM

2-1. 사용예시

src = https://www.youtube.com/watch?v=z5fUkck_RZM

3.  Entity(JPA~)

  • 실제 DB의 테이블과 매핑되는 클래스
  • id로 구분된다. 
  • 로직을 포함할 수 있다. 
  • Entity Class는 데이터 베이스와 매핑되어 있기 때문에 요청이나 응답 값을 전달하는 클래스로 사용하면 안된다(DTO사용) 
  • Entity Class를 기준으로 테이블이 생성되고 스키마가 변경되기 때문에