성장일기 : 문과생의 개발 여정 (งᐖ)ว ( ᐛ )و

DTO/VO/DAO란 ? 본문

백엔드개발/Spring

DTO/VO/DAO란 ?

hyemi_flora 2024. 5. 22. 17:44
  • DTO(Data Transfer Object)와 DAO(Data Access Object)의 공통점:
    1. 데이터 중심 -  DTO는 데이터를 전송하는 데 사용되고, DAO는 데이터를 접근하고 조작하는 데 사용
    2. 비즈니스 로직 없음
    3. 명확한 책임 분리 - DTO와 DAO는 각각의 역할이 명확하게 분리되어 있다. DTO는 데이터 전송을, DAO는 데이터베이스 접근을 담당한다.
  • VO (Value Object) :  값 객체로, 변하지 않는 데이터를 나타내는 데 사용된다.
    • 변하지 않는 데이터를 표현 - Money, Date, Coordinate와 같은 객체가 VO의 대표적인 예시
    • 비즈니스 도메인 모델링에 사용
    • 객체 동일성을 값으로 판단 - VO는 동일성을 객체의 ID가 아닌 값 자체로 판단한다.
  1.  
public class PizzaOrderDTO {
    private int orderId;
    private int customerId;
    private List<PizzaDTO> pizzas;
    private String deliveryAddress;
    private String contactNumber;
    private double totalPrice;

    // Getters and Setters
}

public class PizzaDTO {
    private int pizzaId;
    private String name;
    private String size;
    private List<String> toppings;
    private double price;

    // Getters and Setters
}

 

public class PizzaOrderDAO {
    private Connection connection;

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

    public void saveOrder(PizzaOrderDTO order) {
        String orderQuery = "INSERT INTO orders (customer_id, delivery_address, contact_number, total_price) VALUES (?, ?, ?, ?)";
        String pizzaQuery = "INSERT INTO pizzas (order_id, name, size, price) VALUES (?, ?, ?, ?)";
        try {
            connection.setAutoCommit(false);

            try (PreparedStatement orderStmt = connection.prepareStatement(orderQuery, Statement.RETURN_GENERATED_KEYS)) {
                orderStmt.setInt(1, order.getCustomerId());
                orderStmt.setString(2, order.getDeliveryAddress());
                orderStmt.setString(3, order.getContactNumber());
                orderStmt.setDouble(4, order.getTotalPrice());
                orderStmt.executeUpdate();

                ResultSet generatedKeys = orderStmt.getGeneratedKeys();
                if (generatedKeys.next()) {
                    int orderId = generatedKeys.getInt(1);
                    try (PreparedStatement pizzaStmt = connection.prepareStatement(pizzaQuery)) {
                        for (PizzaDTO pizza : order.getPizzas()) {
                            pizzaStmt.setInt(1, orderId);
                            pizzaStmt.setString(2, pizza.getName());
                            pizzaStmt.setString(3, pizza.getSize());
                            pizzaStmt.setDouble(4, pizza.getPrice());
                            pizzaStmt.addBatch();
                        }
                        pizzaStmt.executeBatch();
                    }
                }
            }
            connection.commit();
        } catch (SQLException e) {
            try {
                connection.rollback();
            } catch (SQLException rollbackEx) {
                rollbackEx.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                connection.setAutoCommit(true);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

   // 등등등
}
  • DTO : PizzaOrderDTO와 PizzaDTO는 데이터 전송 객체로, 클라이언트와 서버 간 데이터 전송에 사용.
              주문 정보를 포함하여 고객이 피자 주문을 할 때 필요한 데이터를 담고 있다.
  • DAO : PizzaOrderDAO는 데이터 접근 객체
               데이터베이스와 상호작용하여 주문 정보를 저장하거나 조회하는 역할을 한다.
  • DTO는 데이터를 안전하고 효율적으로 전달하며, DAO는 데이터베이스 접근 로직을 분리하여 코드의 재사용성과 응집력을 높인다.
public final class Address {
    private final String street;
    private final String city;
    private final String state;
    private final String zipCode;

    public Address(String street, String city, String state, String zipCode) {
        this.street = street;
        this.city = city;
        this.state = state;
        this.zipCode = zipCode;
    }

    // Getters only, no setters

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return street.equals(address.street) && city.equals(address.city) && state.equals(address.state) && zipCode.equals(address.zipCode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(street, city, state, zipCode);
    }
}
  • Address 클래스는 불변이며, 동일한 값을 가지는 객체는 동일한 객체로 간주한다.

'백엔드개발 > Spring' 카테고리의 다른 글

MVC 디자인 패턴, 모델 속 요소들  (0) 2024.05.22
SPRING Framework  (0) 2024.03.23
메이븐 (Maven)  (1) 2024.03.14
의존성 주입  (0) 2024.03.14
스프링 프레임워크  (1) 2024.03.14