DTO (Data Transfer Object)
계층 간 데이터를 전달하는 객체로 로직을 갖고 있지 않은 순수한 데이터 객체이다.
데이터 전달 용도로만 사용하기 때문에, getter/setter 로직만 가지고 있다.
setter의 경우 변조 가능성이 있어, 생성자로 값을 넣어주어 전달 과정에서 변조가 불가능 하도록 할 수 있다.
public class UserDTO {
private String name;
private String id;
public String getName() {
return name;
}
public String getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
}
// 생성자 이용
public class UserDTO {
private String name;
private String id;
public UserDTO(String name, String id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
}
VO (Value Object)
도메인에서 한 개 또는 그 이상의 속성들을 묶어 특정 값을 나타내는 객체이다.
로직을 포함할 수 있고, 특정 값 자체를 나타내기 때문에 불변성 보장을 위해 생성자를 사용해야 한다.
서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같으면 두 인스턴스는 같은 객체이다.
핸드폰 색깔의 값을 가진 VO를 만들어 값이 같은 두개의 객체를 생성하고 동일성 비교해보면 다른 객체로 구별이 된다.
public class PhoneVO {
private final String color;
public PhoneVO(String color) {
this.color = color;
}
}
// Test
@Test
void equals() {
final String color = 'red';
PhoneVO phone1 = new PhoneVO(color);
PhoneVO phone2 = new PhoneVO(color);
assertThat(phone1 == phone2).isFalse(); // 동일성 비교
}
동일성(==) 비교는 객체의 주소값을 비교하기 때문에, 값이 같은 것과 별개로 에러가 난다.
객체가 포함하고 있는 속성 값들을 기준으로 객체를 비교하려면 동등성 비교를 통해 비교해야한다.
어떤 속성값들을 기준으로 동등성 비교를 할 지는, equals 메서드와 hashCode 메서드를 오버라이딩(재정의)을 통해 정해야 한다.
...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PhoneVO phoneVO = (PhoneVO) o;
return Objects.equals(color, phoneVO.color);
}
@Override
public int hashCode() {
return Objects.hash(color);
}
...
참고
https://tecoble.techcourse.co.kr/post/2020-06-11-value-object/
https://maenco.tistory.com/entry/Java-DTO%EC%99%80-VO%EC%9D%98-%EC%B0%A8%EC%9D%B4
'JAVA' 카테고리의 다른 글
[Java] 다형성(polymorphism) (0) | 2023.07.05 |
---|---|
[Java] 상속(Inheritance) (0) | 2023.07.05 |
Annotation 어노테이션 (0) | 2023.04.12 |
컬렉션(자료구조) (0) | 2023.04.04 |
배열(자료구조) Array (0) | 2023.04.04 |