Entity / Value Object / DTO / DAO 정리

UkJJang·2021년 10월 24일
0

엔티티란 무엇일까?

  • 테이블 마다 생성시간, 수정시간 컬럼을 추가해 주기 위해 공통으로 상속받아 사용할 클래스를 생성했었다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createTime;
    @LastModifiedDate
    private LocalDateTime updateTime;

}


나는 엔티티에서 상속받아 사용하는 클래스이기 때문에 Entity를 붙여 주었다.

하지만 엔티티가 어떤 경우에 쓰이는 용어인지를 생각해 보았는데 정답을 찾지 못했었다. 엔티티 외에 다른 용어들이 어떠한 용도로 쓰이는지만 대략적으로만 알고 사용하고 있었던 것이였다.

이 부분에 대해서 종립님이 설명을 쉽게 해주셨다.


DAO(Data Access Object)

  • 실제 데이터베이스에 접근하는 객체로 Service와 데이터베이스를 연결한다.
  • 데이터의 CRUD작업을 수행한다.

DTO(Data Transfer Object)

  • DTO(Data Transfer Object)는 데이터를 실어 나르는 바구니 같은 개념이다.
  • 여러 계층간에 데이터 교환을 위한 용도로 사용하는 객체이다.

Entity

  • 데이터베이스에서 엔티티 : 데이터의 집합을 의미하며 저장되고 관리되어야 하는 데이터를 뜻함

  • 스프링에서 엔티티 : 데이터베이스와 실제 매핑되는 객체로 영속성을 부여하여 데이터베이스 상에서 영구적으로 저장 및 관리되기 위해 사용한다.


나는 설명을 듣기 전에 위의 내용 정도로만 알고 있고 엔티티에 대해서는 자세히 알지 못했었다. 또한 엔티티와 가장 비슷한 걸로 VO(Value Object)가 있다는 것을 알게 되었다.

VO(Value Object)

  • 단순히 값 자체를 표현하는 객체이다.
  • 객체의 주소가 다르더라도 객체의 값이 같을 경우 동일한 것으로 판단이 된다.

Entity

  • 엔티티는 연속성이 있는 정보의 묶음을 말한다.

연속성이란

식별자를 만들어 시간에 따라 오브젝트의 정보가 변경될 수도 있다는 것을 뜻한다.

VO와 Entity의 차이점

  • VO와 Entity의 차이점은 연속성이 있는지 없는지의 차이다.

여기까지만 봐도 명확하게 어떠한 차이가 있는지 감이 올듯 말듯 했었다.
하지만 종립님께서 이해하기 쉽게 설명을 해주셨다. 그것은 나의 정보와 전화번호였다.

종립님의 설명을 풀어서 작성하였습니다.

나(엔티티) : 내가 만약 이름을 바꾸거나 얼굴이 바뀌어도 나의 친구들과 부모님은 나를 알아 볼 것이기 때문에 나는 엔티티라고 할 수 있다.

하지만 나의 전화번호만 봣을때는 엔티티라고 할 수 없다. 나의 전화번호는 그냥 값에 불과하기 때문에 VO에 속한다.

그렇다고 해서 전화번호를 VO라고 할 수 없다. 예를들어 화재신고 119 번호가 1191이라고 바뀐다고 해도 사람들은 화재가 났을 경우 1191에 전화해야 한다고 생각하게 된다. 즉 119인지 1191인지와 상관 없이 "화재가 발생할 경우 신고하는 번호" 로 식별이 되기 때문이다.

어떤 경우에는 Entity가 될 수도 있고 VO가 될 수도 있고 DTO가 될 수도 있다는 것이다.

클래스 이름에 용도를 제한하는 이름을 붙이는걸 자제하자.

  • 나는 클래스 이름에 DTO, Entity, Form등 명확하게 해주는게 좋을 것 같아서 이름을 붙여주면서 작성을 했었다.
    하지만 위의 종립님의 설명처럼 어떤 경우에는 Entity가 될 수도 있고 VO가 될 수도 있고 DTO가 될 수도 있어 다양한 용도로 사용할 수 있기 때문에 앞으로 용도를 제한하는 이름을 붙이는걸 자제하려고 한다.

결론

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createTime;
    @LastModifiedDate
    private LocalDateTime updateTime;

}

이 클래스는 값이 바뀌면 다른 값으로 식별되는 LocalDateTime 객체이다. 두 시간으로 BaseTimeEntity 클래스는 연속적인 식별성을 가지는 것 같지가 않다. 따라서 이 클래스에 Entity라는 이름은 어울리지 않다. 그래서 이 클래스의 이름을 BaseTime 으로 수정해 주었다.

이번 계기로 엔티티와 VO, DTO, DAO의 개념과 차이점에 대해 더 자세히 알게 되어 정말 좋은 경험이였다.

profile
꾸준하게 성실하게

0개의 댓글