TIL | [기술면접대비] DTO를 사용하는 이유/직렬화(serialization)

hyemin·2022년 6월 21일
3

DTO란?

DTO(Data Transfer Object, 데이터 전송 객체)는 프로세스 간에 데이터를 전달하는 객체이다.

DTO 사용 이유

1. Entity 내부 구현 캡슐화 가능

  • Entity는 도메인의 핵심 로직과 속성을 가지며, 실제 DB 테이블과 매칭되는 클래스이다.
  • 따라서 Entity가 Getter, Setter를 가진다면 controller와 같이 비즈니스 로직과 큰 상관없는 곳에서 자원의 속성이 실수로 변경될 가능성이 있음.
  • DTO를 사용하여 Entity를 UI계층에 노출시키지 않아 보안상으로도 바람직함

2. 화면에 필요한 데이터 선별 가능

  • 다양한 API 스펙에 따라 필요한 데이터만 포함된 DTO를 만들어 request/response함으로써 전송 속도 개선 가능

3. 순환참조 방지

  • 양방향 매핑된 Entity를 controller에서 response로 return하면 Entity가 참조하는 객체가 지연 로딩되면서 순환참조에 빠질 수 있음
  • 이때, DTO를 return하여 순환참조를 방지할 수 있다

4. validation 코드와 모델링 코드 분리 가능

  • @NotNull, @NotEmpty, @NotBlank 같은 validation 코드를 DTO에 정의함으로써 Entity에서는 모델링과 비즈니스 로직에 집중할 수 있음

(자바) 직렬화(serialization)란?

  • 값 형식 데이터 : integer, float, charactor 등의 기본 타입
  • Object 형식 데이터 : 메모리 주소값을 가진 데이터

데이터는 위와 같이 크게 2가지로 나뉠 수 있는데, 이 중 저장/전송 가능 데이터는 값 형식 데이터이다.

자바 입출력은 스트림이라는 데이터 통로를 이용하는데, 객체는 byte 형태가 아니라서 스트림을 통해 파일을 저장하거나 네트워크 전송이 불가능하다. 따라서 객체를 스트림을 통해 입출력하기 위해 byte 형태로 전환할 필요가 있는데, 이를 직렬화(serialization)라고 한다.

  • Java 시스템 내부에서 사용되는 Objecet나 Data를 외부의 Java 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술(객체를 전송가능한 byte 형태로 변환하는 것)

반대로 네트워크나 저장소에서 byte 스트림을 가져와 객체로 변환하는 것을 역직렬화(Deserialization)라고 부른다.

(메모리 구조상 데이터를 순차적으로 읽어 오는 방법이 가장 빠르기 때문에 RDBMS 구조와 달리 일직선의 연속적인 값의 형태를 가지게 되어 직렬화라는 이름이 붙음)

직렬화가 필요한 상황

JVM 메모리에 머물러있는 객체를 영속화(Persistence)할 필요가 있을 때 사용된다.

  • 시스템이 종료되도 데이터가 보존 가능
  • 네트워크 전송 가능

-> 저장/전송시 파싱할 수 있는 데이터를 만들기 위해 사용

0개의 댓글