포스트

VO vs DTO vs ENTITY

vodtoentity


공부 배경

국비지원 학원을 다니면서 프로젝트를 진행했을 때, DB 테이블의 데이터를 사용할 때든, 그 데이터를 가공할 때든 객체를 VO로 선언하여 사용하였다.
하지만, 수료 이후 개인적으로 공부를 진행하다 보니 데이터를 VO, DTO, ENTITY 이렇게 세가지 객체로 분류하여 관리하는 것을 알게 되었다.
이에 대한 개념정리가 필요하였다.


VO? DTO? ENTITY?


VO란 무엇인가?

VO란 Value Object 말 그대로 값 그 자체를 표현하는 불변 객체이다.

  • VO는 변경 불가능한(immutable) 객체
  • VO는 특정 비즈니스 값을 담는 객체
    • getter 메소드는 가질 수 있지만, setter메소드는 가지지 않는다.
    • Read Only 특징을 가진다.
  • VO는 객체들의 주소 값이 달라도 데이터 값이 같으면 동일한 것으로 여긴다.
    • 값 비교를 위해 equals()와 hashCode() 메서드를 오버라이딩 해야 함(객체의 불변성을 보장함.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Getter 
@Setter
class ArticleVO {
    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;
        Article article = (Article) o;
        return Objects.equals(id, article.id);
    }

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

DTO란 무엇인가?

DTO계층(Layer)간 데이터 교환이 이루어질 수 있도록 하는 객체이다.

  • DTO는 getter, setter 메서드를 포함하며, 이 외의 비지니스 로직은 포함하지 않는다.

  • Controller 같은 클라이언트와 직접 마주하는 계층에서 사용하여, 데이터를 요청/응답하며, 주로 View와 Controller 사이에서 데이터를 주고받을 때 사용한다.

  • 주로 비동기 처리를 할 때 사용한다.

1
2
3
4
5
6
@Getter
@AllArgsConstructor
public class MemberDto {
private String name;
private int age;
}

ENTITY란 무엇인가?

ENTITY란 실제 DB테이블과 매핑되는 핵심 클래스로, DB테이블에 존재하는 컬럼들을 필드로 가지는 객체이다.

  • ENTITY 클래스는 실제 DataBase의 테이블과 1:1로 매핑되는 클래스이다.

  • DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.

  • 외부에서 ENTITY클래스의 데이터 필드에 접근하지 못하도록 제한해야 한다.

  • ENTITY는 id로 구분되며, 비지니스 로직을 포함할 수 있다.

  • ENTITY는 데이터베이스 영속성(persistent)의 목적으로 사용되는 객체이며, 요청(Request)이나 응답(Response)값을 전달하는 클래소로 사용하는 것은 좋지 않다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private String email;

private String phoneNumber;
}

정리


 VODTOENTITY
생성 목적객체안의 값을 통해서
비교해야하는 중요 로직에서
사용할 데이터를 담기위해
사용
단순 데이터 전송,수신 용도JPA 사용시 DB 테이블과
직접적으로 매핑하여 DB에
접근할 때 사용
getter 사용OOO
setter 사용XOX(setter 사용을 지양)
equals() & hashCode 구현OXO
데이터 민감도800100
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.