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

요니님의 프로필 이미지
요니

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (2)

생성과 수정 API 응답, 그리고 그 응답 Dto를 어떻게 구성할 것인가에 대한고민

작성

·

776

·

수정됨

0

안녕하십니까 강사님.

저는 이제 5개월차가 된 신입? 백엔드 개발자 입니다.
다름이 아니라 ,
생성과 수정 API에 대한 응답으로
어떤 정보까지 넘기는것이 적합할지
에 대해 고민을 하던 도중
강사님의 생각을 여쭤보고 싶어 질문을 드리게 되었습니다. 

Q1. 강사님 께서는
생성, 조회 , 수정, 삭제 API의 응답을 각각 어떻게 보내시는지 여쭤보고 싶습니다.

 

가장 먼저 조회의 경우는 

말 그대로 path의 Entity 및 관련된 Entity 정보를 조합하여 응답 DTO로 변환하여 보내고 있습니다.

 

그런데 나머지 Write Operation에 대한 응답을 어디까지 보내야 하냐가 이슈 입니다.

예를들면 엔티티의 생성의 경우 

엔티티의 응답 DTO를 보내면 - 프론트에서 별도의 조회 API 호출 없이 바로 프론트가 화면에 뿌려줄 수 있으니깐 

저는 생성의 경우에도 조회와 마찬가지로 Entity의 정보를 조합하여 응답 DTO로 변환하여 보내고 있었습니다.

 

그런데 이러한 부분이 Command Query Sperate 원칙에 어긋나는것 같아, 

강사님께서는 혹시 생성한 Entity의 Key만 보내시는지, 

아니면 Entity의 정보를 DTO로 변환하여 보내시는지 궁금합니다.

 

만약 정보를 다 보내신다면 이후에 별도로 조회API를 호출해야 하고 그 또한 비용일텐데 

이러한 부분은 어떻게 하시는지 여쭤보고 싶습니다.

 

이제 수정 API인데요,
제가 다룬 비즈니스 로직의 경우 

수정 비즈니스 로직이 다양하고 ,

 각 비즈니스 로직의 경우 다뤄지는 Entity의 종류가 다른 경우였습니다.
(중심 Entity는 동일하지만, 연관된 Entity를 누구까지 건드리냐의 차이)

 

그래서 응답으로 보내기 모호한 점이 첫 번째 이유이고,

애초에 수정 후에 프론트 화면에서 그 엔티티의 정보를 보여줄 필요가 없어서 

라는 두번째 이유에 의해서 에초에 엔티티의 Id값도 보내지 않고 있었는데요,

이 수정 API의 응답을 성렬님은 어떻게 진행하지는지 그 이유가 궁금합니다. 

 

마지막으로 삭제의 경우는 정말,
프론트에게 보낼 응답이 없어도 되는 경우 라고 생각했는데요,

팀장님의 의견은 만약에 나중에 삭제한 Entity를 복구하는 요구사항이 추가되는것을 고려하여

Id 정도는 넘기자는 의견을 내어주셨습니다.

마찬가지로 삭제의 경우도 어떤식으로 수행하시는지 그 이유가 궁금합니다.

 


 

Q2. 마지막으로 Entity의 ResponseDto의 필드를 어떤식으로 구성하시는지 궁금합니다

 

예를들면 저의 경우는 API는 프론트와 서버 간의 스펙이라고 생각하고, 

Entity의 단건조회의 경우는 단건 조회용 ResponseDto를, 

전체조회의 경우는 전체 조회용 SummaryResponseDto를 별도로 만들어서 사용하고 있었습니다.
(이런식으로 각 상황별 ResponseDto를 별도로 정의하고,
그 안에 관련된 Entity들의 필드를 직접 풀어넣는 방법)

 

저희 팀장님 께서는 프론트쪽도 일을 해오시다가 , 

백엔드쪽 분야로 전향하신 케이스 인데요,

그렇다 보니 어떻게 해야 프론트의 생산성이 올라가는지를 고려하시는 분 이셨고,

팀장님의 생각은 서버에서 넘겨주는 응답에 일관성이 있어야 

그 응답을 사용하는 프론트 측도 학습이 되고 놓치는 부분 없이 생산성이 올라간다는 의견이셨습니다.

 

그래서 Entity별로 당장 사용하지 않더라도 가능한 모든 필드를 담은 ResponseDto를 하나만 만들고,

해당 ResponseEntity의 조합으로 각 API별 응답 Dto를 만들어서 사용하면 ,

프론트 측 에서는 일관성 있는 응답값을 사용할 수 있다는 의견이셨습니다.

물론 이 방법이 네트워크 패킷의 양을 쓸데없이 증가시킨다는 것을 알고 계시면서도,

생산성에 큰 영향을 미치는 부분이라고 생각하셨습니다.

 

예를들어 다음과  같이 각 Entity의 응답 Dto의 조합별로 API의 ResponseDto를 만들 수 있습니다.

ResponseDto{

 

UserDto{

id : 1,

name : “aaa”

… // User엔티티의 거의 모든 필드

}

 

ItemDto{

 

id : 2,

name : “bbb”,

… // Item엔티티의 거의 모든 필드

}

}

 

 

 

저는 이러한 부분에 대해 생각해 본 적이 없이,

그냥 제가 “해당 API를 호출하는 화면에서 필요한 정보들만을 담아
|(혹은 여러 화면에서 쓰인다면 여러개를 고려) ResponseDto를 각각 만들어서” 넘겼는데요

 

