728x90
DTO(data transfer object)
DTO는 데이터를 전달하기 위한 객체
주로 View, Controller 사이에서 데이터를 주고 받을 때 활용
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가 있는 경우, 가변 객체로 활용 가능
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;
}
}
생성자를 이용해서 초기화 하는 경우 불변 객체로 활용 가능. 불변 객체로 만들면 데이터를 전달하는 과정에서 변하지 않음을 보장
VO(Value Object)
VO는 값 자체를 표현하는 객체
VO는 객체들의 주소가 달라도 값이 같으면 동일한 것으로 여김
ex) 고유 번호가 다른 서로 다른 만원 2장 (주소는 다르지만 값은 동일하다.)
VO는 getter 메서드와 함께 비즈니스 로직 포함 가능하다. 단, Setter 메서드는 가지지 않는다.
++ 값 비교를 위해 equals()와 hashCode() 메서드를 오버라이딩 해줘야 한다. 그렇지 않으면 테스트가 실패한다. (주소 값을 비교하기 때문이다.)
public class Money {
private final String currency;
private final int value;
public Money(String currency, int value) {
this.currency = currency;
this.value = value;
}
public String getCurrency() {
return currency;
}
public int getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Money money = (Money) o;
return value == money.value && Objects.equals(currency, money.currency);
}
@Override
public int hashCode() {
return Objects.hash(currency, value);
}
}
public class MoneyTest {
@DisplayName("VO 동등 비교")
@Test
void isSameObjects() {
Money money1 = new Money("원", 10000);
Money money2 = new Money("원", 10000);
assertThat(money1).isEqualTo(money2);
assertThat(money1).hasSameHashCodeAs(money2);
}
}
Entity
Entity는 실제 DB 테이블과 매핑되는 핵심 클래스. 이를 기준으로 테이블이 생성되고 스키마가 변경된다.
Entity를 요청이나 응답값을 전달하는 클래스로 사용해서는 안된다.
Entity는 id로 구분되고, 비즈니스 로직 포함 가능
Entity는 DTO처럼 setter를 가지는 경우 가변 객체로 활용할 수 있다.
Reference
https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
728x90
'Spring' 카테고리의 다른 글
no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (0) | 2022.10.12 |
---|---|
BeanDefinitionStoreException: Failed to parse configuration class (0) | 2022.09.14 |
Builder 패턴 (0) | 2022.09.02 |
ResponseEntity (0) | 2022.09.02 |
Exception 공부 (0) | 2022.08.31 |