프로그래머스 스진초 과제를 진행하면서 작성한 내용입니다.
계층(Layer)간 데이터 교환을 위해 사용하는 객체이다.
데이터 교환만을 위해 사용하므로 로직을 갖지않고, getter/setter 메소드만 갖는다.
@Getter
@Setter
class ItemDTO {
private Long id;
private int price;
private int stockQantity;
private String category;
}
값 그 자체를 표현하는 객체이다. 로직을 포함할 수 있으며, 객체의 불변성(객체의 정보가 변경하지 않음)을 보장한다.
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 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;
}