백엔드개발/Spring
DTO/VO/DAO란 ?
hyemi_flora
2024. 5. 22. 17:44
- DTO(Data Transfer Object)와 DAO(Data Access Object)의 공통점:
- 데이터 중심 - DTO는 데이터를 전송하는 데 사용되고, DAO는 데이터를 접근하고 조작하는 데 사용
- 비즈니스 로직 없음
- 명확한 책임 분리 - DTO와 DAO는 각각의 역할이 명확하게 분리되어 있다. DTO는 데이터 전송을, DAO는 데이터베이스 접근을 담당한다.
- VO (Value Object) : 값 객체로, 변하지 않는 데이터를 나타내는 데 사용된다.
- 변하지 않는 데이터를 표현 - Money, Date, Coordinate와 같은 객체가 VO의 대표적인 예시
- 비즈니스 도메인 모델링에 사용
- 객체 동일성을 값으로 판단 - VO는 동일성을 객체의 ID가 아닌 값 자체로 판단한다.
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 클래스는 불변이며, 동일한 값을 가지는 객체는 동일한 객체로 간주한다.