자바/자바

[Java] 데이터 클래스 구분 (VO, DTO, Entity)

도트7 2022. 1. 11. 00:41

VO(Value Object)

  • 객체가 가지는 값들에 대해 오직 읽기만 가능해야 하는 특성을 가지는 클래스다.
  • 모든 멤버 변수에 대한 getter 메서드가 반드시 존재해야 하며 값을 변경할 수 있는 setter 메서드는 생성하면 안된다.
  • 생성자 중 모든 멤버 변수를 파라미터로 가지는 생성자는 반드시 존재해야 한다. 객체를 생성하고 나면 데이터를 초기화할 수 없기 때문이다. 
  • 멤버 변수에 final 키워드를 사용해 변경할 수 없도록 한다.
  • 타 데이터 클래스와 구분하기 위하여 패키지로 분류하거나 접미사로 "*VO.java"를 붙여 구분한다.

 

 

DTO(Data Transfer Object)

  • MVC와 같은 계층 구조에서 계층간 데이터를 주고 받을 때 꼭 필요한 데이터만을 가지는 클래스다.
  • 네트워크를 통해 클라이언트(혹은 서버)의 요청에 따라 DB로부터 읽어온 객체에 불필요한 데이터가 있을 경우 꼭 필요한 데이터만으로 구성된 DTO 클래스로 재구성하여 전송한다.
  • 타 데이터 클래스와 구분하기 위하여 패키지로 분류하거나 접미사로 "*DTO.java"를 붙여 구분한다.

 

 

Entity

  • 데이터베이스에서 데이터를 읽어올 때 테이블의 구조(속성들)와 일치하는 구조를 갖는 클래스.
  • 데이터베이스에서 레코드 단위로 값을 읽어올 때 레코드 1개가 하나의 데이터 클래스로 대응될 수 있어야 한다.
  • 타 데이터 클래스와 구분하기 위하여 패키지로 분류하거나 접미사로 "*Entity.java"를 붙여 구분한다.

 

 

 

 데이터 클래스들은 "*.data.entity"와 같이 전용 패키지를 생성하여 관리하는 것이 좋다. 프로젝트의 규모가 커지면 커질수록 늘어나는 데이터 클래스들의 관리가 어려워진다.

 

 세 클래스는 데이터를 저장하기 위해 설계된 클래스라는 공통점이 있지만 목적에 따라 다른 특성을 가져야 하기 때문에 같은 대상이라도 여러 개의 데이터 클래스를 생성할 수 있다. 예를 들어 사용자가 내가 서비스 중인 어플에서 개인 정보를 열람하려 할 때 스마트폰을 이용 중인 사람이 본인이 아닐 수 있기에 최소한으로만 보여줄 필요가 있다. 다른 사람들에게 보여지는 닉네임, 이름, 아이디 등은 공개할 수 있지만 비밀번호는 노출되어서는 안되고 인증 수단(이메일, 휴대폰 번호) 역시 쉽게 노출되선 안되므로 인증을 거친 뒤 보여주는 것이 일반적이다. 하지만 일반적으로 이러한 데이터들은 모두 하나의 테이블에서 관리되므로 디비에서 데이터를 읽어 오면 모든 데이터가 들어 있다. 이러한 경우 먼저 특정 레코드를 Entity 클래스로 받은 뒤 사용자에게 보낼 데이터는 DTO 클래스로 재구성하여 보내는 것이다.