몰입하며 나아가는 개발이란

Architecture, Desgin Pattern

Entity, DTO, VO개념

류하을 2022. 4. 11. 10:00

Entity, DTO, VO

Entity 란?

Entity Class는 실제 DB테이블과 매핑되는 핵심 클래스로 DB테이블에 존재하는 컬럼들을 필드로 갖는 객체이다. 즉, DataBase Table과 1:1로 Mapping 되어지는 Class 이다.
Entity Class는 상속을 받거나 Interface여서는 안되며 DataBase Table에 존재하지 않는 Column을 가져서도 안된다. 따라서 Persistent(영속성) 목적으로 사용되는 객체이므로 Request나 Response 값을 전달하는 객체로써 사용하는것은 옳지 못한 사용방법이다.(Setter 메서드는 최대한 배제하고 Constructor로 사용을 권장 한다.)

@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {

    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status; // 주문상태 ORDER, CANCEL

    //==연관관계 편의 메서드==//
    public void setMember(Member member){
        this.member = member;
        member.getOrders().add(this);
    }

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }

    public void setDelivery(Delivery delivery){
        this.delivery = delivery;
        delivery.setOrder(this);
    }

    //==생성 메서드==//
    public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
        Order order = new Order();
        order.setMember(member);
        order.setDelivery(delivery);
        for(OrderItem orderItem : orderItems){
            order.addOrderItem(orderItem);
        }
        order.setStatus(OrderStatus.ORDER);
        order.setOrderDate(LocalDateTime.now());
        return order;

    }
}

DTO 란?

Data Teansfer Object는 Layer간 데이터 교환이 이루어질 수 있도록 하는 객체로 JSON seialization과 같은 직렬화에도 사용되는 객체이다. DTO는 원래 DAO(Data Access Object)에서 유래된 단어로 DAO에서 로직을 숨기고 DTO라는 객체를 내보내는 용도로 활용. DDD패턴에서도 동일하게 Controller Layer(ViewLayer)에서 Client에 전달 하는 객체로 Entity대신 DTO를 사용한다. 즉, Entity와 다르게 로직을 갖고있지 않고 Getter와 Setter 메서드만을 갖는다.

@Getter @Setter
class ItemDTO {
  private Long id;
  private int price;
  private int stockQantity;
    private String category;
}

VO 란?

Value Object는 말 그대로 값 객체라는 의미를 갖고 있다. VO의 핵심 역할은 equals()와 hashcode()를 오버라이딩 하는것이다. VO 내부에 선언된 Field의 모든 값들이 값이 같아야 똑같은 객체라고 판별한다. 즉, 객체들의 주소 값이 달라도 데이터값이 같으면 동인한 객체로 간주한다. VO는 테이블 내에 있는 Field 외 추가 Field를 가질 수 있으며, 여러 테이블에 대한 공통 속성을 상속받아 사용할 수 있다.

@Getter @Setter
@Alias("item")
class ItemVO {
    private Long id;
    private int price;
        private int stockQantity;
    private String category;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Item item = (Item) o;
        return Objects.equals(id, item.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

'Architecture, Desgin Pattern' 카테고리의 다른 글

Exception 처리 방법  (0) 2022.05.20
ORM이란?  (0) 2022.04.08
도메인 주도 설계란?(DDD)  (0) 2022.04.06
RESTful이란?  (0) 2022.04.01
Singleton Pattern (싱글톤 패턴)  (0) 2019.12.11