🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

848閲覧

API設計とCQRS

ccccuuurrryyy

総合スコア2

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/01/03 02:17

CQRSという考え方があります。クエリとコマンドを分離するという考え方です。
APIの中でもDBにデータを格納する際にPOSTを利用してデータの格納かつ、そのレスポンスをフロント側へ返すというケースをよくみるのですが、これはCQRSの考え方に反しているのでしょうか?
具体的に言えば、あるIDをDBへ格納し、格納したIDをフロント側へ返すAPIがあります。
格納したIDを後ほど利用したいのでこのようにしています。
本来であれば、IDを格納するAPIと格納したIDを取得するAPIは別にするべきなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まったく同じ質問があります。

In CQRS, how do you generate a correct autonumbered ID? - stackoverflow

個人的にはAlexander Langersさんの回答に同意します。
インフラストラクチャ要件がフロントの設計に影響を与えるのは、保守性や変更容易性の観点から言えば好ましくありません。

投稿2021/01/03 04:32

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ccccuuurrryyy

2021/01/10 15:00

引用までしていただきありがとうございます。 "インフラストラクチャ要件がフロントの設計に影響を与える"についてもう少し具体的に教えたいただけないでしょうか?
gentaro

2021/01/10 17:21

「データベースによって採番されるID」というのは、ドメインモデリング上は登場しないはずです。 ましてや、そのIDがフロント側で必要になるケースというのは、フロント側ががっつりインフラストラクチャであるDBに依存した形になってしまいます。 例えばですが、データベース上のIDを当初32bit整数型で定義してた場合、レコードの増加に従って64bit整数型に変更したくなるケースを考えてみてください。 本来この修正はインフラストラクチャ層であるデータベースと、そこと直接やりとりするアプリケーション側のコードの修正だけで済ませられるはずが、フロント側にまで「DBのID」を露出させてしまうと、フロントも影響範囲に含まれて修正する必要が出てきます。 このように無駄に影響範囲を広げるのは好ましくない、ということです。
ccccuuurrryyy

2021/01/11 07:23

ご説明いただきありがとうございます。 IDがデータベースによって採番されるのではなくアプリケーション側でランダムに生成しているものの場合は別にするべきなのでしょうか?
gentaro

2021/01/11 09:14 編集

コマンド実行後にそのエンティティのIDが必要なのであれば、IDをGUID型にしてコマンド発行側がIDを新規に生成し、一緒に渡せば良いんじゃないでしょうか。 コマンドそのものが値を返すのは、エンティティの作成とIDの取得という2つの責務を負わせてしまっているため、どうかと思います。 IDが内部情報ではなく、エンティティの属性の一部という扱いをしたいのであれば、エンティティの他の情報と同じく、コマンド発行側が指定して一緒に渡すのが自然だと思います。 かといって、他に必要に応じてIDを取得するという単体の需要があるならともかく、今回のように単一の処理単位であるべきのものを2つに分割するのが良いようにも思えません。
guest

0

格納したIDを後ほど利用したいのでこのようにしています。

IDをデータベース側で自動で振るようにしている場合、挿入結果のIDはデータを挿入した直後に取るのがいちばん確実なので、無理に別にわけないほうがいいです。

投稿2021/01/03 03:45

maisumakun

総合スコア145971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ccccuuurrryyy

2021/01/10 15:01

ID自体はアプリケーション側でランダムに生成しているものになります。ランダムに生成したものをDBに格納している形です。 この場合も同様でしょうか?
maisumakun

2021/01/10 22:29

> ID自体はアプリケーション側でランダムに生成しているものになります。 そうだったのですね…失礼しました。
ccccuuurrryyy

2021/01/11 07:22

この場合は分けた方がいいということになるのでしょうか?
maisumakun

2021/01/11 07:32

すみません、その場合についてはコメントできないです。
ccccuuurrryyy

2021/01/11 07:46

承知しました、コメントありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問