작성
·
219
·
수정됨
0
CQS 패턴에 대해 질문이 있습니다.
커맨드(상태 변경)와 쿼리(조회)를 분리하는 패턴이라는 건 알겠습니다.
커맨드는 상태 변경에 대한 책임이 있고 조회에 대한 결과 반환의 책임이 있지 않다. 따라서 반환값을 반환하지 않는다.
쿼리는 조회에 대한 결과 반환의 책임이 있어서 조회 결과를 반환값으로 반환한다.
이 정도로 이해했습니다.
문제는 api인데, api도 커맨드 api, 쿼리 api 이런식으로 분리 하나요?
/api/v2/members/{id} 경로의 updateMemberV2 라우트 핸들러는 상태를 변경하는 api니까 Member의 상태만 변경하고 response는 성공, 실패에 대한 HTTP 상태 응답값만 반환하나요?
조회에 대한 api는 조회 결과를 response dto로 내려주는 데에 이상하게 생각하지는 않습니다.
그런데 삭제, 등록, 업데이트 등의 커맨드 api..?는 보통 그냥 api 결과로 HTTP status code만 반환해주는 지가 궁금하네요. 지금도 삭제 api는 그냥 204 응답 코드로 반환해주도록 개발해왔었는데 이게 CQS 패턴인지 궁금하네요.
지금까지 별 생각없이 업데이트 api도 엔티티에 대한 업데이트를 수행하고 업데이트 된 Entity를 가지고 dto를 만들어서 http response를 내려주었는데
CQS 패턴을 생각하면 이런 api는 성공 실패만 반환하는게 맞는건가 싶어서요
답변 3
0
그러니까 API 설계에서도 CQS 패턴에 부합하려면 등록, 수정, 업데이트에 대한 API 결과를 HTTP status만 반환하는 것이 맞는거죠?
이러면 궁금한게 또 있는데,
등록 API의 경우에는 201 상태코드만 반환해서는 클라이언트에서 등록된 리소스의 아이디라도 알아야 추가적인 api 요청을 날릴 수 있을 것 같은데, 그러면 201 상태코드랑 등록된 리소스의 id로 응답으로 내려줘야하지 않나요?
업데이트나, 삭제 api에는, 200 이랑 204 상태코드만 응답으로 내려준다고 하더라도 등록은 id는 반환해야 할 것 같아서요.
0
안녕하세요, 인프런 AI 인턴입니다. 정민교님의 질문에 대해 CQS(Command Query Separation) 패턴과 API 설계에 대해 관련된 예시와 설명을 드릴 수 있을 것 같습니다.
CQS 패턴이란, 명령(Command)과 질의(Query)를 분리하는 패턴입니다. 명령은 상태 변경을, 질의는 정보 요청을 처리하며, 각각 다른 목적을 가집니다. 이렇게 분리하는 이유는 명확한 책임 분리를 통해 코드의 이해와 유지보수를 용이하게 하기 위함입니다.
API 설계에 있어서도 CQS 원칙을 적용할 수 있습니다. 즉, 커맨드 API는 상태를 변경하는 작업에 초점을 맞추고, 이에 대한 결과로 주로 HTTP 상태 코드를 반환합니다. 반면, 쿼리 API는 정보를 조회하는 데 초점을 맞추며, 조회된 데이터를 반환합니다.
“커맨드에서 결과값을 반환하면 안되는 이유는 무엇인가요?“에 대한 질문에 관해, 결과값을 반환하지 않는 것이 아니라 상태 변경 작업의 성공 여부를 나타내는 HTTP 상태 코드를 반환하는 것입니다. 커맨드 작업 후 조회가 필요한 경우 별도의 쿼리 API를 통해 조회하는 것이 CQS 원칙에 부합합니다.
관련 질문으로, CQS에 대한 다른 학습자의 질문과 이에 대한 자세한 답변을 확인해보시기 바랍니다. 이 답변에서는 CQS 패턴의 정의와 실제 적용 사례에 대한 설명이 포함되어 있습니다.
API에서 CQS 패턴을 적용하는 경우, 실제로 삭제, 등록, 업데이트 등의 커맨드는 해당 작업의 성공 또는 실패를 나타내는 HTTP 상태 코드를 반환하는 것이 일반적입니다. 예를 들어, 삭제 작업 성공 시 204 No Content
상태 코드를 반환합니다. 이는 실제 작업이 성공적으로 수행되었으나, 클라이언트에 제공할 별도의 내용이 없음을 의미합니다.
업데이트 API에서 상태 변경 후 업데이트된 엔티티의 정보를 반환하는 것은 작업의 결과를 보여주는 것이기 때문에 자체적으로 CQS 패턴에 반하는 것은 아닙니다. 하지만 작업의 결과를 보여주는 것이 아닌, 상태 변경의 성공 여부만을 나타내려 한다면 HTTP 상태 코드만 반환하는 것이 CQS 원칙에 더 부합할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.