web-dev-qa-db-ja.com

Webサーバーのアーキテクチャ

これは奇妙な質問のように思えるかもしれませんが、「適切な」答えを見つけることがまだできていません。グーグルで試しましたが、何も役に立ちません(たぶん、間違った用語を探しています)。

私はWeb APIを構築しているいくつかのクラスに参加しています。1つはSpring Bootを使用し、もう1つはNodeJS(Expressを使用)を使用しています。「サービスレイヤー」や「データ層」が、私はまだどの責任が誰に属すべきかを完全に理解していません。

たとえば、SpringプロジェクトでPOSTリクエストを受け取り、ハンドラーがDTOを受け取った後、次の手順を実行する必要があります。

  • DTOをモデルオブジェクトに変換する
  • ビジネスルールに従ってモデルを検証する
    • 検証が失敗した場合に例外をスローし、エラー応答を返します
  • モデルをデータベースに保存します
  • OK応答を返す

私は各ステップがどの「論理」レイヤーに属しているか(まだレイヤーを完全に理解していないため)、特にエラーを処理する人と方法を理解するのに苦労しています。たとえば、ビジネスルールが原因で検証が失敗した場合、スローする例外はHTTPについて知らないはずですが、それをキャッチして適切なHTTPエラーにマッピングするのは誰の仕事ですか?

助けてくれてありがとう。

1

データレイヤーは永続化されたデータを処理します。永続化レイヤーと呼ばれることもあります。したがって、データベースからの読み取り、モデルのデータベースへの保存などが含まれます。したがって、すべてのデータベースアクセスはデータレイヤーを介して行われます。サービス層は、データ層を使用して、データベースに格納されているデータにアクセスして変更します。

サービスレイヤーと両方のデータレイヤーで検証を処理できますが、通常、検証はサービスレイヤーで行われます。これは、ほとんどのエンティティ/モデルの検証ロジックが、データベースやファイルなどのさまざまな永続化メソッドで同じであるためです。複雑な検証の場合、サービス層は個別のValidatorクラスで検証を呼び出すことができます。

特定のステータスコードで応答したい場合は、@ResponseStatus例外への注釈。リクエストに応答する予定のステータスコードを含み、キャッチされなかった例外をフレームワークが伝播してhttp応答に変換できるようにします。

@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public class YourException extends RuntimeException {

ネイティブのキャッチされない例外がスローされると、フレームワークにそれらを処理させることができます。その結果、ステータス500の応答が返されます。

だからあなたのステップのために私はこのようにそれらを実装します:

  • サービス層:DTOをモデルオブジェクトに変換する
  • サービス層:ビジネスルールに従ってモデルを検証します
  • サービス層:検証が失敗した場合に例外をスローし、エラー応答を返します(フレームワークにエラー応答部分を処理させます)
  • データレイヤー:モデルをデータベースに保存します
  • サービス層:OK応答を返します(voidを返して、フレームワークに成功応答を処理させます)
3
Nomad

一般に、使用するフレームワークによって直接実行されるため、特定のマッピングを行う必要はありません。

たとえば、ASP.NET MVCでは、検証ルールを指定し、フレームワークに残りの処理を行わせます。つまり、入力が有効かどうかを確認し、有効でない場合は、適切なMIMEで適切なHTTP応答を返します。タイプと適切なHTTPステータスコード。

同様に、サーバーで予期しない状況が発生した場合、たとえばファイルを保存しようとしたが、RAIDコントローラーでエラーが発生し、すべてのディスクを読み取り専用モードに切り替えたために例外が発生した場合は、例外を呼び出し元にHTTP 500を返すフレームワーク。

これには、例外を自分で処理するよりも利点があります。ロギングやカスタムエラーページなどの動作を簡単に追加できます。

2