웹개발/SpringBoot

[Spring] DAO, DTO의 차이

뎁쭌 2023. 12. 8. 14:11
728x90
반응형

 DAO(Data Access Object)와 DTO(Data Transfer Object)

 DAO(Data Access Object)와 DTO(Data Transfer Object)는 소프트웨어 개발, 특히 데이터베이스와의 상호작용을 다룰 때 자주 사용되는 개념이다. 이 둘은 명확히 다른 역할을 하지만, 때때로 혼동되기도 한다. 

DAO (Data Access Object)

  • 목적 :  DAO는 데이터베이스 접근하는 객체로, 데이터베이스의 CRUD(Create, Read, Update, Delete)작업을 처리
  • 특징 :
    • DAO는 데이터베이스 쿼리를 실행하고 결과를 반환하는 메서드를 포함한다.
    • DAO는 데이터베이스와의 상호작용을 추상화하고, 비즈니스 로직과 데이터베이스 사이의 중간 계층 역할을 한다.
  • 예시 :  예를 들어, 'UserDAO'라는 클래스가 있다면, 이 클래스는 사용자 데이터를 데이터베이스에서 생성, 조회, 업데이트, 삭제하는 메서드를 제공한다.



DTO (Data Transfer Object)

  • 목적 : DTO는 계층간 데이터 교환을 위한 객체로, 데이터베이스 레코드의 데이터를 담기 위해 사용된다.
  • 특징 
    • DTO는 주로 데이터베이스 테이블의 레코드에 해당하는 데이터 필드를 포함한다.
    • DTO는 로직을 포함하지 않고, 순수한 데이터 객체이며, 다른 계층간 데이터 전달에 사용된다.
  • 예시 :  'UserDTO'라는 클래스가 있다면, 이 클래스는 사용자의 이름, 이메일, 나이 등 사용자 정보를 필드로 가질 것이다. 이 DTO는 데이터베이스로부터 데이터를 읽어와 사용자에게 보여주거나, 사용자로부터 받은 데이터를 데이터베이스에 저장하는 데 사용한다.
목적 데이터베이스 혹은 영속성 계층에 접근하여 데이터를 조회하거나 조작하는 로직을 담당 서로 다른 계층 간에 데이터를 전달하는 데 사용되는 객체
특징 - 데이터베이스의 CRUD 작업을 수행
- 데이터베이스와 상호작용하는 메서드를 포함
순수한 데이터 객체
비즈니스 로직을 포함하지 않음
용도 데이터베이스 쿼리 실행, 결과 처리 데이터 전송, 뷰 렌더링, API 응답 등
예시 UserDao 클래스는 사용자 정보를 데이터베이스에서 조회하거나 업데이트하는 메서드를 포함 UserDto 클래스는 사용자 이름, 이메일 등의 정보를 담고 있어 다른 계층으로 데이터 전송에 사용

 

 

UserDTO 예시(순수한 데이터 객체, 비즈니즈 로직X)

package com.junrestwebservice.restfulsnsproject.user;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDate;

@Getter
@Setter
@ToString
@AllArgsConstructor
public class User {
    private Integer Id;
    private String name;
    private LocalDate birthDate;

}

 

UserDAO 예시(CRUD 작업과 비즈니스 로직을 수행)

package com.junrestwebservice.restfulsnsproject.user;


import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

@Component
public class UserDaoService {

    private static List<User> users = new ArrayList<>();
    static {
        users.add(new User(1, "Adam", LocalDate.now().minusYears(30)));
        users.add(new User(2, "Eve", LocalDate.now().minusYears(25)));
        users.add(new User(3, "Jun", LocalDate.now().minusYears(20)));
    }
    private int userCount = 3;
    public List<User> findAll(){
        return users;
    }

    public User findOne(Integer id){
        Predicate<? super User> predicate =
                user -> user.getId().equals(id);
        return users.stream().filter(predicate).findFirst().get();

    }

    public void save(User user){
        user.setId(++userCount);
        users.add(user);
    }
}

 

이렇게 보면, DAO와 DTO는 서로 다른 목적과 기능을 가진 객체라는 것을 알 수 있다.

DAO는 데이터베이스 작업을 처리하고, DTO는 이러한 작업을 통해 얻은 데이터를 전달하는 역할을 한다.