
현장실습 면접볼 때 DTO, DAO 차이를 아냐는 질문을 받았을 때 답하지 못한게 너무 후회된다. 분명 전에 한 번 궁금증 생겨서 찾아봤는데 대충 보고 흘려버려서 기억나는게 하나도 없었기 때문에.. 당시에도 둘의 명확한 차이를 이해하지 못한 채로 넘겼어서 잘 알지도 못했다. 이번에 생각난 겸사 정리 한 번 해야겠다!
실제 DB의 데이터에 접근하기 위한 객체이다. 단순 생각하면 repository랑 무슨 차이가 있나 싶긴 하다.
더 깊게 Repository와 DAO의 개념 차이를 설명하자면,
JpaRepository 인터페이스 사용해서 repository를 구현하면 기본적으로 엔티티 접근에 대한 save, delete, find 등 메서드가 존재하는 것으로 보면 결국 repository와 DAO의 역할은 유사하지 않을까 싶다.
디테일하게는 위 차이라고는 하지만 둘이 실무에서도 비슷하게 사용되므로 repository가 DAO랑 거의 같다고 생각해도 무방하다고 한다.
public interface ScheduleRepository extends JpaRepository<Schedule,Long> {
List<Schedule> findAllByUser(User user);
}
계층 간 데이터를 교환하기 위한 객체로, 로직을 가지지 않는 순수 데이터 객체이다.
getter, setter 메서드만을 가진 클래스이며 DB에서 얻은 데이터를 Service 계층이나 Controller 게층으로 가공해서 보낼 때 사용된다.
Entity <-> DTO 변환하여 사용하고 Controller의 Request를 Service 계층으로 넘기거나 Service의 Response를 Controller로 가공해서 넘길 때 사용한다.
내가 사용했던 Schedule Entity에 대해 CreateScheduleRequestDTO는 아래와 같다.
public record CreateScheduleRequestDTO(@NotBlank(message = "일정 제목은 필수 입력 값입니다.") String title,
@NotNull(message = "일정 국가는 필수 입력 값입니다.") Country country,
@NotNull(message = "일정 지역은 필수 입력 값입니다.") City city,
String placeId,
String placeName,
Double placeLatitude,
Double placeLongitude,
@NotNull(message = "시작 날짜는 필수 입력 값입니다.") LocalDate startDate,
@NotNull(message = "끝 날짜는 필수 입력 값입니다.") LocalDate endDate,
String memo
){
}
class로 구현이 가능하지만 java의 record를 사용하면 훨씬 간편히 만들 수 있다.
DAO, DTO 존재만 알고 있었는데 찾다보니 VO까지 셋이 항상 묶어서 등장한다.
VO는 Read-Only 속성의 불변 오브젝트로, DTO는 setter가 있어 변경이 가능했지만 VO는 getter만 갖고 있어 수정이 불가하다는 차이점이 있다.
값 오브젝트이므로 두 객체의 필드 값이 모두 동일하다면 두 객체는 같음을 의미한다.
참고
https://www.inflearn.com/questions/111159/domain%EA%B3%BC-repository-%EC%A7%88%EB%AC%B8