DTO, VO, Entity 개념

과녁스·2022년 2월 21일
0

Spring

목록 보기
9/14
post-thumbnail
post-custom-banner

Entitiy


Entity Class는 실제 Database의 테이블과 1대1 매핑되는 class로, DB의 테이블 내에 존재하는 컬럼만을 속성(필드)으로 가져야한다. Entity Class는 상속을 받거나 구현체여서는 안되며, 테이블 내에 존재하지 않는 컬럼을 가져서도 안된다.

Entity Class는 최대한 외부에서 Data Field에 함부로 접근하지 못하도록 제한하여, 해당 클래스 안에서 접근을 허용할 데이터들을 제한하고 logic method를 구현 해야하고, Domain Logig만 가지며, Presentation Logic을 가지고 있어서는 안된다.

Spring 3 Tier인 Persistence, Business, Presentation Tier 중 Persistance Tier에서 사용한다. 구현 method는 주로 Service Layer에서 사용한다.

Entity를 Persistance Tier에서 받아와 DTO로 변환하여 Presentation Tier에 전달하는 것이 Business Tier, Service 단에서의 역할이다.

Entity와 DTO 분리 이유

DB Layer와 View Layer 사이의 역할을 분리하기 위해서이다.

DB Layer = Persistance Tier / View Layer = Presentation Tier

Entity는 실제 테이블과 매핑되어 변경이 된다면, 다른 Class에 영향을 미치고, DTO는 View와 통신하며 자주 변경되므로 분리를 해야한다.

DTO는 Domain Model 객체(Entity)를 그대로 두고 복사하여, 다양한 Presentation Logic을 추가한 정도로 사용하고, Domain Model 객체(Entity)는 Persistent 만을 위해서 사용해야한다.

VO(Value Object)


VO(Value Object)의 핵심 역할은 equals()와 hashcode()를 오버라이딩 하는 것이다. VO 내부에 선언된 속성(Field)의 모든 값들이 VO 객체마다 값이 같아야 같은 객체라고 판별한다.

VO는 Getter와 Setter를 가질 수 있으며, VO는 테이블 내에 있는 송성 외에 추가적인 속성을 가질 수 있다.

여러 테이블에 대한 공통 속성을 모아서 만든 BaseVO 클래스를 상속받아서 사용할 수도 있다.

VO 예제

@Getter
@Setter
@Alias("book")
class BookVO {
    private Long id;
    private String title;
    private String contents;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        
        Book book = (Book) o;
        
        return Objects.equals(id, book.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

DTO(Data Transfer Object)


DTO(Data Transfer Object)는 데이터 전송 객체라는 의미를 가지고 있다.

DTO는 계층간 데이터 교환을 위한 객체이다. DB의 데이터를 Service나 Controller 등으로 보낼 때 사용하는 객체이다.

DB 데이터가 Presentation Logic Tier로 넘어올 때는 DTO로 변환되어 통신한다.

로직을 갖고 있지 않은 순수한 데이터 객체 이며, getter/setter 메서드만 갖는다. 또한 Controller Layer(View Layer)에서 Response DTO 형태로 Client에 전달한다.(Request에서도 사용)

DTO 예제

@Getter 
@Setter
class BookDTO {
  private String title;
  private String content;
  private String writer;
}

VO와 DTO의 차이

VODTO와 데이터를 전달하는 객체로는 동일한 개념이지만, VO는 조금 더 특정 Business Logic의 결과 값을 담는 객체이다.
equals, hashcode 메서드를 구현하여 특정 데이터를 전달할 때는 VO를 생성하여 이를 동일한 객체 비교까지 필요한 Logic 내에서 주로 사용하게 된다.

DTO는 Layer간 단순 통신 용도로 오고가는 Data 전달 객체이다.
포괄적인 의미로는 제한없이 사용할 수 있는 객체로, 민감하지 않거나, 해당 객체 안의 값들을 통해 동일한 객체임을 비교하는 로직에 사용되지 않을 때는 DTO를 사용하는 것으로도 충분하다.

데이터 흐름

이미지 출처 : https://velog.io/@kyukim/DTO-Data-Transfer-Object

출처🙏


profile
ㅎㅅㅎ
post-custom-banner

0개의 댓글