조종 다음은 개발
article thumbnail
Published 2023. 11. 12. 15:57
DTO 를 사용하는 이유 개발 스토리

🎯 DTO 란??

DTO는 Data Transfer Object의 약자이다.

DTO는 계층 간 데이터를 전달하기 위한 단순한 객체를 말한다.

계층 간 데이터를 전달하는 객체?? 이게 무슨말일까?

MVC 패턴으로 애플리케이션을 개발을 하면 컨트롤러는 중계자 역할로 뷰와 모델로부터 데이터를 주고받는다.

이때 데이터를 주고받을 때 도메인 객체로 주고받는 것이 아닌 DTO를 가지고 주고 받는 것이다.

🧐 DTO 를 왜 굳이 사용할까??

왜 도메인 객체를 사용하지 않고 DTO라는 별도의 객체를 만들어서 주고받을까?

민감한 데이터 보호

우선, 민감한 도메인 기능이 노출될 수 있기 때문이다.

public User {
    private String name;
    private String password;
    private String address;
    ...

    private void logit() {
        // 비즈니스 로직
        ...
    } 
}

위와 같이 유저 도메인이 있다고 해보자.


만약 유저가 Q & A 게시판에 글을 작성할 때 유저의 비밀번호나 주소 정보가 필요할까?

그렇지 않을 것이다. 단순히 어떤 유저가 작성했는지 알기 위해 이름만 필요할 것이다.

 

그런데 유저 도메인을 그대로 넘겨주게 되면 해당 도메인 객체 안에 유저의 민감한 데이터 정보가 같이 들어있기 때문에 데이터가 노출될 위험이 있는 것이다.

 

그렇기 때문에 DTO라는 별도의 객체를 만들어서 뷰에서 필요한 정보들만 보내주는 것이다.

public UserDto {
    private String name;
    ...
}

 

뷰와 모델 사이의 의존성을 줄이기 위해

 

두 번째 이유는 뷰와 모델 사이의 의존성을 줄이기 위해서이다.

나는 처음에 이러한 이유가 이해가 안 되었다.

"어차피 도메인 객체에서 getter를 사용해서 출력하는거랑 DTO 객체를 만들어서 getter 를 사용하는 것의 어떤 차이점이 있지??
도메인 객체에서 getter 를 사용해서 출력하면 의존성이 있다고 보는 건가??"

디스코드에 올린 질문글

그래서 우테코 프리코스 디스코드 채널에서 해당 내용을 나누어서 다른 동료들로부터 자문을 구해보았다.

 

Zangsu 님의 정성스러운 답변ㅠㅠ

그리고 Zangsu 님께서 예시까지 들어주시면서 정말 자세히 설명해 주셨다.

 

정리해서 얘기해 보면 인스턴스 변수가 없어지거나 타입이 변경하는 등의 변화가 생기게 된다면

필연적으로 뷰에서 호출되는 getter의 사용도 수정이 발생한다.

모델의 변화로 인해 뷰도 수정해야 하는 일이 발생한다.

즉, 모델과 뷰 사이의 의존성이 있다는 것이다.

 

그렇기 때문에 만약 둘 사이의 DTO 객체로 이어져있다면 DTO 객체에서 로직이 수정해주는 걸로 변화에 대응할 수 있다.

이러한 이유로 DTO를 사용하는 것으로 뷰와 모델 사이의 의존성을 느슨하게 해 줄 수 있다.

🥊 DTO의 특징

DTO는 getter / setter 외의 로직을 가지지 않는다.

왜냐하면 오직 DTO 는 값을 전달하기 위한 용도의 객체이기 때문이다.

 

setter를 사용하지 않을 수도 있다.

이때 DTO는 불변성을 보장해 주기 때문에 더 안정적이다고 볼 수 있다.

 

profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!