## DTO 란?
DTO(Data Transfer object)는 계층간 데이터 교환 역할을 하는 객체로 MVC 흐름 속에서 데이터가 교환될 수 있도록 하는 객체이다.
로직을 가지지 않는 순수한 객체로 getter/setter 메서드만을 가진다.
우선, MVC 흐름에서 데이터 교환을 담당하는 DTO가 없을 때를 가정하고 다음의 예시를 살펴보자!
package racingcargame.car;
public class Car {
private String name;
private int position;
public Car(final String name, final int position) {
this.name = name;
this.position = position;
}
...
}
위 예시는 자동차 경주게임의 Car Model객체이다.
만약 view에서 여러개의 Car 객체 name과 position 정보를 출력하고자 한다면 어떤 방법이 있을까?🤔🤔
List를 통해 name과 position 정보를 각각 가져온다.
Map을 통해 key, value 값으로 name과 position을 가져온다.
Car 객체를 가져온다.
위와 같은 방법이 있을 것이다. 그런데 위 세가지 방법은 모두 문제를 가진다.(특히 3번)
우선, 1번 방법은 나빠 보이지 않지만 만약 Car 객체가 가지고 있는 전역변수가 30개라고 생각해보면 금방 답이 나온다.
1번 방법을 사용 하려면 view에 정보를 전달하기 위해 30개의 전역 변수를 전달하는 getter을 Car 객체에 만들어야 할 것이다. 이때, 30개의 getter로 인해 Car 내부에 비지니스 로직들의 가독성이 심각하게 떨어질 것이다.
2번 방법도 같은 이유로 문제를 가진다.
그렇다면 3번 방법은 어떨까? 3번 방법 또한 가독성 문제를 발생시키는데 그것보다도 더 큰 문제를 가진다.
입출력만을 담당하는 View에게 Model의 비지니스 로직을 노출시킨다.
View에서 Model의 상태를 변화시키는 예상치 못한 오류가 발생 할 수 있다.
Car 객체를 View에 그대로 전달하면 위와 같은 심각한 문제를 발생 시킬 수 있다.
package racingcargame.car;
public class CarDto {
private String name;
private int position;
public CarDto(final String name, final int position) {
this.name = name;
this.position = position;
}
public String getName() {
return name;
}
public int getPosition() {
return position;
}
...
}
위 사진은 Car 객체의 상태 정보를 가져오는 CarDto 객체이다.
기본적으로, DTO는 getter/setter만을 메서드로 가지기 때문에 Car 객체에서 그대로 getter/setter를 구현하여 비지니스 로직 가독성을 떨어트리는 문제를 방지한다.
또한, DTO는 Model의 상태 만을 가져오기 때문에, View에게 Model의 내부 로직을 노출 시키지 않고 접근 또한 불가하게 만든다.
우아한테크코스 1주차 자동차 경주 미션을 진행하면서, DTO를 처음 접해보았다.
미션 구현을 위해 DTO를 사용하면서 DTO가 Model의 가독성을 향상 시키고 View에 Model이 결합되는 문제 또한 해결 할 수 있음을 몸으로 느꼈다🙂🙂.
다음 미션부터는 DTO를 적극적으로 활용해 볼 생각이다!