DTO (Data Transfer Object)
getter/setter 예시
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
}
VO (Value Object)
-값 그 자체를 표현하는 객체이다
-로직을 포함할 수 있고, 객체의 불변성을 보장한다
-서로 다른 이름을 갖는 VO 인스턴스라도 속성 값이 같다면, 같은 객체라고 할 수 있다
objedt 클래스의 equals()와 hashCode()를 오버라이딩 해야한다
// Money.java
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;
}
}
// MoneyTest.java
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);
}
}
오버라이딩 하지 않으면 Fail,,
오버라이딩 하면 테스트 통과 : 왜냐하면 VO는 주소가 아닌 값을 비교하기 때문이다.
Entity
실제 DB의 테이블과 매핑되는 객체이다
id를 통해 각각의 Entity를 구분하다
VO와 마찬가지로 로직을 가질 수 있다
public class Member {
private final Long id;
private final String email;
private final String password;
private final Integer age;
public Member() {
}
public Member(Long id, String email, String password, Integer age) {
this.id = id;
this.email = email;
this.password = password;
this.age = age;
}
}
정리..
DTO는 계층간 데이터 이동을 위해 사용하는 객체이다
VO는 값을 갖는 순수한 도메인이다
Entity는 이를 DB 테이블과 매핑하는 객체이다