DAO, DTO, VO 의 개념

삼식이·2024년 3월 13일

DAO

DAO는 Data Access Object의 약자로, DB의 데이터에 접근하기 위한 객체를 가리킨다.

DB에 접근하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.

직접 DB에 접근하여 data를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

사용자는 자신이 필요한 interface를 DAO에게 던지고 DAO는 이 interface를 구현한 객체를 사용자에게 편리하게 사용할 수 있도록 반환한다.

DAO는 데이터베이스와 연결할 connection까지 설정되어 있는 경우가 많다. 따라서 MyBatis 등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.

public class UserDao {
    public User findById(int userId) {
        // 데이터베이스에서 사용자 정보를 가져오는 로직
        // 예시로 더미 데이터를 사용
        return new User(userId, "John Doe", "john@example.com");
    }

    public void save(User user) {
        // 사용자 정보를 데이터베이스에 저장하는 로직
    }

    // 다양한 데이터베이스 조작 메서드들...
}

DTO

DTO는 Data Transfer Object의 약자로, 계층간 데이터 교환을 위한 Java Bean 이며 VO라고도 표현한다.

데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체이다.

DTO는 로직을 가지지 않는 데이터 객체이고, 데이터와 그 데이터에 대한 접근을 위한 getter setter 메소드만 가진다. (Database에서 데이터를 얻어 Service나 Controller에 보낼 때 사용하는 객체이다.)

public class UserDto {
    private int userId;
    private String username;
    private String email;

    public UserDto(int userId, String username, String email) {
        this.userId = userId;
        this.username = username;
        this.email = email;
    }

    // Getter 및 Setter 메서드들...

    @Override
    public String toString() {
        return "UserDto{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

VO

VO는 Value Object의 약자로, 값 자체를 표현하는 객체이다.

자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용하는데, 불변 이라는 것은 read only 의 특징을 가진다.

VO는 DTO와 유사하지만 DTO와 달리 setter() 메소드는 가지지 않아 불변 클래스이다.

public class User {
    private int userId;
    private String username;
    private String email;

    public User(int userId, String username, String email) {
        this.userId = userId;
        this.username = username;
        this.email = email;
    }

    // Getter 메서드들...

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

0개의 댓글