VO, DTO, Entity는 소프트 웨어 개발에서 데이터를 표현하고 다루는 데 사용되는 세 가지 패턴입니다.
항상 사용하고 있지만 정확한 개념과 차이점을 알고 사용하는 것이 좋을 것 같아 정리해 보았습니다.
VO (Value Object)
소프트웨어 개발에서 특정 값을 나타내는 객체입니다. 주로 불변(immutable)하게 설계되어 있어서 한 번 생성된 후에는 값을 변경할 수 없습니다. 이는 객체의 안정성과 일관성을 유지하고자 하는 목적에서 나온 개념입니다.
VO는 주요 특징은 다음과 같습니다.
- 불변성(Immutable)
VO는 한 번 생성되면 값을 변경할 수 없습니다. 이는 값의 일관성과 안정성을 보장하며, 예측 가능한 동작을 제공합니다. - 종속성(Dependabillity)
VO는 값을 나타내는 객체로 주로 특정 비즈니스 규칙에 종속됩니다. 예를 들어, 날짜, 금액, 좌표 등이 값 객체의 예시입니다. - 동일성 기반 동등성(Equivalence Based on Identity)
VO는 주로 값이 같으면 동일하고 간주됩니다. 따라서 두 VO 객체가 같은 값을 가지면, 두 객체는 동일한 것으로 간주됩니다. - 비즈니스 의미 부여(Meaningful Business Value)
VO는 특정 비즈니스 의미를 가진 값을 나타내기 위해 사용됩니다. 예를 들어, 금액 객체는 특정 금전의 양을 나타냅니다.
아래는 Java에서의 간단한 VO의 예시입니다.
public class Money {
private final int amount;
public Money(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
// 다른 메서드들...
}
이 예시에서 Money 클래스는 불변성을 가진 값 객체입니다. amount 필드는 한번 설정되면 변경될 수 없고 getAmount 메서드를 통해서만 값을 얻을 수 있습니다. 이렇게 값 객체를 사용하면 코드의 가독성이 좋아지고, 데이터의 일관성을 유지하는데 도움이 됩니다.
DTO
소프트웨어 개발에서 주로 계층 간 데이터 전달을 위해 사용되는 객체입니다.
DTO는 비즈니스 로직을 포함하지 않고, 주로 데이터 전송을 위한 목적으로 사용됩니다.
이는 서로 다른 시스템이나 레이어 간에 데이터를 전송할 때 사용되는 객체로, 데이터를 캡슐화하고 전달하는 데 중점을 둡니다.
DTO의 주요 특징은 다음과 같습니다.
- 비즈니스 로직의 부재
DTO는 주로 데이터 전송을 위한 목적으로 사용되기 때문에, 비즈니스 로직을 담고 있지 않습니다.
데이터를 담고 전송하기 위한 필드들로 이루어져 있습니다. - 데이터 전송을 위한 구조
주로 여러 필드를 가지고 있고, 이 필드들은 다른 시스템 또는 계층 간에 데이터를 전송하는 데 사용됩니다. - 가변성
DTO는 주로 가변 한 형태를 가지며, 필요에 따라 데이터 전송을 위한 구조가 변경될 수 있습니다. - 클라이언트-서버 또는 서비스 간 데이터 전송
주로 클라이언트와 서버 간 또는 서비스 간에 데이터를 주고받을 때 사용됩니다.
아래 Java에서의 간단한 DTO의 예시입니다.
public class UserDTO {
private String username;
private String email;
// 간단한 생성자, 게터, 세터 등...
// 다른 메서드들...
}
이 예시에서 UserDTO 클래스는 사용자 정보를 전송하기 위한 목적으로 사용되는 데이터 전송 객체입니다.
필드로는 사용자의 이름(username)과 이메일(email)이 있으며, 비즈니스 로직을 담고 있지 않습니다.
주로 웹 요청이나 응답, 서비스 간 데이터 교환 등에 사용됩니다.
Entity
소프트웨어에서 데이터베이스에 저장되고 관리되는 객체를 주로 나타냅니다.
주로 데이터베이스의 테이블과 매핑되어 데이터베이스에서 행으로 표현됩니다.
Entity의 주요 특징은 다음과 같습니다.
- 지속성(Persistence)
일정한 기간 동안 존재하며, 데이터베이스에 저장되어야 합니다. 따라서 애플리케이션이 종료되거나 데이터베이스가 리셋되더라도 데이터가 유지됩니다. - 유일성(Identity)
각 Entity는 유일한 식별자를 가지고 있어야 합니다. 이를 통해 애플리케이션 내에서 특정한 Entity를 구별할 수 있습니다. - 데이터와 비즈니스 로직
데이터 : Entity는 주로 데이터를 표현하기 위해 사용됩니다. 예를 들어, 사용자 정보, 주문 정보 등이 Entity로 표현될 수 있습니다.
비즈니스 로직 : Entity는 종종 비즈니스 로직을 가지기도 합니다. 예를 들어, 주문이나 사용자 정보를 다루는데 필요한 특정 동작들이 이에 해당합니다. - 생명주기(Lifecycle)
Entity는 일정한 생명주기를 가집니다. 생성, 수정, 삭제 등의 동작에 따라 데이터베이스에 영향을 주며, 이를 통해 데이터의 변화를 추적할 수 있습니다.
예를 들어 Java에서 JPA(Java Persistence API)를 사용한 Entity 클래스 예시입니다.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
// 생성자, 게터, 세터, 비즈니스 로직 등...
// Getter와 Setter 메서드는 데이터베이스와 객체 간의 상호작용을 도와주는 역할을 합니다.
}
이 예시에서 User 클래스는 @Entity 어노테이션을 통해 JPA에게 이 클래스가 데이터베이스의 테이블과 매핑된다는 것을 알려줍니다.
@Id 어노테이션은 이 클래스 id 필드가 데이터베이스에서 Primary Key 역할을 한다는 것을 나타냅니다.
VO vs DTO vs Entity
| VO | DTO | Entity | |
| 목적 | 주로 값을 나타내기 위해 사용되며, 주로 불변성과 값의 안정성을 강조합니다. 비즈니스 로직을 가지지 않습니다. |
계층 간 데이터 전송을 위해 사용되며, 주로 가변성을 가집니다. 비즈니스 로직을 가지지 않고, 데이터 전송에 중점을 둡니다. |
데이터베이스에 저장되고 관리되는 객체로 비즈니스 로직을 가질 수 있습니다. 주로 데이터베이스 테이블과 매핑됩니다. |
| 불변성 여부 | 불변(Immutable)하며, 한 번 생성된 후에는 값을 변경할 수 없습니다. | 주로 가변하며, 데이터 전송을 위한 목적으로 사용되므로 변경이 가능합니다. | 객체의 상태가 변경될 수 있으며, 데이터베이스의 상태와 일치시키기 위해 업데이트 될 수 있습니다. |
| 비즈니스 로직 포함 여부 | 주로 데이터의 값을 표현하기 위한 목적으로 사용되며 비즈니스 로직을 포함하지 않습니다. | 비즈니스 로직을 포함하지않고 단순히 데이터 전송을 위한 목적으로 사용됩니다. | 비즈니스 로직을 가질 수 있으며, 주로 데이터의 행동과 관련된 로직이 포함됩니다. |
| 사용 용도 | 주로 값의 안정성을 필요로 하는 곳에서 사용됩니다. 예를 들어, 금액, 날짜, 좌표 등이 값 객체의 예시 입니다. |
계층 간 데이터 전송이 필요한 곳에서 사용됩니다. 주로 서비스 간 데이터 교환, 웹 요청 및 응답에 사용됩니다. |
데이터베이스에서 지속성을 가지는 객체로 데이터베이스 테이블과 매핑됩니다. 비즈니스 로직을 가지기도 합니다. |
이러한 패턴들은 각자의 목적과 특징을 가지고 있어 소프트웨어를 구조화하고 다루는 데에 유용하게 활용됩니다.
'개발끄적' 카테고리의 다른 글
| 414 Request-URI Too Large 오류 해결 방법 (0) | 2024.11.21 |
|---|---|
| GraphQL vs REST: 어떤 것을 선택할 것인가? (0) | 2024.11.18 |
| 크롬 디버거로 JavaScript OOM 문제 해결하기 (1) | 2024.11.15 |
| 효율적인 프로그래밍을 위한 동기/비동기와 블로킹/논블로킹 이해하기 (0) | 2024.11.10 |
| 계층형 아키텍처와 도메인형 아키텍처: 패키지 구조의 비교 (0) | 2024.06.24 |