Dto, Vo, Entity, Dao

최준호·2021년 12월 22일
0

업무

목록 보기
5/31

학습 이유

legacy project에서는 모두 model이라는 통칭으로 사용하여 위 세가지에 대해서 정의하지 않고 객체를 만들어서 사용하였는데 그러다보니 이름이 계속 비슷한 class가 생성되고 차이를 구별하기 어려워졌다. 그래서 얼핏 비슷한 개념으로 생각하고 넘어갈 수 있는 부분이라 한번 정리해보려고 한다.

개인적으로 이해한 내용을 정리한 것이므로 내용에 틀린 부분이 있을 수 있습니다!

domain

먼저 도메인(domain)의 개념을 먼저 알고 가야하는데 대부분 프로젝트에서 dto,vo,entity,dao 등의 파일들을 패키지로 묶어야할 때 상위 패키지명으로 model, domain을 자주 쓴다. domain은 개발자가 처리해야할 요구사항으로 생각하면 된다. 요구사항 폴더 내에 member라는 요구사항에 대한 처리들, payment라는 요구사항에 대한 처리들을 위 dto, vo, entity, dao 등의 개념을 사용하여 처리한다는 것이다.

Dto (Data Transfer Object)

말 그대로 계층간의 데이터 전송에 사용된다.
view > controller
controller > service
와 같이 데이터를 서로 전송할 때 사용된다.

특징

  1. 데이터를 주고 받을 때 사용
  2. 계층간의 데이터 전송이 핵심
  3. getter()와 setter만 구현
  4. 그 외 메서드를 구현하지 않음

Dto를 구별하는 이유

클라이언트에서 전송하는 데이터와 서비스 로직상에서 사용되는 객체 혹은 DB 모델이 다르다. 그렇기 때문에 클라이언트에서 전송되는 데이터와 서비스 로직에 사용되는 객체의 구조가 다를 수 있기 때문에 데이터를 전송 받기 위한 Dto를 구현하여 사용하는 것이다.

Vo (Value Object)

Dto와 비슷하지만 몇가지 특징이 다른데. 우선 Read Only의 특징을 가진다. 그리고 담긴 데이터 그 자체에 의미를 둔다. 또한 Dto와는 다르게 특정한 비즈니스 값을 담을 수 있다.

특징

  1. read only
  2. 담긴 데이터 그 자체에 의미를 둠, idx와 같은 식별성이 존재하지 않음
  3. 비즈니스 값을 가질 수 있음.
  4. 특정한 개념을 나타내기 위한 객체
  5. 데이터의 일관성 유지(=불변 객체의 특징)
  6. equal()과 hashCode()를 구현

Dto와 Vo의 차이점

Dto는 계층간의 전송/전달에 목적을 둔다면 Vo는 객체가 값을 가진다는 것에 의미를 둔다. 또한 Vo는 최대한 set을 구현하지 않으므로 불변 객체의 특징을 가져가는 것이 유지보수에 도움이 된다.

비즈니스 값을 가진다는 의미

비즈니스 값을 가진다는 의미는 예를 들어 상품에 대한 결제가 발생했다고 가정하자. 이때 우리는 view에서 상품가격 1000원10% 할인쿠폰에 대한 데이터를 전달 받았을 때 vo객체로 price라는 값을 계산할때는 상품의가격에서 10프로 할인된 가격의 데이터 값을 price에 넣어주는 로직을 추가하여 vo 객체를 생성할 수도 있는 것이다.

Entity

Entity는 테이블 그 자체다. rdbms의 경우 정의된 컬럼과 Entity의 변수는 동일하게 작성됨을 의미한다. 상속이나 인터페이스를 구현하지 않으며 JPA와 같은 ORM을 사용할때 주로 적용되는 개념이니 MyBatis를 사용할때는 주의해서 사용하자!

특징

  1. 테이블 그 자체
  2. 영속화될 수 있고 식별이 가능한 객체(ID값을 가짐)
  3. 하지만 테이블과 1:1로 대응되는 것은 현실적으로 어려움
  4. 상속을 받거나 인터페이스를 구현하지 않음
  5. ORM의 JPA를 사용할때 주로 사용되는 개념

Dao (Data Access Object)

repository의 개념이며 실제 DB에 접근하는 객체이다. ORM의 경우 기본 CRUD를 제공하며 MyBatis의 경우 사용자가 직접 xml에 sql문을 작성하여 mapping 하여 사용한다.

특징
1. DB에 접근하는 객체

사용 예시

개인적인 생각입니다. 틀리다면 꼭 알려주세요!

Dto, Vo, Entity, Dao의 개념을 살펴보았다. 하지만 개념만 배웠다고 바로 이해가 어렵기 때문에 실제 웹에서 이것들을 어떻게 사용하는지 예시로 전체적 흐름으로 정리해보려 한다.

상품의 결제

  1. 사용자가 상품을 구매하기 위해 구매를 실행
    • controller로 상품을 구매하기 위한 정보가 전달
    • 전달된 데이터를 받기 위해 Dto를 사용하여 데이터 수신
    • spring의 servlet은 controller에 매개변수로 잡혀 있는 객체에 대해 자동으로 set()을 실행하여 데이터를 만듦
  2. controller > service 데이터 전달
    • client(view)에서 전달 받은 Dto를 service로 전달
  3. service 로직 실행
    1. orm의 경우
      • 상품의 정보를 db로 부터 불러와 dao를 통해 entity로 전달받아 service로 넘김
      • 상품의 대한 정보를 결제 정보로 만들기 위해 결제 vo객체를 만들어 entity 객체 내에 데이터를 가져와 결제에 맞는 할인률, 쿠폰 사용, 마일리지 사용 여부 등 서비스에 필요한 정보들을 vo객체에 담음
      • 결제 로직 완료
    2. mybatis의 경우
      • 상품의 정보를 db로 부터 불러와 dao를 통해 dto로 전달 받아 service로 넘김
      • 상품의 대한 정보를 결제 정보로 만들기 위해 결제 vo객체를 만들어 dto 객체 내에 데이터를 가져와 결제에 맞는 할인률, 쿠폰 사용, 마일리지 사용 여부 등 서비스에 필요한 정보들을 vo객체에 담음
      • 결제 로직 완료

참고
TIL DAO,DTO,Entity,Vo 정리해보기
OKKY DAO, DTO, VO 개념이 정확히 뭔가요?
DTO와 VO

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글