일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 쿠팡매크로
- 강아지 유기농 사료
- 티켓팅매크로
- 티켓팅메크로
- 쿠팡메크로
- 동인천 맛집
- 샤로수길 데이트
- 서울대입구 맛집
- 강아지종류
- 홀리스틱 유기농
- 신포동 맛집
- 반려견 열사병
- 강아지 홀리스틱
- 반려견
- 반려견 유기농 사료
- 강아지 유기농
- 반려견 종류
- 강아지 더위
- 자동화봇
- 반려견 사료등급
- 강아지 종류
- 강아지 열사병
- 반려견 유기농
- 닥스훈트
- 반려견 더위
- 샤로수길 맛집
- 반려견 홀리스틱
- 강아지
- 국비지원 예습
- 부산 맛집
- Today
- Total
심심한잉여의 잡동사니
[JAVA] DTO와 VO 본문
DTO와 VO에 대해 같은 것을 나타내는 것이라 생각을 했으나 이 둘의 용도차이가 있었다.
그 차이가 무엇인지 알아보자
DTO란?
순수하게 데이터를 담아 계층간으로 전달하는 객체
로직을 갖고 있지 않은 순수한 데이터 객체이며 메소드로는 getter/setter 만을 갖는다.
여기서 getter/setter 이외의 다른 로직이 필요 없는 이유를 자세히 알아보자면, 만약 DTO가 데이터를 전달만을 위한 객체라고 했을 때 완전히 데이터 전달 용도로만 사용하기 때문에 getter/setter로직 외의 다른 로직이 필요 없기 때문
public class UserDTO {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
필요에 따라 setter를 없애 생성할 때 말고는 값에 접근을 하지 못하게 하여 전달하는 과정에서 변조가 불가능하게 하는 방법도 있다.
VO란?
값 그 자체를 나타내는 객체
DTO와 다르게 로직을 포함할 수 있으며, VO의 경우 특정 값 자체를 표현하기 때문에 불변성의 보장을 위해 생성자를 사용해야한다.
VO는 서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체인 것이 핵심이다.
public class CarVO {
private final String color; public CarVO(String color) {
this.color = color;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CarVO carVO = (CarVO) o; return Objects.equals(color, carVO.color);
}
@Override public int hashCode() {
return Objects.hash(color);
}
}
DTO와 VO의 차이
DTO는 계층간의 데이터 전송을 위한 객체로 getter/setter를 사용하여 보내는 사람은 setter를 사용해 값을 담고 받는 사람은 getter를 이용해 값을 꺼내 쓴다. 이 때 값의 변조를 막고 싶다면 setter를 없애 불변 객체로 만들면 된다.
DTO특성 상 데이터 전달만을 목적으로 하기 때문에 getter/setter 외 다른 로직이 필요없다.
VO의 경우 값 그 자체를 나타내는 것이며 핵심은 필드 값이 같다면 두 객체는 같은 객체로 볼 수 있다는 것.
이 때 주소값을 비교하는 경우에 문제가 생길 수 있으니 hashcode(), equals()에 대해 재정의를 하여 필드 값이 같다면 같은 객체로 인식이 될 수 있도록 해주는 것이 필요하다.
'코딩일기 > Java' 카테고리의 다른 글
[JAVA]POJO, DTO, DAO, VO (0) | 2022.04.07 |
---|---|
[JAVA] 추상 클래스 VS 인터페이스 (0) | 2022.03.31 |
[JAVA] 디자인패턴 - 싱글톤 (0) | 2022.03.20 |
[JAVA] JAVA8 버전과 JAVA 11 버전의 특징 (0) | 2022.03.15 |
HTTP와 HTTPS의 이해 (0) | 2022.03.12 |