DAO - DTO 차이점 생각해보기

  • 역할:
    • DTO: 데이터를 전송하는 역할
    • DAO: 데이터를 저장하고 접근하는 역할
  • 구성:
    • DTO: 단순한 데이터 홀더 (필드, getter/setter)
    • DAO: 데이터베이스 연산을 수행하는 메서드 (CRUD, 쿼리 실행)
  • 위치:
    • DTO: 계층 간 데이터 교환에 사용 (주로 프레젠테이션 계층과 비즈니스 계층 간)
    • DAO: 비즈니스 계층과 데이터베이스 계층 간의 인터페이스
  • 변경성:
    • DTO: 불변(immutable) 객체로 설계될 수 있음
    • DAO: 상태가 변할 수 있는 객체 (데이터베이스 연산에 따라)
  • 사용 목적:
    • DTO: 네트워크 통신, API 응답/요청 등에서 데이터 전송을 위해 사용
    • DAO: 데이터베이스 연산과 관련된 로직을 캡슐화

 

1. DTO (Data Transfer Object)

목적:

  • DTO는 계층 간 데이터 전송을 위한 객체입니다.
  • 주로 프레젠테이션 계층과 비즈니스 계층 간에 데이터를 주고받을 때 사용됩니다.
  • 네트워크 통신이나 API 호출에서 데이터를 담아서 전송하는 용도로 사용됩니다.

특징:

  • 단순한 데이터 구조: DTO는 주로 필드와 getter/setter 메서드만을 가지고 있는 단순한 클래스입니다.
  • 불변성: DTO는 불변(immutable) 객체로 설계되는 경우가 많습니다. 데이터를 안전하게 전송하고 수정할 수 없도록 합니다.
  • 직렬화 가능: 대부분의 경우 직렬화 가능한 객체로 설계되어 네트워크를 통해 데이터를 전송하거나 파일에 저장할 수 있습니다.
  • 데이터 캡슐화: 데이터의 전송을 위한 순수한 데이터를 캡슐화합니다.

예시코드:

// UserDTO.java
public class UserDTO {
    private int id;
    private String name;
    private String email;
    
    // 기본 생성자
    public UserDTO() {}

    // 매개변수가 있는 생성자
    public UserDTO(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    
    // Getter & Setter 메서드
    }

 

2. DAO (Data Access Object)

목적:

  • DAO는 데이터베이스나 다른 영구 저장소에 접근하기 위한 객체입니다.
  • 주로 데이터베이스 조작(읽기, 쓰기, 업데이트, 삭제)과 관련된 로직을 캡슐화합니다.
  • 비즈니스 계층과 데이터베이스 계층 간의 추상화를 제공합니다.

특징:

  • 데이터베이스 연동: DAO는 데이터베이스 연산을 수행하는 메서드를 포함하고 있으며, SQL 쿼리 또는 JPA/Hibernate와 같은 ORM(Object-Relational Mapping) 프레임워크를 사용합니다.
  • 캡슐화: 데이터베이스와의 상호 작용을 캡슐화하여, 데이터베이스 접근 코드를 비즈니스 로직에서 분리합니다.
  • 인터페이스 기반: DAO 패턴은 인터페이스를 사용하여 데이터 접근 로직을 정의하고, 구체적인 구현체는 이를 구현합니다.
  • 트랜잭션 관리: 트랜잭션을 관리하고 데이터베이스 연결을 처리합니다.
// UserDAO.java
import java.util.List;

public interface UserDAO {
    // 사용자 추가
    void insertUser(UserDTO user);
    
    // ID로 사용자 조회
    UserDTO getUserById(int id);
    
    // 전체 사용자 조회
    List<UserDTO> getAllUsers();
    
    // 사용자 정보 수정
    void updateUser(UserDTO user);
    
    // 사용자 삭제
    void deleteUser(int id);
}

// UserDAOImpl.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserDAOImpl implements UserDAO {
    // 모의 데이터베이스 역할을 하는 HashMap (key: user id, value: UserDTO)
    private Map<Integer, UserDTO> userDB = new HashMap<>();
    
    @Override
    public void insertUser(UserDTO user) {
         userDB.put(user.getId(), user);
    }
    
    @Override
    public UserDTO getUserById(int id) {
         return userDB.get(id);
    }
    
    @Override
    public List<UserDTO> getAllUsers() {
         return new ArrayList<>(userDB.values());
    }
    
    @Override
    public void updateUser(UserDTO user) {
         if (userDB.containsKey(user.getId())) {
              userDB.put(user.getId(), user);
         }
    }
    
    @Override
    public void deleteUser(int id) {
         userDB.remove(id);
    }
}

 

결론

주고 받을때는 DTO - 조작할 때는 DAO

 

왜 이상하게 이해하고 있었는지? 

JPA 공부하면서 함께 해당 내용을 공부했었는데 

이때 Entity에 대한 이해를 하며 DAO 의 Access를 하나의 서비스 처리용 객체를 만드는

대상이라고 잘못이해하고 있어서 이런 문제가 있었는데

 

최근에 Transfer이전에 Access에 대한 개념이 먼저 나와야하는데

반대로 진행이 되었는지에 대해 생각해보다가 이해를 잘못하고 있었다는걸 알았다.

 

'CS' 카테고리의 다른 글

lombok AllArgsConstructor를 안쓰는 이유  (0) 2024.10.08
IP 와 Port 그리고 Socket  (0) 2024.08.08
delete method는 form-data를 못쓴다.  (0) 2024.08.07
Process 와 Thread  (0) 2024.06.10
세션과 토큰 쿠키  (1) 2024.06.10