Spring Data JPA

Spring JPA - 엔티티를 DTO로 바꿔서 사용하는 이유

Stark97 2023. 8. 13. 02:33
반응형

이번 포스트에서는 SpringBoot 프로젝트에서 왜 Entity를 DTO로 변환시켜서 사용하는지 알아보자

 

1. 엔티티와 DTO


  • 엔티티(Entity):
    • 엔티티는 데이터베이스의 테이블과 직접 매핑되는 객체로, 비즈니스 로직을 포함할 수 있다. 엔티티는 데이터베이스와의 상호작용을 위해 설계되며, 변경이 발생하면 데이터베이스 스키마에도 영향을 미칠 수 있다.

  • DTO(Data Transfer Object):
    • DTO는 계층간 데이터 교환을 위한 객체로, 로직을 포함하지 않고 순수한 데이터만을 가지고 있다. DTO는 특정 엔티티의 일부 데이터나 여러 엔티티의 조합된 데이터를 전달하는 데 사용될 수 있으며, 클라이언트와 서버 간의 통신에 최적화된 구조를 가진다.

 


 

2. 엔티티를 직접 사용하는 문제점


  • 데이터 노출 문제
    • 엔티티를 직접 사용하면 클라이언트에게 불필요한 정보까지 노출될 수 있으며, 보안에 민감한 정보까지 유출될 위험이 있다.

  • 결합도 증가
    • 엔티티 변경이 API 스펙에 직접 영향을 미칠 수 있어, 엔티티와 API 간의 강한 결합이 발생한다. 이로 인해 유지보수가 어려워지며, 확장성이 제한된다.

  • 성능 이슈
    • 필요한 정보만을 선택적으로 제공할 수 없어 성능 최적화가 어려워진다. 불필요한 데이터까지 로드하게 되면 시스템의 응답 시간과 리소스 사용량이 증가할 수 있다.

 


 

3. DTO 사용의 장점


  • 데이터 노출 제어
    • DTO를 사용하면 필요한 정보만을 선택적으로 제공할 수 있으며, 민감한 정보의 노출을 방지할 수 있다. 이로 인해 클라이언트에게 정확한 데이터를 안전하게 전달할 수 있다.

  • 유연한 구조
    • API 스펙과 엔티티 간의 결합도를 낮춰 유지보수를 용이하게 하며, 변경에 대한 영향을 최소화한다. 이로 인해 시스템의 확장성과 유연성이 향상된다.

  • 성능 최적화
    • 필요한 데이터만을 로드하여 성능을 향상시킬 수 있으며, 네트워크 트래픽을 최소화할 수 있다. 이는 시스템 전체의 효율성을 높이는 데 기여한다.

예시 코드
// 엔티티 클래스
@Entity
public class User {
    @Id
    private Long id;
    private String username;
    private String password; // 클라이언트에게 노출되면 안 되는 정보
    
    // Getters, Setters, Constructors ...
}

// DTO 클래스
public class UserDTO {
    private Long id;
    private String username; // 필요한 정보만 포함
    
    // Getters, Setters, Constructors ...
}

// 변환 로직
public UserDTO convertToDTO(User user) {
    return new UserDTO(user.getId(), user.getUsername());
}
  • 위의 예시에서 User 엔티티에는 민감한 정보인 password가 포함되어 있다. 이를 클라이언트에게 노출시키지 않기 위해 UserDTO를 사용하여 필요한 정보만을 전달한다.

 


 

DTO를 사용하면 데이터 노출을 제어하고, 유연한 구조를 가지며, 성능을 최적화할 수 있다.
따라서 JPA와 Spring Boot 환경에서는 엔티티 대신 DTO를 사용하여 데이터를 처리하는 것이 바람직하다.




2023.08.13 - [JPA] - Spring JPA - 연관관계 매핑

 

Spring JPA - 연관관계 매핑

코딩은 글쓰기라고 생각한다. 나는 이 블로그에 나의 모든 개발일상을 적을것이다.

curiousjinan.tistory.com

 

반응형