WebFramework/SpringBoot

VO DTO 차이

데이25 2021. 5. 6. 15:59

출처 : https://medium.com/webeveloper/entity-vo-dto-666bc72614bb

Entity, VO, DTO 클래스는 사람마다 사용방법이 조금씩 다릅니다.대부분은 VO(Value Object)와 DTO(Data Transfer Object)를 사용방법이 같다고 생각할 것입니다. 실제로도 비슷하며, 이를 정확히 구분 지어서 사용하는 사람은 많지 않습니다. 하지만 위 3가지의 클래스들을 정확히 구분지어서 사용하는 방법을 알면 클래스를 구분지어야 하는 기준점이 생깁니다.

결론

Entity, VO, DTO를 정확히 구분지어서 사용하면 좋겠지만, 대부분이 VO혹은 DTO 한개 또는 두개로 구분지어서 사용합니다. 또한 회사마다 개인마다 스타일이 다르기 때문에 이런 방식이 있다는 것을 알아두고, 회사 스타일에 맞춰서 개발하시면 될 것 같습니다.

Entity

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

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

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

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

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는 주로 비동기 **처리를 할 때 사용합니다. 비동기 처리에서도 JSON 데이터 타입으로 변환해야하는 경우, Spring Boot에서 Jackson 라이브러리를 제공하는데, Jackson은 ObjectMapper를 사용해서 별다른 처리 없이도 객체를 JSON 타입으로 변환시켜 줍니다.

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

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

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