Java에서 데이터 전송 및 관리를 위해 다양한 데이터 객체 유형이 사용됩니다. 대표적으로 DTO (Data Transfer Object), VO (Value Object), DAO
(Data Access Object) 가 있으며, 각각의 목적과 사용 방식이 다릅니다. 이번 글에서는 이 개념들을 비교하고 차이점을 명확히 정리하겠습니다.
1. DTO (Data Transfer Object)
1.1 DTO란?
DTO(Data Transfer Object)는 데이터를 전달하기 위한 객체입니다. 계층 간(예: Controller → Service → Repository) 데이터를 주고받을 때 사용되며, 비즈니스 로직이 포함되지 않습니다.
1.2 DTO의 특징
- 데이터를 운반하는 역할만 함
- 직렬화(Serializable) 가능
- Getter/Setter를 포함하여 데이터를 읽고 쓸 수 있음
- 불변(Immutable)하지 않음 (값이 변경될 수 있음)
1.3 DTO 예제
public class UserDTO {
private String name;
private String email;
public UserDTO() {}
public UserDTO(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
✅ 사용 목적: 클라이언트와 서버 간 데이터 전송
✅ 예제 활용: API 응답 및 요청 데이터 전송
2. VO (Value Object)
2.1 VO란?
VO (Value Object)는 값을 표현하는 불변 (Immutable) 객체입니다. 동일한 값을 가진다면 같은 객체로 간주되며, 객체 자체가 아닌 내부 데이터의 동일성이 중요합니다.
2.2 VO의 특징
- 불변 (Immutable): 한 번 생성되면 변경되지 않음
- 비즈니스 로직을 포함하지 않음
- 동일한 값이면 같은 객체로 취급 (equals, hashCode 재정의 필요)
2.3 VO 예제
public final class MoneyVO {
private final int amount;
private final String currency;
public MoneyVO(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
public int getAmount() {
return amount;
}
public String getCurrency() {
return currency;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MoneyVO moneyVO = (MoneyVO) obj;
return amount == moneyVO.amount && currency.equals(moneyVO.currency);
}
@Override
public int hashCode() {
return Objects.hash(amount, currency);
}
}
✅ 사용 목적: 값을 변경할 필요가 없는 객체 표현
✅ 예제 활용: 가격, 좌표, 이메일 주소 등의 불변 데이터
3. DAO (Data Access Object)
3.1 DAO란?
DAO (Data Access Object) 는 데이터베이스와 직접 상호작용하는 객체입니다. 데이터의 조회, 저장, 수정, 삭제 등의 기능을 담당하며, 비즈니스 로직과 데이터 액세스를 분리하는 역할을 합니다.
3.2 DAO 의 특징
- 데이터베이스와 직접 연결
- SQL 쿼리 실행 및 결과 처리
- Persistence Layer (영속 계층) 담당
- 비즈니스 로직이 포함되지 않음
3.3 DAO 예제 (JDBC 활용)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDAO {
private Connection connection;
public UserDAO(Connection connection) {
this.connection = connection;
}
public UserDTO getUserById(int id) throws SQLException {
String query = "SELECT name, email 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.getString("email"));
}
}
return null;
}
}
✅ 사용 목적: 데이터베이스 연동 및 CRUD 처리
✅ 예제 활용: DB에서 사용자 정보 가져오기, 저장하기, 삭제하기 등
4. 결론
- DTO: 데이터 전송을 위한 객체로, 계층 간 데이터를 주고받을 때 사용됨.
- VO: 값 객체로, 불변성을 유지해야 하는 경우 사용됨.
- DAO: 데이터베이스와 직접 상호작용하는 객체로, CRUD 작업을 담당함.
'java' 카테고리의 다른 글
| Set 에 관하여 (0) | 2025.02.11 |
|---|---|
| List 에 관하여 (0) | 2025.02.10 |
| Synchronized 에 관하여 (0) | 2025.02.05 |
| 접근 제한자에 관하여 (1) | 2025.02.04 |
| 정적 바인딩과 동적 바인딩에 관하여 (0) | 2025.02.04 |