Java Spring

DAO, DTO 란?

Machine_웅 2024. 12. 24. 15:34
728x90
반응형

DTO(Data Transfer Object)와 DAO(Data Access Object)는 소프트웨어 개발에서 자주 사용되는 디자인 패턴 또는 개념으로, 주로 데이터 처리와 관련된 구조를 명확히 하고 코드의 재사용성을 높이기 위해 사용됩니다.


DTO (Data Transfer Object)

DTO는 계층 간 데이터 교환을 위한 객체입니다. 주로 데이터베이스, 비즈니스 로직, 또는 클라이언트와 서버 사이에서 데이터를 전송하기 위해 사용됩니다.
DTO는 순수한 데이터 구조로, 데이터의 필드와 이를 가져오거나 설정하기 위한 getter/setter만 포함하며, 비즈니스 로직을 포함하지 않습니다.

주요 특징

  1. 데이터 전달 목적: 주로 컨트롤러와 서비스 계층 간, 또는 API 응답으로 사용.
  2. 비즈니스 로직 없음: 데이터를 담기 위한 객체로, 계산이나 처리 같은 로직을 포함하지 않음.
  3. 읽기/쓰기 전용 필드: 데이터를 직렬화하거나 역직렬화할 때 주로 사용됨.

예제 (Java)

public class UserDTO {
    private String name;
    private int age;

    public UserDTO(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter and Setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

DAO (Data Access Object)

DAO는 데이터베이스와 상호작용하기 위한 객체로, 데이터의 CRUD(Create, Read, Update, Delete) 작업을 담당합니다.
DAO는 데이터베이스와의 커넥션, SQL 쿼리 실행, 결과 처리와 같은 작업을 캡슐화하여 개발자가 쉽게 데이터에 접근할 수 있도록 도와줍니다.

주요 특징

  1. 데이터베이스 접근: 특정 테이블 또는 데이터베이스 구조와 매핑.
  2. 비즈니스 로직 없음: 데이터 액세스 작업만 수행.
  3. 재사용 가능성: 다른 계층에서 데이터베이스 작업을 캡슐화해 재사용 가능.

예제 (Java + JDBC)

import java.sql.*;

public class UserDAO {
    private Connection connection;

    public UserDAO(Connection connection) {
        this.connection = connection;
    }

    public UserDTO getUserById(int id) throws SQLException {
        String query = "SELECT name, age FROM users WHERE id = ?";
        try (PreparedStatement stmt = connection.prepareStatement(query)) {
            stmt.setInt(1, id);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                return new UserDTO(rs.getString("name"), rs.getInt("age"));
            }
        }
        return null;
    }

    public void saveUser(UserDTO user) throws SQLException {
        String query = "INSERT INTO users (name, age) VALUES (?, ?)";
        try (PreparedStatement stmt = connection.prepareStatement(query)) {
            stmt.setString(1, user.getName());
            stmt.setInt(2, user.getAge());
            stmt.executeUpdate();
        }
    }
}

DTO와 DAO의 차이점

구분 DTO DAO

목적 데이터 교환 데이터베이스 접근 및 조작
역할 데이터 전달 및 구조화 데이터 CRUD 작업 수행
내용 순수 데이터 (필드, getter/setter) 데이터 액세스 관련 코드 포함
의존성 독립적 데이터베이스에 의존적

사용 예

  1. DAO가 데이터베이스에서 데이터를 읽어와 DTO에 담아 반환.
  2. 서비스 계층 또는 컨트롤러 계층에서 DTO를 사용해 데이터를 클라이언트로 전송.

간단한 흐름 예시

  1. 클라이언트가 데이터를 요청 → 컨트롤러가 요청 처리.
  2. 컨트롤러가 DAO를 호출 → DAO가 DB에서 데이터를 가져옴.
  3. DAO가 데이터를 DTO에 담아 컨트롤러로 전달.
  4. 컨트롤러가 DTO를 클라이언트에 반환.

이런 방식으로 역할을 분리하면 코드의 유지보수성과 확장성이 좋아집니다.

 


GPT 응답

 

 

Spring과 같은 프레임워크에서 자주 사용되는 DTO, DAO, Domain은 애플리케이션 구조를 명확히 하기 위해 각각의 역할을 분리하는 데 사용됩니다. 이들은 계층화된 아키텍처에서 중요한 구성 요소입니다. 다음은 각 개념의 차이점과 역할에 대한 설명입니다.


1. DTO (Data Transfer Object)

역할: 데이터를 계층 간 전송할 때 사용되는 객체입니다.

특징:

