DTO 와 Entity의 차이점 및 필요성
DTO(Data Transfer Object)
DTO는 데이터 전송으 목적으로 하는 객체이다. 주로 한 시스템의 계층에서 다른 계층으로 데이터를 전달하거나, 서로 다른 시스템 간 데이터를 전송할 때 사용된다.
특징
- 순수 데이터 객체 : DTO는 데이터를 캡슐화하는 데 집중하며, 비즈니스 로직을 포함하지 않는다.
- 읽기와 쓰기 전용 : 보통 getter 와 setter 메서드로 데이터에 접근하며, 간단한 데이터 구조를 가진다.
- 데이터 최적화 : 필요하지 않은 데이터는 포함하지 않고, 필요한 데이터만 포함하여 전송 효율성을 높인다.
- 플랫폼 독립적 : 주로 API응답, 요청, 클라이언트-서버 간 통신에서 사용된다.
예시 코드
@Getter
@Setter
@ToStirng
public class UserDTO {
private String name;
private String email;
}
Entity
Entity는 주로 데이터베이스와 직접적으로 연관된 객체로, 데이터베이스의 테이블 구조를 반영한다.
특징
- 비즈니스 로직 포함 : 데이터베이스와 상호작용하며, 비즈니스 규칙을 포함할 수 있다.
- 영속성 : JPA 같은 ORM(Object-Relational Mapping) 프레임워크를 통해 데이터베이스와 매핑된다.
- 정확한 데이터 구조 반영 : Entity는 데이터베이스 테이블의 필드를 기반으로 설계된다.
- 생명 주기 : Entity는 영속 상태, 비영속 상태, 분리 상태 등의 생명 주기를 가지며, 데이터베이스와 밀접한 관계를 가진다.
예시 코드
@Getter
@Setter
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Loing id;
private String name;
private String email;
DTO 와 Entity 의 차이점
| 구분 | DTO | Entity |
| 역할 | 데이터 전송 및 응답/요청 최적화 | 데이터베이스와의 상호작용 및 비즈니스 로직 포함 |
| 영속성 | 영속성과 무관 | 데이터베이스와 매핑 (JPA 등) |
| 데이터 범위 | 필요한 데이터만 포함 | 데이터베이스 테이블 전체 구조 반영 |
| 사용 목적 | 클라이언트-서버 간 또는 계층 간 데이터 전송 | 데이터베이스와 연동 및 영속성 관리 |
| 비즈니스 로직 | 없음 | 비즈니스 로직 포함 가능 |
| 생명 주기 | 독립적 | 데이터베이스 생명 주기를 따름(영속, 분리, 삭제 등) |
DTO 와 Entity 가 필요한 이유
1. 책임 분리
- Entity는 데이터베이스와 직접적으로 상호작용하기 때문에, 데이터 전송과 관련된 로직을 추가하면 설계가 복잡해질 수 있다.
- DTO를 사용하면 데이터 전송 책임과 데이터베이스 작업 책임을 분리하여 코드의 유지보수성과 가독성을 높일 수 있다.
2. 보안
- Entity는 직접 클라이언트에 노출하면 불필요한 민감 정보(예: 비밀번호, ID 등)가 전송될 위험이 있다.
- DTO를 사용하면 전송 데이터를 제한하여 보안성을 강화할 수 있다.
3. API의 유연성
- DTO는 클라이언트 요구사항에 맞게 데이터를 조합하거나, 필요한 필드만 선택적으로 제공할 수 있다.
- Entity는 데이터베이스 구조에 종속적이므로, 클라이언트의 요구사항을 직접적으로 반영하기 어렵다.
4. 성능 최적화
- DTO를 통해 필요한 데이터만 전송하면 네트워크와 메모리 사용량을 줄일 수 있다.
- Entity는 모든 필드와 연관된 데이터까지 포함할 수 있어 전송 데이터가 불필요하게 많아질 수 있다.
DTO 와 Entity 간의 관계
DTO와 Entity는 일반적으로 변환 과정을 통해 연결된다. 이 변환은 매퍼(mapper)를 사용하거나, 수동으로 구현할 수 있다. 대표적인 매퍼 라이브러리로는 MapStruct, ModelMapper 등이 있다.
수동 변환 예시 코드
public class UsreMapper {
public static UserDTO toDTO(User user) {
UserDTO dto = new UserDTO();
dto.setName(user.getName());
dto.setEmail(user.getEmail());
return dto;
}
public static User toEntity(UserDTO dto) {
User user = new User();
user.setName(dto.getName());
user.setEmail(dto.getEmail());
return user;
}
}
MapStruct를 사용한 예시 코드
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
UserDTO toDTO(User user);
User toEntity(UserDTO dto);
}
DTO 와 Entity 는 각각의 목적과 역할이 분명히 나뉘어 있으며, 이 둘을 적절히 활용하면 어플리케이션 설계와 유지보수를 크게 향상시킬 수 있다. DTO는 데이터 전송의 최적화를, Entity는 데이터베이스와의 상호작용을 담당하며, 이 둘의 변환은 매퍼를 통해 간단히 이루어질 수 있다. 이러한 분리 설계는 대규모 프로젝트에서 코드의 일관성과 가독성을 높이고, 보안과 성능을 개선하는 데 필수적이다.
'TIL(Today I Learned)' 카테고리의 다른 글
| 2025.01.02 Today I Learned (0) | 2025.01.02 |
|---|---|
| 2025.01.01 Today I Learned (0) | 2025.01.01 |
| 2024.12.23 Today I Learned (0) | 2024.12.23 |
| 2024.12.19 Today I Learned (2) | 2024.12.19 |
| 2024.12.17 Today I Learned (3) | 2024.12.17 |