Entity와 DTO의 차이점과 사용

Entity와 DTO는 JPA에서 데이터베이스와 자바 객체 간의 매핑을 담당하는 두 가지 서로 다른 클래스 타입


Entity

  • Entity는 JPA의 영속성(Persistence)을 가지는 객체로, 데이터베이스의 테이블과 매핑된다.
  • 주로 데이터베이스의 엔티티와 일치하는 구조를 가지며, 데이터베이스와의 관계를 표현한다.
  • Entity 클래스는 데이터베이스에서 읽어온 데이터를 담는 데 사용되고, 데이터베이스에 데이터를 저장하거나 수정하는 데 사용한다.
  • 비즈니스 로직과 데이터베이스 관련 기능이 함께 포함될 수 있다.
  • Entity 클래스를 그대로 사용하면, 데이터베이스의 테이블과 1:1로 매핑되므로, API 또는 외부 시스템과의 데이터 전송에는 적합하지 않을 수 있다 .

DTO

  • DTO는 Entity와 다르게 순수하게 데이터 전송을 위한 객체이다.
  • 주로 클라이언트와 서버 간의 데이터 교환을 담당하며, 필요한 데이터만 포함한다.
  • 보통 Entity의 일부 필드를 추출하여 DTO 객체를 생성하거나, 여러 Entity를 조합하여 필요한 데이터를 하나로 묶어서 전송할 때 사용한다.
  • DTO는 불변성(Immutable)을 유지하는 것이 일반적이며, Getter 메서드만 가지고 있다.
  • 클라이언트가 사용하는 데이터가 데이터베이스의 엔티티와 정확히 일치하지 않을 때 유용하며, 데이터베이스의 엔티티를 수정하지 않고도 클라이언트의 요구사항에 맞게 데이터를 제공하는 데 사용된다.

DTO를 사용하는 이유는 다음과 같다

  • 보안과 응답 데이터의 정확성을 제어할 수 있다. 클라이언트에게 불필요한 정보를 노출하지 않고 필요한 정보만 전달할 수 있다.
  • 클라이언트의 요구사항에 따라 필요한 데이터를 효율적으로 전달할 수 있다. 데이터베이스와 1:1로 매핑되지 않는 경우에 유용하다.
  • 데이터 전송 시 필요한 데이터만 포함하므로, 데이터 전송과 처리 성능을 최적화할 수 있다.
  • 때때로 Entity를 그대로 사용할 수도 있지만, Entity를 직접 노출하면 비즈니스 로직과 데이터베이스 매핑이 노출되어 결합도가 높아질 수 있다.

  • DTO를 사용하여 이러한 결합도를 낮추고, 클라이언트와의 인터페이스를 단순화하여 유지보수성과 확장성을 높일 수 있다.


데이터 받아와서 DTO의 저장하는 흐름

  1. 엔티티(Entity) 정의: 데이터베이스의 테이블과 매핑되는 객체를 엔티티로 정의한다.

  2. JPQL 또는 Criteria API를 사용하여 원하는 데이터를 조회 : JPQL이나 Criteria API를 사용하여 객체를 대상으로 쿼리를 작성하고, EntityManager를 통해 데이터베이스에 쿼리를 실행한다.

  3. 조회한 데이터를 엔티티(Entity) 객체로 반환: 조회한 결과를 엔티티 객체로 반환.

  4. 필요한 경우 DTO에 데이터를 매핑한다: 엔티티 객체를 그대로 노출하기보다는 필요한 데이터만을 추출하여 DTO에 매핑하여 반환할 수 있다. 이는 클라이언트의 요구사항이나 보안 등의 이유로 인해 데이터 전송 시에 사용한다.

  5. DTO를 반환: 클라이언트에게 필요한 데이터를 담은 DTO를 반환한다.


JPA에서는 엔티티를 사용하여 데이터베이스와 객체 간의 매핑을 관리하고, 필요한 경우 DTO를 사용하여 데이터를 전달한다. 이를 통해 객체 지향적인 개발을 유지하면서 데이터베이스와의 상호작용을 편리하게 처리할 수 있다.