  • 주로 컨트롤러 ↔ 서비스, 서비스 ↔ 클라이언트 간 데이터를 교환하기 위해 사용됩니다.
  • 데이터의 캡슐화를 위해 사용되며, 로직은 포함하지 않고 순수히 데이터만 담습니다.
  • 직렬화(Serialization) 가능성이 높은 객체로 설계됩니다.
  • 예를 들어, 클라이언트에게 노출하거나 받는 데이터만 담도록 설계됩니다.

예시:

public class UserDTO {
    private String name;
    private String email;

    // Getter, Setter
}

사용 상황:

  • REST API 응답/요청 데이터.
  • 클라이언트로 데이터를 반환하거나, 클라이언트에서 전달받은 데이터를 처리할 때.

2. DAO (Data Access Object)

역할: 데이터베이스와의 상호작용을 담당합니다.

특징:

  • 데이터베이스에 CRUD(Create, Read, Update, Delete) 작업을 수행하기 위한 계층입니다.
  • 주로 SQL 쿼리나 JPA, MyBatis와 같은 ORM 프레임워크와 함께 사용됩니다.
  • 데이터베이스와 직접 상호작용하므로, 비즈니스 로직이나 클라이언트 로직과 분리되어 있습니다.

예시:

@Repository
public class UserDAO {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public User findById(Long id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
    }
}

사용 상황:

  • 데이터베이스에 데이터를 저장하거나 조회, 수정, 삭제할 때.
  • Persistence 계층에 속하며 Repository 인터페이스로 대체될 수 있음 (Spring Data JPA 등).

3. Domain

역할: 애플리케이션의 핵심 비즈니스 로직과 관련된 객체입니다.

특징:

  • 애플리케이션의 핵심 비즈니스 데이터와 로직을 포함합니다.
  • 보통 데이터베이스의 엔티티(Entity)와 매핑되는 클래스입니다.
  • 비즈니스 규칙, 데이터 검증, 값 계산 등의 로직을 포함할 수 있습니다.
  • JPA에서 @Entity를 사용하여 정의되는 경우가 많습니다.

예시:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // 비즈니스 로직 예시
    public boolean isValidEmail() {
        return this.email != null && this.email.contains("@");
    }

    // Getter, Setter
}

사용 상황:

  • 데이터베이스의 테이블과 직접적으로 매핑.
  • 애플리케이션의 핵심 비즈니스 데이터를 관리.
  • 서비스 계층에서 사용하는 객체.

주요 차이점 요약

구분 DTO DAO Domain

역할 데이터 교환 데이터베이스 접근 핵심 비즈니스 데이터 및 로직 관리
위치 Controller ↔ Service 계층 간 Persistence 계층 Service 계층에서 주로 사용
포함 내용 데이터를 담는 필드와 Getter/Setter만 데이터베이스 쿼리 및 데이터 매핑 로직 비즈니스 데이터와 관련된 속성 및 로직
상호작용 클라이언트 ↔ 서버 데이터베이스 ↔ 애플리케이션 비즈니스 로직 ↔ 데이터베이스
기술 직렬화 가능 객체 (JSON, XML 등) JDBC, MyBatis, JPA JPA의 @Entity로 매핑되는 경우가 많음

정리

  • DTO는 데이터를 전송하는 데 집중.
  • DAO는 데이터베이스와 직접 상호작용.
  • Domain은 애플리케이션의 핵심 비즈니스 데이터와 로직을 담는 객체.

각각의 계층을 분리함으로써 코드의 유지보수성과 재사용성을 높이고, 역할을 명확히 할 수 있습니다.

728x90
반응형