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 는 서로 다른 계층에서 각각의 목적에 맞게 사용되며, 시스템을 모듈화하고 유지보수성을 높이는데 중요한 역활을 함
'개발 이모저모 > Java & Web' 카테고리의 다른 글
[Web] 헨젤과 그레텔 처럼 흔적을 남기는 세션과 쿠키 (0) | 2024.12.13 |
---|---|
[Java&Web] JAR & WAR & EAR (0) | 2022.06.08 |