본문 바로가기
TIL(Today I Learned)

2024.12.24 Today I Learned

by 승환파크 2024. 12. 23.

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