Entity, VO, DTO

Dope
Webdev TechBlog
Published in
4 min readSep 16, 2019

서론

Entity, VO, DTO 클래스는 사람마다 사용방법이 조금씩 다릅니다. VO(Value Object)와 DTO(Data Transfer Object)의 사용 방법이 같다고 생각하는 개발자 분들도 많을 것입니다. 특히 SI, Agency 쪽에서 종사한다면 더욱 그럴 것입니다. SI, Agency 쪽에서는 이를 정확히 구분 지어서 사용하는 사람은 많지 않습니다. 하지만 위 3가지의 클래스들에 대한 특징을 알고 있으면 클래스를 구분지어야 하는 기준점이 생깁니다.

Entity

Entity 클래스는 DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가지는 클래스를 말합니다. 엔티티 클래스는 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안됩니다.

RDB(Relational DataBase, 관계형 데이터베이스)에서의 Entity(개체)란, 현실세계에서의 개체를 표현하기 위한 유형, 무형의 실체로써, Entity를 표현하기 위해서 테이블을 생성합니다.

예를들어 ARTICLE (게시판) 테이블 내에 TITLE, CONTENT, WRITER를 컬럼으로 가지고 있을 경우, Entity 클래스의 속성도 title, content, writer만 가져야합니다.

JPA를 사용하게 될 경우 엔티티 클래스에는 @Entity 어노테이션을 명시해야 합니다. @Entity는 엔티티 클래스임을 지정하며, 테이블과 1:1로 매핑됩니다.

Entity 는 JPA 에서 사용되는 개념이며, Mybatis 를 사용하는 경우에는 Entity 를 사용하지 않습니다. (Mybatis 를 사용하는 경우 Entity, VO, DTO 를 정확히 구분지어서 개발하는게 생산성이 더 떨어집니다.)

VO(Value Object)

VO(Value Object)는 말 그대로값 객체 라는 의미를 가지고 있습니다. VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것입니다. 즉, VO 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별합니다.

VO는 Getter와 Setter를 가질 수 있으며, VO는 테이블 내에 있는 속성 외에 추가적인 속성을 가질 수 있으며, 여러 테이블(A, B, C)에 대한 공통 속성을 모아서 만든 BaseVO 클래스를 상속받아서 사용할 수 도있습니다.

DTO(Data Transfer Object)

DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있습니다. DTO는 주로 API 데이터를 반환하거나 읽기 모델에 사용 합니다. 비동기 처리에서도 JSON 데이터 타입으로 변환해야하는 경우, Spring Boot에서 Jackson 라이브러리를 제공하는데, Jackson은 ObjectMapper를 사용해서 별다른 처리 없이도 객체를 JSON 타입으로 변환시켜 줍니다.

pom.xml에서 spring-boot-starter-web 의존성이 기본으로 잡혀있는 것을 볼 수 있는데, 해당 라이브러리를 타고 들어가면, Jackson 라이브러리가 잡혀있는 것을 볼 수 있습니다. 스프링 부트는 기본으로 지원하지만, 스프링은 Jackson을 사용 하기위해서 의존성을 잡아줘야 합니다.

비동기처리를 할 때에, 엔티티 클래스에 있는 모든 속성을 JS로 JSON 형식으로 반환해야 하는 경우 DTO를 따로 만들어줄 필요성까지는 없지만, 만약에 자신이 필요한 속성들만 추려서 JSON 형식으로 파싱하여 보내줘야하는 경우, 데이터 가공 처리 를 위해서 DTO를 만들어주는 것입니다.

예를들어 Article 클래스내에 title, content, writer, regDate, modDate 를 필드로 가지고 있으며, JSON 형식으로 변환해서 보내야할 속성은 title, content, writer라고 가정할때, 해당 속성만을 클래스로 가지는 DTO를 아래처럼 만들면 됩니다.

결론

Entity, VO, DTO를 정확히 구분지어서 사용하면 좋겠지만(JPA 에서는 가능) MyBatis 를 사용하고 있다면 대부분이 VO 혹은 DTO 한 개 또는 두 개로 구분지어서 사용합니다. 또한 회사마다 개인마다 스타일이 다르기 때문에 이러한 개념이 라는 것만 알아두고, 회사 내 컨벤션 규칙이 존재한다면 그에 맞춰서 개발하시면 될 것 같습니다.

--

--

Dope
Webdev TechBlog

Developer who is trying to become a clean coder.