Entity, DTO

Dobi·2024년 4월 21일

Spring

목록 보기
4/6

DTO, Entity ?

개발을 하다보면 DTO와 Entity를 분리해서 사용한다는 말을 많이 보게 되는데 DTO와 Entity는 무엇일까? 간략한 요약은 다음과 같다.

  • DTO(Data Transfer Object) : 클라이언트와 서버 간 데이터 전송을 위한 객체
  • Entity : 데이터 베이스에 저장되는 데이터 객체로 실제 테이블 컬럼을 필드로 가지는 객체

엔티티(Entity) ?

엔티티(Entity) 클래스는 실제 DB 테이블과 매핑되어 DB 테이블에 존재하는 컬럼들을 필드로 가지는 객체이다. 엔티티는 비즈니스 로직을 포함하는 도메인 엔티티와 DB관련 처리를 위한 영속성 엔티티(persistent)로 나눌 수 있다.

엔티티에서 setter 메서드를 사용할 수는 있지만 이는 변경되지 않은 인스턴스에 대해서도 setter로 접근이 가능해지므로 객체의 일관성, 안전성을 보장하기 힘들어 진다. 따라서 생성자(Consturctor)를 사용으로 불변 객체로서 활용할 수 있다.


DTO(Data Transfer Object) ?

DTO는 이름 그대로 데이터를 전달하기 위한 객체이다. 계층(Layer)간 데이터를 주고 받을 때 사용한다. 원래 DAO(Data Access Object) 패턴에서 DB 처리 로직을 숨기고 DTO를 이용해서 값을 보내는 용도로 사용했다. 주로 Controller와 View 사이에 데이터를 주고 받을 때 활용한다. 특히, Controller의 클라이언트와 직접 마주하는 계층에서 엔티티 대신 DTO를 사용한다.

DTO는 getter, setter 메서드를 포함하며 이 외의 비즈니스 로직은 포함시키지 않는다.


엔티티와 DTO의 역할분리?

엔티티와 DTO의 분리의 이유는 관심사의 분리(Separation of Concerns, SoC) 때문이다. SoC는 서로 다른 관심사를 분리함으로 변경 가능성을 최소화하고, 유연한 확장 가능한 시스템을 만드는 것이 목적이다. 쉽게 말하면 엔티티와 DTO를 분리한 이유는 둘이 바라보는 관심사가 다르다는 것이다.

DTO는 위에서 설명한대로 데이터의 전달을 위한 객체이다. 데이터를 담고 다른 계층 또는 컴포넌트에 데이터를 전달하는 것이다. DTO의 관심사는 데이터 전달이다.

엔티티는 실제 DB와 관련된 역할을 하며, 비즈니스 로직을 담을 수 있는 비즈니스 도메인의 일부라고 할 수 있다. 한 눈에 봐도 DTO의 관심사인 데이터 전달과는 거리가 멀어보인다.

따라서 엔티티와 DTO의 관심사가 서로 다르니 SoC 원칙에 의해 역할을 분리하는 것이다.

profile
양말 받을 때까지 공부하는 개발자 도비

0개의 댓글