최근 내 개인프로젝트를 준비하면서 mybatis를 버리고 JPA 도입했다. 그 과정에서 객체를 담당하는 클래스를 VO에서 Entity로 바꾸는 과정이 있었는데, 솔직히 암만 봐도 같은 기능인데 차이점이 뭐길래 이름을 바꾸는가 궁금해서 알아왔다.
1. VO (Value Object)
정의
- VO(Value Object)는 값 그 자체를 표현하는 객체. 동일한 값을 가지고 있으면 동일한 객체로 취급됨. 불변성을 보장하며, 값 자체를 비교하기 때문에 객체의 ID나 참조가 아닌 내용으로 동일성을 판단한다.
주요 특징
- 불변성: VO는 생성 후 상태가 변하지 않는다. 값을 수정하려면 새로운 VO 객체를 생성해야 한다.
- 동일성 판단: VO는 객체의 상태(값)가 동일하면 같은 객체로 간주된다.
- 비즈니스 로직 포함 가능: VO는 값과 관련된 비즈니스 로직을 포함할 수 있다.
- 사용 예: 좌표(Point), 돈(Money), 날짜(Date) 등
예시 코드
public class Money {
private final int amount;
public Money(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Money money = (Money) o;
return amount == money.amount;
}
@Override
public int hashCode() {
return Objects.hash(amount);
}
}
2. DTO (Data Transfer Object)
정의
- DTO는 계층 간 데이터를 전송하기 위한 객체. 주로 Controller와 Service 간 또는 외부 API 간의 데이터를 주고받기 위한 목적으로 사용된다. 순수한 데이터의 전달이 목적이므로, 비즈니스 로직을 포함하지 않는다.
주요 특징
- 가변성: 데이터를 전달하는 목적으로 생성되며, 데이터를 담고 보내는 객체이기 때문에 값이 변경될 수 있다.
- 로직 없음: DTO는 비즈니스 로직을 포함하지 않고, 오직 데이터 전달의 역할만 수행한다.
- 직렬화 가능: 데이터를 외부로 전송하기 위해 직렬화(Serialization)되어 사용된다.
- 사용 예: API 요청/응답 데이터, 뷰와 데이터 전달 객체 등
예시 코드
public class UserDTO {
private String name;
private int age;
public UserDTO(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. Entity
정의
- Entity는 데이터베이스 테이블과 매핑되는 객체로, 영속성을 가지며, JPA(Entity Framework) 등을 통해 데이터베이스와 직접적으로 상호작용하는 객체다. Entity는 고유한 식별자를 가지며, 동일성은 주로 ID를 기준으로 판단된다.
주요 특징
- 식별자(ID) 존재: Entity는 고유한 식별자를 가지며, 이를 통해 동일성을 판단한다.
- 가변성: 필요에 따라 상태를 변경할 수 있으며, 데이터베이스에 반영된다.
- 영속성: 데이터베이스와 연결되어, 데이터의 생성, 수정, 삭제가 가능하다.
- 사용 예: User, Order, Product 등의 데이터베이스 테이블과 매핑되는 클래스
예시 코드 (Java)
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// Getters and Setters
}
요약
- VO: 값 그 자체를 표현하는 객체로, 불변성을 가집니다. 동일성은 값에 기반한다.
- DTO: 계층 간 데이터 전송을 위한 객체로, 비즈니스 로직 없이 데이터 전달에 초점이 맞춰져 있다.
- Entity: 데이터베이스와 직접적으로 매핑되며, 고유한 식별자를 가지는 객체로, 영속성을 가진다.
뭐 알고 보니까 결국 따지고 보면 같은 기능이라고 느껴지긴하지만 타인이 코드를 볼 때, 의도를 조금 더 구분하기 쉬우려고하는 목적이 있는 것 같다.
'Coding History' 카테고리의 다른 글
리액트! (JS Filter) (1) | 2024.09.24 |
---|---|
chat 웹앱 수업. (0) | 2024.09.11 |
OAuto2 가 무엇인가? (1) | 2024.09.03 |
국비 지원 IT(웹앱개발) 취업반 강의 58일차 (Spring) (4) | 2024.08.28 |
국비 지원 IT(웹앱개발) 취업반 강의 57일차 (Spring) (9) | 2024.08.28 |