강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

커디널스님의 프로필 이미지
커디널스

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

DTO 관련 질문

해결된 질문

작성

·

31

0

저희 회사에서는 코드를 model이나 dto 코드를 만들때 보통

하나로 전부 request보내고 받고 다하던데

이 강의에서는 용도마다 UserCreateRequest, UserUpdateRequest, UserResponse 이렇게 따로 만들던데 혹시 그 이유가 있을까요?

답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! 이번에도 좋은 질문이시네요~ 🙂

본격적인 답변을 드리기 앞서 모든 것은 trade-off (장점과 단점이 공존) 이며 상황에 맞는 적절한 방법을 쓰는 것이 중요하다는 말씀드립니다.

 

DTO를 용도에 따라 다르게 만드는 이유는 유지보수를 보다 잘 하기 위해서 입니다.

예를 들어 데이터를 생성하는 요청이나, 데이터를 변경하는 요청이 지금 당장은 매우 비슷해 보여서 중복된 코드를 제거하는 것이 중요해 보일지 몰라도, 시간이 지나며 데이터를 생성할 때 필요한 데이터와 데이터를 변경할 때 필요한 데이터가 조금씩 달라지게 되면 결국 의미를 알 수 없는 객체가 되어버리는 경우가 많거든요!

예를 들어 최초에 유저 생성, 수정에 이름만이 필요했다고 해보죠. 그러면 두 경우 모두 이름만 있으면 되니까..

public class UserRequest(
  private final String name;
)

처럼 만들고 싶을 수 있습니다. 자 그런데 시간이 지나며 생성 과정에서는 "이메일"도 받는다고 해봅시다. 그러면 데이터 수정할 때는 이메일이 없으니 nullable email이 생깁니다.

public class UserRequest(
  private final String email; // 없어도 된다
  private final String name; // 있어야 한다.
)

이렇게 필드가 하나 둘 생기다가 5개, 10개, 15개를 넘어가면

public class UserRequest(
  private final String f1; // ?
  private final String f2; // ?
  private final String f3; // ?
  private final String f4; // ?
  private final String email; // ?
  private final String name; // 있어야 한다.
)

이 필드들은 도대체 언제 쓰이는건지, 언제 값이 있고 언제 값이 없는건지, 반드시 필요한 경우는 언제이고 선택적으로 쓰이는 경우는 언제인지, 어떤 역할을 하는건지 파악하기가 점점 어려워집니다.

때문에 이럴거면 처음부터 다른 사용처에 대한 DTO를 분리해서 명확하게 그 객체를 표현하는 것이 유지보수를 하는데 좋은 경우가 많습니다. 🙂

 

또한 이렇게 각 상황에 따라 DTO를 나누는 것 외에도 DTO, Model, Entity 등 객체의 계층에 따라 class를 나누는 것도 중요한데요, 이는

https://youtu.be/OV8e88kIU-U?si=fdnSUHSJY_RDYCJw

를 한 번 봐주시면 감사드리겠습니다.

감사합니다. 🙇

0

안녕하세요, 인프런 AI 인턴입니다. 커디널스님,

질문 주신 내용 관련해서, DTO를 분리해서 사용하는 이유는 여러 가지가 있습니다. 각 계층의 역할과 책임이 명확해지기 때문입니다.

  1. 명확한 역할 분리: UserCreateRequest, UserUpdateRequest, UserResponse와 같이 각각의 용도에 맞게 DTO를 분리함으로써, 각 요청과 응답의 목적과 요구사항을 명확하게 나타낼 수 있습니다. 이렇게 하면 코드의 가독성이 향상되고, 실수를 줄일 수 있습니다.

  2. 유지보수성 향상: 시간이 지남에 따라 요청이나 응답에 대한 요구사항이 변경될 수 있습니다. 각 용도에 따라 DTO를 분리해 놓으면 특정 부분만 수정하면 되므로 유지보수가 용이합니다. 예를 들어, 생성 시에만 필요한 필드가 있을 경우, 이를 전담하는 CreateDTO에만 반영하면 됩니다.

  3. 보안 및 데이터 효율성: 모든 요청과 응답에 동일한 DTO를 사용하면 불필요한 데이터가 전송되거나 노출될 위험이 있습니다. 따라서, 필요한 데이터만 포함된 DTO를 사용하는 것이 데이터 효율성과 보안 측면에서도 유리합니다.

  4. 변경의 유연성: 각 기능마다 DTO를 독립적으로 구성하면, 특정 기능의 변경이 다른 기능에 영향을 주지 않습니다. 이는 시스템을 더 유연하고 안정적으로 만듭니다.

아래 링크에서 유사한 주제를 논의한 포스트를 확인하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

커디널스님의 프로필 이미지
커디널스

작성한 질문수

질문하기