DTO, Entity, Form의 차이

5130 단어 SpringSpring

기존에 스프링 개인 프로젝트를 진행할 때에는 MVC구조 패턴을 쓰면서 Domain단에는 그냥 DTO클래스를 단순하게 만들어서 사용을 하고 엔티티랑 DTO의 차이를 모르고 같다고 생각하여 진행 했는데 많은 차이가 있었다..

이제부터는 차이를 명확히 알고 클래스를 생성해야겠다.

간단한 차이

DTO : 데이터 전송 객체, 데이터를 전달하는 목적으로만 사용, 주로 로직은 없고 단순 @Getter, @Setter만 존재

Form : Http API, HTML Form 데이터를 전달받고, 또 HTML Form에 전달하는 목적으로 사용되는 객체

Entity : 핵심 비즈니스 도메인이고, JPA에서는 데이터베이스 테이블과 ORM 매핑되어 있는 객체

Entity (가장 중심이되는 클래스)

Entity 클래스는 실제 DataBase의 테이블과 1:1로 매핑되는 클래스로,
DB의 테이블내에 존재하는 컬럼만을 속성(필드)로 가져야 함
Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가지면 안됨

최대한 외부에서 Entity클래스의 getter method를 사용하지 않도록 해당 클래스 안에서 필요한 로직 method를 구현해야하고, Domain Logic만을 가지며, Presentation Logic을 가지고 있으면 안됨

Entity, DTO 클래스를 분리하는 이유

Entity와 DTO를 분리해서 관리해야 하는 이유는 DB와 View사이의 역할을 철저히 분리하기 위해서

Entity 클래스는 실제 테이블과 매핑되어 만약 변경되게 된다면 다른 클래스에 영향을 끼침,
DTO 클래스는 View와 통신하며 자주 변경되므로 분리해주어야 함.(Entity 클래스 보호)

DTO는 Domain Model의 순수성을 지키기 위해 DTO는 Domain Model 객체를 그대로 두고 복사하여 다양한 Presentation Logic을 추가한 정도로 사용

DTO === copy(Domain Model) + Persentation Logic

Domain Model 객체는 Persistent만을 위해서 사용


DTO(Data Transfer Object)

DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있음
DTO는 주로 비동기 처리를 할 때 사용

DTO는 각 계층(Layer)간 데이터 교환을 위한 객체(Java Beans)
(View <- (DTO) -> Controller <- (DTO) -> Service)

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotEmpty;

@Getter
@Setter
public class MemberForm {       //화면을 처리하기 위한 로직이 있는 DTO, FORM 객체

    @NotEmpty(message="회원 이름은 필수 이름이다.")
    private String name;

    @NotEmpty(message="사는 도시를 입력해주세요.")
    private String city;
    private String street;
    private String zipcode;

}

위의 클래스를 보면 getter/setter가 존재한다.

자바는 다양한 프레임워크에서 데이터 자동화처리를 위해 리플렉션 기법을 사용하는데,
데이터 자동화 처리에서 제일 중요하는 것은 표준규격이다.

예를들어 윗 클래스 DTO에서 property가 name, city, street, zipcode라면 name, city, street, zipcode의 키값으로 들어온 데이터는 리플렉션기법으로 setter를 실행시켜 데이터를 넣을 수 있음

그래서 layer( 특히 서버 ->View로 이동)에 데이터를 넘길때 DTO를 쓰면 편한 이유가 이것 때문
View에 있는 form에서 name필드 값을 프로퍼티에 맞춰 넘겼을 때, 받아야 하는 곳에서 일일히 처리하는 것이 아니라 name속성의 이름이랑 매칟외는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 PersonDTO를 자료형으로 값을 받을 수 있음


VO(Value Object)

VO(Value Object)는 말 그대로 값 오브젝트로써 값을 위해 쓰임
VO는 변하지 않는 데이터 객체를 의미
오직 read만 가능하며 getter만 가능해야함

VO와 DTO의 차이점
하나는 객체의 불변성(객체의 정보가 변경되지 않음)을 보장. 즉, 값을 설정한 뒤에는 수정할 수 없음
(Setter(X))
다른 하나는 equals()와 hashCode()를 재정의(Override)해서 각 객체의 동일성을 판별할 수 있음

VO를 사용해야하는 경우는?

  • 데이터가 불변이어야 하고, 단순히 저장된 값을 불러와야 되는 경우

DTO vs VO

DTO는 데이터 전송만을 위한 객체

VO는 객체 자체를 어떠한 값(Value)로서 사용
(외부 시스템과 데이터 통신을 할 경우 DTO로, DB에서 가져오는 Data는 VO로 정의 후 사용)

DTO는 목적 자체가 데이터의 전달이므로, 읽고 쓰는 것이 모두 가능해 가변성을 가짐
VO는 불변성 및 read-only의 속성을 가짐

참고 : https://dev-coco.tistory.com/87

좋은 웹페이지 즐겨찾기