Java DAO DTO VO Entity Concepts (자바 DAO DTO VO 엔티티 개념)

[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 클래스 구조와 관계형 데이터베이스 테이블 구조가 일치함을 보여주는 다이어그램


이 네 개념은 자바 애플리케이션 데이터 관리와 계층 간 통신에 필수적이다. 각 객체의 명확한 역할을 이해하고 적절히 활용하는 것이 중요하다.

댓글