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

2023. 8. 13. 02:33·Spring/JPA
반응형

이번 포스트에서는 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

 

반응형

'Spring > JPA' 카테고리의 다른 글

[Spring] JPA 엔티티에 왜 기본 생성자가 필수일까?  (1) 2024.10.21
[Spring] Redis에서 RDB로 조회수 동기화하기  (25) 2024.02.10
JPA N+1 문제가 발생하는 상황과 해결방법  (6) 2023.12.28
[SpringBoot] 3.x.x 버전에서 P6Spy 적용하기  (3) 2023.11.17
[Spring] Data JPA의 구조를 알아보자  (1) 2023.10.24
'Spring/JPA' 카테고리의 다른 글
  • [Spring] Redis에서 RDB로 조회수 동기화하기
  • JPA N+1 문제가 발생하는 상황과 해결방법
  • [SpringBoot] 3.x.x 버전에서 P6Spy 적용하기
  • [Spring] Data JPA의 구조를 알아보자
Stark97
Stark97
문의사항 또는 커피챗 요청은 링크드인 메신저를 보내주세요! : https://www.linkedin.com/in/writedev/
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (240)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (5)
      • MSA (14)
      • DDD (7)
      • gRPC (9)
      • Apache Kafka (18)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
Spring JPA - 엔티티를 DTO로 바꿔서 사용하는 이유
상단으로

티스토리툴바