DTO와 VO 그리고 Entity

재우·2023년 11월 8일
0
post-custom-banner

프로그래머스 스진초 과제를 진행하면서 작성한 내용입니다.



DTO ( Data Transfer Obejct )

  • 계층(Layer)간 데이터 교환을 위해 사용하는 객체이다.

  • 데이터 교환만을 위해 사용하므로 로직을 갖지않고, getter/setter 메소드만 갖는다.

@Getter 
@Setter
class ItemDTO {

  private Long id;
  private int price;
  private int stockQantity;
  private String category;

}


VO ( Value Object )

  • 값 그 자체를 표현하는 객체이다. 로직을 포함할 수 있으며, 객체의 불변성(객체의 정보가 변경하지 않음)을 보장한다.
    DTO와 비슷하지만 차이점은 VO는 read only 속성을 갖는다.

  • 서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체라고 할 수 있다.
    이를 위해 VO에는 Object 클래스의 equals()hashcode() 를 오버라이딩 해야한다.

  • VO 내부에 선언된 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);
    }
    
}


Entity

  • Entity Class는 실제 DB테이블과 매핑되는 핵심 클래스로 DB테이블에 존재하는 컬럼들을 필드로 갖는 객체이다.
    즉, DataBase Table과 1:1로 Mapping 되어지는 Class이다.

  • id를 통해 각각의 Entity를 구분한다. VO와 마찬가지로 로직을 가질 수 있다.

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "item_name")
    private String name;

    private double price;

}


post-custom-banner

0개의 댓글