[JAVA] DAO, DTO, VO, Entity: 핵심 개념 및 활용
👨🏻🏫 핵심 개념 요약
- DAO (Data Access Object): DB 접근 및 CRUD 작업 전담 객체.
- DTO (Data Transfer Object): 계층 간 데이터 전달용 순수 객체.
- VO (Value Object): 값 표현, 불변성, 값 기반 동등성 객체.
- Entity: 실제 DB 테이블과 매핑되는 클래스.
🔌 DAO (Data Access Object)
DAO는 데이터베이스 CRUD 작업을 전담하며, 비즈니스 로직과 데이터 접근 로직을 분리하여 유지보수성을 높인다.
구현 예시:
DB에 데이터를 추가하는 add
메서드 예시.
import java.sql.*;
public class TestDao {
public void add(TestDto dto) throws SQLException {
String url = "jdbc:mysql://localhost:3306/dao_db?serverTimezone=UTC";
String user = "root";
String password = "1234";
String sql = "INSERT INTO test_table (name, value, data) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, dto.getName());
pstmt.setInt(2, dto.getValue());
pstmt.setString(3, dto.getData());
pstmt.executeUpdate();
}
}
}
이미지: DAO와 데이터베이스 아이콘이 화살표로 연결되어 CRUD 작업 흐름을 보여주는 다이어그램
🚚 DTO (Data Transfer Object)
DTO는 데이터 전달만을 위한 객체다. 로직 없이 필드와 Getter/Setter로 구성되며, 주로 계층 간 데이터 교환에 사용된다. 불변 DTO 구현이 권장된다.
구현 예시 (불변 DTO):
public class DtoExImmutable {
private final String name;
private final int age;
public DtoExImmutable(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
이미지: DTO가 UI/Controller와 서비스 계층 사이에서 데이터를 주고받는 흐름을 나타내는 다이어그램
🖥 VO (Value Object)
VO는 값 자체를 표현하며 불변성을 가진다. 모든 필드의 값이 동일하면 두 객체는 같다고 판단한다. equals()
와 hashCode()
오버라이딩이 필수다.
구현 예시:
Money
클래스는 값 표현과 값 기반 동등성 비교를 제공한다.
import java.util.Objects;
public class VoEx {
static class Money {
private final int value;
Money(int value) { this.value = value; }
public int getValue() { return value; }
@Override
public int hashCode() { return Objects.hash(value); }
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Money other = (Money) obj;
return value == other.value;
}
}
}
이미지: 동일한 값을 가진 두 VO 객체가 동등함을 나타내는 시각화된 예시
🧾 Entity
Entity는 실제 데이터베이스 테이블과 매핑되는 클래스다. 테이블 구조를 반영하며, 데이터 전달 목적으로는 사용하지 않는다.
구현 예시:
EntityEx
클래스는 데이터베이스 테이블과 매핑 가능하다.
public class EntityEx {
private Long id;
private String name;
private int value;
public EntityEx(Long id, String name, int value) {
this.id = id;
this.name = name;
this.value = value;
}
public Long getId() { return id; }
public String getName() { return name; }
public int getValue() { return value; }
}
이미지: Entity 클래스 구조와 관계형 데이터베이스 테이블 구조가 일치함을 보여주는 다이어그램
이 네 개념은 자바 애플리케이션 데이터 관리와 계층 간 통신에 필수적이다. 각 객체의 명확한 역할을 이해하고 적절히 활용하는 것이 중요하다.
댓글
댓글 쓰기