강사님께서는 이러한 ResponseDto를 구성하는 부분에 있어서

상황별로 필드를 재구성 하여 ResponseDto를 정의하여 사용하시는 편 인지

아니면 생산성을 고려하여 각 Entity별 Dto를 만들고, 이들을 조합하여 ReponseDto를 정의하시는 편 이신지 

혹은 다른 규칙이 있으신지 궁금합니다. 

 

물론 그렇다고 ,
팀장님의 의견에서 

전체조회시 사용하는 DTO와 단건조회시 사용하는 DTO가 동일하더라도,

전체조회 후 단건조회를 기존 Front가 가지고 있는 값을 그대로 쓰지 말고.,
단건 조회용 API를 다시 호출하자 입니다!
그저 핵심은 프론트가 다루는 ResponseDto의 일관성을 위해서 입니다 (결론은 생산성을 위해) 

 


 

항상 좋은 강의,

그리고 무엇보다도
강상님의 의견과 고민을 강의에 녹여주셔서

정말 감사할 따름입니다.

 

덕분에 함께 고민하고 많이 배우는거 같습니다.

 

긴 글 읽어주셔서 감사합니다!


답변 2

1

안녕하세요 khd1692님, 강사님께서는 생성, 조회, 수정, 삭제 API의 응답을 어떻게 보내시는지에 대해 궁금하신 것 같습니다.

Q1. 생성, 조회, 수정, 삭제 API의 응답에 대해서 궁금하신 부분에 대해 제 의견을 드리자면, 일반적으로 생성 API에서는 새로 생성된 엔티티의 정보를 응답으로 보내기보다는 생성된 엔티티의 ID만 보내는 것이 일반적입니다. 이후에 프론트엔드에서 필요한 경우 별도의 조회 API를 호출하여 엔티티의 정보를 받아와서 사용하는 방식을 선호합니다. 조회, 수정, 삭제 API의 경우에도 엔티티의 정보를 응답으로 보내는 것이 아니라 간결하고 필요한 정보만을 포함한 DTO를 사용하는 것이 일반적입니다. 이렇게 하면 필요한 정보만 전달되고, 네트워크 트래픽과 불필요한 비용을 절약할 수 있습니다.

Q2. 엔티티의 Response DTO의 필드 구성에 대해서 궁금하신 부분에 대해 제 의견을 드리자면, 응답 DTO의 구성은 상황에 따라 다를 수 있습니다. 전체 조회의 경우에는 요약 정보로 구성된 응답 DTO를 사용하는 것이 일반적이고, 단건 조회의 경우에는 엔티티의 필드를 모두 담은 상세한 응답 DTO를 사용하는 것이 일반적입니다. 이렇게 응답 DTO를 상황에 맞게 구성하는 방식을 통해 프론트엔드에서 필요한 정보를 명확하게 전달하고 일관성을 유지할 수 있습니다.

이러한 접근 방식은 일반적인 원칙이지만, 프로젝트의 특성과 요구사항에 따라 다르게 적용될 수 있습니다. 따라서 팀 내의 의견 조율을 통해 가장 적합한 방식을 결정하는 것이 중요합니다. 생산성과 효율성을 고려하면서 일관성을 유지할 수 있도록 응답 DTO를 구성하는 것이 좋습니다. 강의에 대한 고민과 질문을 주셔서 감사합니다. 함께 고민하고 배워가는 경험이 많이 되는 것 같아 기쁩니다!

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, khd1692 님! :)

API 설계 시 응답에 관련한 질문을 주셨네요.

 

Q1. 강사님 께서는
생성, 조회 , 수정, 삭제 API의 응답을 각각 어떻게 보내시는지 여쭤보고 싶습니다.

이런 문제에 보통 정답은 없는데요. ㅎㅎ
정답이 없다는 말은 상황에 따라 결정해야 한다는 의미이기도 합니다.

저는 정해놓은 규칙은 없고, 클라이언트의 요구사항에 따라 조율해서 결정하는 편입니다.
말씀하신대로 클라이언트에서 저장한 값을 바로 사용자에게 노출해야 하는 경우에 고민을 할 수 있을 것 같고요.
응답을 구성하기 위해 성격이 다른 여러 데이터를 조회하여 응답을 구성해야 한다면, 간단히 key 정도만 응답하기도 합니다. (클라이언트에서 사용하지 않는데 굳이 응답을 구성하는 수고를 들이지는 않아요.)

 

Q2. 마지막으로 Entity의 ResponseDto의 필드를 어떤식으로 구성하시는지 궁금합니다

엔티티도 기본적으로 위와 같은 기조로 접근하는데요.
조금 더 나아가자면, 클라이언트 입장에서는 엔티티의 모든 필드를 알아야 할 필요가 없습니다.
오히려 서버 내부적으로 관리하는 값이거나, 혼선을 줄이기 위해 굳이 노출할 필요가 없는 데이터도 존재할 수 있습니다.
그래서 보통은 API의 요구사항에 핏한 응답을 각각 만들고 있는데요.
다만, 같은 도메인 요구사항 내에서 조금씩 다른 조회를 하여 필요한 응답이 비슷한 경우는, 때에 따라 판단하여 동일한 응답 객체를 사용하기도 합니다. (엔티티의 모든 필드를 담는다는 뜻은 아닙니다.)

도움이 되셨기를 바랍니다.
감사합니다. :)

요니님의 프로필 이미지
요니

작성한 질문수

질문하기