DTO는 데이터를 전달하기 위한 객체이다. 단순히 데이터를 주고받거나 전환하는 용도로 사용하기 때문에 로직을 갖지 않고 Getter/Setter 메소드만 갖는다.
public class MemberDto {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Setter를 없애고 생성자를 이용하여 객체를 초기화하는 경우 불변객체로 사용할 수 있다. Setter가 없기 때문에 데이터 변조가 일어나지 않기 때문이다.
public class MemberDto {
private final String name;
private final int age;
public MemberDto(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Lombok을 사용하면 훨씬 간단하게 DTO를 만들 수 있다.
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class MemberDTO {
private String name;
private int age;
}
VO는 값 그 자체를 표현하는 객체이다. 비즈니스 로직을 포함할 수 있고, 객체의 불변성을 보장한다.
즉, 객체들의 주소가 달라도 모든 값이 같다면 동일한 것으로 여긴다는 뜻이다.
ex)
자동차A (가격: 1000, 생산일: 20230425)
자동차B (가격: 1000, 생산일: 20230425)
자동차C (가격: 2000, 생산일: 20230425)
이 상황에서 서로 다른 두 객체인 자동차 A,B는 동일하다고 보는 것
VO는 Getter와 함께 비즈니스 로직도 포함할 수 있지만, Setter는 가지지 않는다. 그리고 값 비교를 위해 equals()
와 hashCode()
메소드를 오버라이딩 해야한다.
public class Car {
private final int price;
private final String date;
public Car(int price, String date) {
this.price = price;
this.date = date;
}
public int getPrice() {
return price;
}
public String getDate() {
return date;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return price == car.price && Objects.equals(date, car.date);
}
@Override
public int hashCode() {
return Objects.hash(price, date);
}
}
Entity는 DB테이블과 매핑되는 클래스이다. id
를 통해 각각의 Entity를 구분할 수 있고, 비즈니스 로직을 포함할 수 있다.
다음은 JPA를 사용한 Entity 예제 코드이다.
import javax.persistence.*;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
privae Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Builder
public User(String name, String email) {
this.name = name;
this.email = email;
}
public User update(String name, String email) {
this.name = name;
this.email = email;
return this;
}
}
https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
https://youngjinmo.github.io/2021/04/dto-vo-entity/