개발 이모저모/Java & Web

[Java] DTO & VO & BO

오징어달료 2024. 9. 27. 02:51

Java & Object


DTO & VO & BO


DTO(Data Transfer Object)

DTO는 계층 간 데이터를 전달하는데 사용되는 객체.
주로 서비스 계층과 프리젠테이션 계층 또는 클아이언트와 서버 간에 데이터를 주고 받을때 사용됨.

특징

1. 단순한 데이터 저장 역활 : DTO는 일반적으로 getter와 setter 메서드만을 포함하며, 비즈니스 로직이 없음

2. 데이터 전송 : 네트워크 통신, 파일 저장, 또는 데이터베이스 조회 결과 등을 외부 계층으로 전달하는 역활

3. 직렬화 가능 : DTO는 네트워크 통신을 위해 자주 직렬화됨. 즉, 객체를 바이트 스트림으로 변환해 전송할 수 있음.

4. 계층 간의 결합도 감소 : 비즈니스 로직이 없는 순수한 데이터 객체이므로, 여러 계층 간의 의존성을 줄이고 결합도를 낮춤

// DTO 객체는
// 단순히 데이터를 담기 위한 객체

public class UserDTO {
    private String username;
    private String email;
    
    public UserDTO() {}
    
    public UserDTO(String username, String email) {
        this.username = username;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

VO(Value Object)

VO는 주로 값(Value)을 표현하기 위한 객체로, 객체 간의 동등성(equality)을 중요시함.
VO는 주로 불편객체(immutable)로 만드러지며, 특정 값을 표현하거나 전달하는 데 사용.

특징

1. 불변성 : VO는 생성 후 값이 변경되지 않도록 설계됨. 즉, VO는 객체의 상태가 한 번 설정되면 변경되지 않는 불변 객체.

2. 동등성 비교 : VO는 동등성을 비교할 때 객체의 참조 값이 아닌, 내부의 값 자체를 기준으로 함. 두 VO 객체의 값이 같다면, 같은 객체로 간주.

3. 작은 데이터의 갭슐화 : 이름, 좌표, 날짜, 금액 등의 특정 값을 표현하는 데 자주 사용됨

public class AddressVO {
    private final String street;
    private final String city;
    
    public AddressVO(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }

    // VO에서는 equals와 hashCode 메서드를 재정의하는 것이 일반적입니다.
    // AddressVO는 street와 city라는 두 필드로 이루어진 불변 객체로, 값을 비교할 때 값 자체를 
    // 기준으로 동등성을 비교
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        AddressVO that = (AddressVO) obj;
        return Objects.equals(street, that.street) && Objects.equals(city, that.city);
    }

    @Override
    public int hashCode() {
        return Objects.hash(street, city);
    }
}

BO(Business Object)

BO는 비즈니스 로직을 포함한 객체로, 비즈니스 계층에서 사용됨. BO는 애플리케이션의 핵심 비즈니스 로직을 처리하고, 데이터를 변환하거나 조작하는 역활을 함.

특징

1. 비즈니스 로직 포함 : BO는 데이터뿐만 아니라, 그 데이터에 대한 비즈니스 규칙과 로직을 포함하고 있음

2. 비즈니스 규칙 캡슐화 : BO는 특정 도메인의 규칙과 로직을 캡슐화하여 재사용성을 높이고, 유지보수성을 향상 시킴

3. 데이터의 상태를 관리 : BO는 애플리케이션의 도메인 모델과 관련된 데이터를 처리하며, 해당 데이터를 가지고 비즈니스 로직을 수행

// OrderBo는 주문 금액에 대한 비즈니스 로직(할인 계산)을 포함하고 있으며, 데이터를 조작함

public class OrderBO {
    private double totalAmount;
    
    public OrderBO(double totalAmount) {
        this.totalAmount = totalAmount;
    }

    public double calculateDiscount() {
        // 비즈니스 로직: 총 금액이 100 이상일 경우 10% 할인
        if (totalAmount >= 100) {
            return totalAmount * 0.1;
        }
        return 0;
    }

    public double applyDiscount() {
        // 할인된 금액을 적용하여 최종 금액을 반환
        double discount = calculateDiscount();
        return totalAmount - discount;
    }

    public double getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(double totalAmount) {
        this.totalAmount = totalAmount;
    }
}

핵심

- DTO (Data Transfer Object) : 데이터 전달을 위한 단순한 객체, 비즈니스 로직 없음.

- VO (Value Object) : 값을 표현하는 불변 객체, 동등성은 값 자체로 비교.

- BO (Business Object) : 비즈니스 로직을 포함한 객체, 데이터의 상태 관리와 비즈니스 규칙 처리.

- DTO & VO & BO 는 서로 다른 계층에서 각각의 목적에 맞게 사용되며, 시스템을 모듈화하고 유지보수성을 높이는데 중요한 역활을 함