1. DTO
DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans)입니다.

2. 사용하는 이유 ?
DTO를 사용하는 가장 큰 이유는, 자바 domain 객체를 바로 접근하지 않기 위해서 입니다.
고로! 가볍게 생각헤서, 테이블을 조작하기 위해 한단계더 거쳐가는 완충제라고 생각하면 됩니다.
* 테이블을 직접적으로 접근하지 않음으로써 데이터를 보호.
1) Entity 캡슐화
- Entity가 getter와 setter를 갖게 된다면, controller와 같은 비즈니스 로직과 크게 상관없는 곳에서 자원의 속성이 실수로라도 변경될 수 있다.
- Entity의 값이 변하면 Repository 클래스의 Entity Manager의 flush가 호출될 때 DB에 값이 반영되고, 이는 다른 로직들에도 영향을 미친다. 때문에 View와 통신하면서 필연적으로 데이터의 변경이 많은 DTO 클래스를 분리해주어야 한다.
- 또한 Entity를 UI계층에 노출하는 것은 테이블 설계를 화면에 공개하는 것이나 다름없기 때문에 보안상으로도 바람직하지 못한 구조가 된다.
- 따라서 Entity의 내부 구현을 캡슐화하고 UI계층에 노출시키지 않아야하는 것은 충분히 데이터 전달 역할로 DTO를 사용해야 할 이유로 볼 수 있다.
- Getter만을 이용해서 원하는 데이터를 표시하기 어려운 경우가 발생할 수 있는데, 이 경우에 Entity와 DTO가 분리되어 있지 않다면 Entity 안에 Presentation을 위한 필드나 로직이 추가되게 되어 객체 설계를 망가뜨리게 된다. 때문에 이런 경우에는 분리한 DTO에 Presentation 로직 정도를 추가해서 사용하고, Entity에는 추가하지 않아서 도메인 모델링을 깨뜨리지 않는다.
2) 화면에 필요한 데이터를 선별할 수 있다.
- 애플리케이션이 확장되면 Entity의 크기는 점차 커지게 되면서, 화면도 다양해지고, API 스펙도 더 많아질 것이다. 이때 요청과 응답으로 Entity를 사용한다면, 요청하는 화면에 필요하지 않은 속성까지도 함께 보내지게 된다. 예를 들어 단순히 사용자의 이름만 보여주면 되는 상황에서 필요 이상으로 사용자가 가지고 있는 다른 속성들까지 항상 데이터 전송에 참여하게 되는 것이다. 이처럼 모든 API 요청과 응답에서 Entity의 모든 속성이 함께 전송되기 때문에 당연히 속도도 느려질 수 밖에 없다.
- 하지만 만약 특정 API에 필요한 데이터를 포함한 DTO를 별도로 만들게되면, 화면에서 요구하는 필요한 데이터들만 선별하여 요청과 응답을 할 수 있는 장점이 있다
3) 순환참조를 예방할 수 있다.
- JPA로 개발할 때, 양방향 참조를 사용했다면 순환참조를 조심해야 한다는 것은 아마 많은 개발자들이 알고 있는 사실일 것이다. 양방향 참조된 Entity를 컨트롤러에서 응답으로 return하게 되면, Entity가 참조하고 있는 객체는 지연 로딩되고, 로딩된 객체는 또 다시 본인이 참조하고 있는 객체를 호출하게 된다. 이렇게 서로 참조하는 객체를 계속 호출하면서 결국 무한 루프에 빠지게 되는 문제를 낳게된다.
- 물론 이 순환참조의 근본적인 원인은 양방향 매핑 자체에 있다고도 할 수 있지만, 양방향 참조가 부득이한 상황이라면 순환참조가 일어나지 않도록 응답의 return으로 DTO로 두는 것이 더 안전하다고 할 수 있다.
4) Validation 코드와 모델링 코드를 분리할 수 있다.
- Entity 클래스는 DB의 테이블과 매칭되는 필드가 속성으로 선언되어 있고, 복잡한 비즈니스 로직이 작성되어있는 곳이다. 그렇기 때문에, 속성에는 @Column, @JoinColumn , @ManyToOne, @OneToOne 등의 모델링을 위한 코드가 추가된다. 여기에 만약 @NotNull, @NotEmpty, @NotBlank 등과 같은 요청에 대한 값의 validation코드가 들어간다면 Entity 클래스는 더 복잡해지고 그만큼 가독성이 저하된다.
- 이때, 각각의 요청에 필요한 validation을 DTO에서 정의한다면, Entity 클래스를 모델링과, 비즈니스 로직에만 집중되도록 만들 수 있다.
Reference
https://tecoble.techcourse.co.kr/post/2020-08-31-dto-vs-entity/
728x90
반응형
LIST
'개발공부 > 개념정리' 카테고리의 다른 글
| [Java Collection] List, Map, Set (0) | 2022.06.29 |
|---|---|
| 프로세스(Process) VS 스레드(Thread) (0) | 2022.06.25 |
| ArrayList VS LinkedList (0) | 2022.06.24 |
| Dispatcher Servlet (0) | 2022.06.23 |
| 트래픽 급증으로 장애가 발생하면 어떻게 대응해야 하나요? [Scale Up vs Scale Out] (0) | 2022.06.22 |