Computer Science/CS

[CS] DTO Entity

owls 2024. 5. 6. 12:32
728x90

DTO  : 클라이언트와 서버 간 데이터 전송을 위해 설계된 객체

Entity : 데이터베이스에 저장되는 데이터 객체로, 데이터베이스와 직접적으로 연결

 

DTO

Data Transfer Object 데이터 전송 객체

프로세스 간에 데이터를 전달하는 객체이다.

원격 인터페이스로 작업을 할 때 호출에 따른 비용이 비싸기 때문에 요청의 횟수를 줄여야 하고, 이를 위해 한 번의 요청에 더 많은 데이터를 전송해야 한다.

외부와 통신하는 프로그램에게 호출은 큰 비용이며, 이를 줄이고 더욱 효과적으로 값을 전달할 필요가 있다.

이를 위해 데이터를 모아 한 번에 전달하는 클래스를 DTO라고 한다.

 

API 사용을 할 때 DTO를 만들어서 작업

API스펙에 맞춰서 @ResponseBody Entity를 사용하는 것이 아니라 DTO를 만들어서 사용해야 한다.

Entity를 사용하게 되면 어디까지 API에서 받고 Binding되는지, 추가적으로 다른 코드에서 Binding했는지 모를 수 있다.

DTO에 해당 API를 맞춰서 받는 스펙을 알 수 있다.

 

Entity 직접 반환시 문제점

Entity를 직접 반환하면 Entity에 존재하는 모든 데이터가 반환된다.

(모든 데이터를 반환하게 되면 트래픽이 증가할 수 있으며 성능 및 비용면에서 현저한 차이를 가져올 수 있다)

이로 인해 불필요한 데이터를 사용자에게 전달될 수 있다.

 

보안 문제

Entity를 반환하면 테이블을 공개하는 것이나 다름없으므로 민감한 정보가 노출될 가능성이 있다.

 

 

DTO와 Entity 분리

View와 Model의 분리(MVC패턴)

DTO는 View(사용자 인터페이스)와 Controller(서버)간의 인터페이스 역할을 하며, Entity는 Model(데이터베이스)의 역할을 한다.

이러한 분리를 통해 MVC패턴을 적용하여 코드의 가독성과 유지보수를 용이하게 할 수 있다.

 

보안 강화

DTO와 Entity를 분리함으로써 테이블 구조는 서버측에만 알 수 있으므로 API보안성을 강화시킬 수 있다.

 

Validation코드와 모델링 코드 분리

  • Validation 코드 : @NotNull, @NotEmpty, @NotBlank 등
  • 모델링 코드 : @Column, @JoinColumn, @ManyToOne, @OneToOne 등

Entity는 DB의 테이블과 매칭되는 필드가 선언되어 있다.

그렇기 때문에 Entity에는 모델링을 위한 코드가 추가된다.

하지만 이 Entity에 validation코드가 들어가게 된다면 Entity클래스는 더 복잡해지고 가독성이 떨어진다.

각각의 요청마다 다른 DTO를 만들어 상황에 따라 필요한 validation을 추가한다면 Entity클래스의 모델링에 집중할 수 있다.

 

DTO와 Entity 변환 위치

Controller - 클라이언트의 요청을 받고 응답을 반환

   컨트롤러에서는 DTO의 형태로 데이터를 받아 서비스에 전달한다.

Service - 비즈니스 로직을 수행하며 데이터 처리를 담당

    서비스에서는 컨트롤러에서 받은 DTO를 Entity로 변환하고,

    필요한 작업을 수행한 뒤에 Repository에 Entity를 전달한다.

  ▷ Service에서 DTO를 Entity로 변환하는 이유

     1. 비즈니스 로직을 처리하는 곳이므로 다양한 변화 로직을 적용할 수 있다.

     2. JpaRepository는 @Entity객체를 매핑해서 영속성화를 처리하여 JpaRepository<Entity, ID>

        Entity를 타입으로 받기 때문이다.

     3. 컨트롤러는 요청/응답 처리를 담당하므로 변환 처리를 하는 것이 책임 범위를 벗어난다.

     4. 리포지토리는 데이터베이스와의 인터페이스 역할을 하므로 DTO변환 역할을 가지면 책임 범위가 너무 커진다.

Repository - 데이터베이스와 인터페이스 역할

    서비스에서 Entity를 전달 받아 영속화를 처리한다.

   

 

여러가지 방법이 있지만 실용적인 개발 아키텍처는 컨트롤러, 서비스, 리포지토리 계층이 모두 엔티티 계층에 의존하는 것입니다. 왜냐하면 엔티티라는 것이 우리의 핵심 비즈니스이기 때문에 대부분의 로직은 엔티티가 필요하다.
-> 엔티티를 전체 구조에서 사용하자

 

 

 

 

참고

 

https://jjunn93.com/entry/JPA-entity-DTO-%EB%B3%80%ED%99%98

 

https://www.inflearn.com/questions/883901/dto%EC%97%90-entity-%ED%8F%AC%ED%95%A8

 

https://hstory0208.tistory.com/entry/SpirngJPA-Dto%EC%99%80-Entity%EB%A5%BC-%EB%B6%84%EB%A6%AC%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

https://velog.io/@jinny-l/Spring-DTO%EB%8A%94-%EC%96%B4%EB%94%94%EC%84%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%80%ED%99%98%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

 

 

 

https://velog.io/@jinny-l/Spring-DTO%EB%8A%94-%EC%96%B4%EB%94%94%EC%84%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%80%ED%99%98%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

728x90