목차

Java Entity, DTO, VO 개념과 차이점

Entity 클래스는 실제 DB의 테이블과 1:1로 매핑되는 핵심 클래스로, 데이터베이스의 테이블에 존재하는 컬럼들만을 필드로 가지는 객체입니다.

Entity는 데이터베이스 영속성(persistent)의 목적으로 사용되는 객체로 setter 메서드의 사용을 되도록 금지 해야 합니다. setter로 접근이 가능해지면 변경되지 않는 인스턴스에 대해서도 접근이 가능해집니다.

Entity는 Constructor(생성자) 또는 Builder를 사용합니다.

@Builder
@Getter
@Entity
@NoArgsConstructor
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idx;
    private String name;
    private String email;

    public Member(Long idx, String name, String email) {
        this.idx = idx;
        this.name = name;
        this.email = email;
    }
}

// 사용 방법
Member member = Member.builder()
        .name("Jan")
        .email("Jan@Jan.com")
        .build();

DTO는 계층(Layer) 간 데이터 교환이 이루어질 수 있도록 하는 객체입니다. Controller 같은 클라이언트 단과 직접 마주하는 계층에서는 Entity 대신 DTO를 사용해서 데이터를 교환합니다.

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

public class MemberDTO {

    public MemberDTO() { }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Entity 객체와 다르게 DTO는 계층끼리 주고받는 우편물이나 상자의 개념입니다. 전달을 위해 사용되고 읽고 쓰는 것이 모두 가능하며, 일회성으로 사용되는 성격이 강합니다.

Entity 객체는 JPA를 이용하게 되면 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련된 중요한 역할을 하며, 내부적으로 EntityManager에 의해 관리되는 객체입니다.

값 자체를 표현하는 객체로 VO는 객체들의 주소 값이 달라도 데이터 값이 같으면 동일한 것으로 간주합니다.

getter 메서드와 비즈니스 로직은 포함할 수 있지만, setter 메서드는 가지지 않습니다(read only). 필요한 경우 값 비교를 위해 equals()hashCode() 메서드를 오버라이딩 해줘야 합니다.