java

DAO, DTO, VA란?

윤밥밥 2023. 11. 3. 01:44

DTO(Data Transfer Object)

  • 의미
    계층간의 데이터 전송을 위한 객체이고 오직 getter, setter만 존재한다.
    값의 불변성을 위해 constructor로만 값을 주고, setter를 제거해 값을 바꿀 수 없게 할 수 도 있다.
    어떠한 비즈니스 로직도 가지면 안된다.
    model에서 service로 데이터를 보낼때, 값이 변하지 않도록 객체로 감싸서 보내는 것.
  • 사용하는 이유
    도메인 모델을 계층간 전송에 사용하면, 도메인과 뷰가 강하게 연결될 수 있다. 뷰의 요구사항 변경에 의해 도메인 코드 변경은 전체 변경을 야기해 좋지 못하다. 따라서 DTO를 사용하여 결합성을 느슨하게 하는 것.
  • 예시
    • 여기서 getter만 추가하면 된다!

VO(Value Object)

도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체를 의미한다. 도메인에서 사용된다.

VO를 이해하기 위해서는 동일성, 동등성의 차이를 알아야 한다

  • 동일성 : 두 객체가 동일하다는 것은 두 객체의 참조 주소가 같다는 것이다. 하지만 우리가 클래스를 통해 두 객체를 생성하였다 했을 때 두 객체의 주소는 다르므로 동일하지 않다.
  • 동등성 : 두 객체의 값이 같은 것이다. 두 객체가 동일한 지 확인하려면 equals와 hashcode를 재정의 해야 한다.
@Override public boolean equals(final Object o) { 
if (this == o) return true; //같은 객체이면 true 
if (o == null || getClass() != o.getClass()) return false; //비교하는 객체가 null이거나, getClass(현재 참조하는 클래스를 알려준다)가 다르거나(즉 다른 클래스를 통해 만들어진 객체 둘)이면 다른 객체이므로 false 
final Point point = (Point) o; 
return x == point.x &&//두 객체의 값이 같은 지 확인 
y == point.y; }`

@Override  
public int hashCode() {  
return Objects.hash(x, y);  
}

이를 보면

  1. equals를 override한다.
  2. hashCode는 기본적으로 두 객체의 주소값을 사용해 해시값을 만든다. 이를 override하여, 값을 기준으로 해시 코드를 얻을 수 있다. 이를 통해 객체를 비교한다.
  • 엥 그럼 DTO랑 VO랑 뭐가 달라?

    VO는 지폐같은 것이다. vo한테 만원권은 만원의 고유번호와 관련없이 같은 것이라, 값 자체를 표현하는 데 사용된다.
    반면에 DTO는 두 만원 화폐가 고유번호가 다르니 다른 지폐가 되는 것.

DAO(Data Access Object)

  • 데이터베이스의 data에 접근하기 위한 객체이다.
  • 직접 데이터베이스에 접근하여, 삭제, 조회, 삽입등의 조작을 한다.
  • 즉 MVC 패턴에서 Model 역할을 하는 것이다.