17
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WebAPI設計 〜スネークケースにするか、キャメルケースにするか〜

Last updated at Posted at 2020-09-06

まとめ

WebAPI はユーザが使いやすいように設計するため、基本的にキャメルケースを採用する。

DBはスネークケースだからWebAPIもスネークケースでいい?

ここでは、スネークケースを採用したDBを例に考えてみます。
以下は、製品カテゴリ (product_categoreis) と 製品 (products) を表すER図です。
image.png

もし単純なREST APIを採用する場合、URLは下記のようになります。

GET /products : 一覧取得
GET /products/1 : 指定取得
POST /products : 新規作成
PATCH /products/1 : 更新(一部更新)
PUT /products/1 : 更新(上書き)
DELETE /products/1 : 削除

ここではGET /products/1を検証していきます。
その際、GETレスポンスはどうなるでしょうか?

DB構造をそのままレスポンスにした場合、下記のようになります。

DB構造をそのまま採用したときのGETレスポンス
{
  "id": 1,
  "name": "真っ白Tシャツ",
  "product_category": {
    "id": 3,
    "name": "トップス"
  }
}

どうでしょうか? 一見、シンプルで良い印象です。
それでは、検証してみたいと思います。

影響

影響を考える場合、どの観点から考えるかが重要になります。

観点: このAPIは誰が使うか?

"このAPIは誰が使うか?" は設計する上で重要なので、最初に定義しておいたほうが良いでしょう。
例えば、社内の開発者が使うか、一般ユーザが使うかで考慮する範囲が変わってきます。

社内の開発であれば、開発のしやすさなどが優先度として高くなりますが、
一般ユーザー(外部)の場合、加えてWebAPIを広く使ってもらうための視点も必要になります。

命名規則: スネークケース vs キャメルケース

WebAPIを使うフロントエンド言語の命名規則はキャメルケースが一般的です。(JavaScript、TypeScript、Swift、Kotlin 等)
しかし、WebAPIがスネークケースで提供されていると、命名規則が壊されてしまいます。

JavaScriptにスネークケースが持ち込まれる
fetch('http://example.com/products/1')
  .then(response => response.json())
  .then(data => {
    console.log(data.id);
    console.log(data.name);

    // JavaScript にスネークケースが持ち込まれる
    console.log(data.product_category.name);
  });

なので理想で言えば、WebAPIもキャメルケースにしたほうがフロントエンドは開発しやすいです。
一般ユーザーを考慮するのであれば、キャメルケースを採用しましょう。

しかし、社内開発においては、バックエンドの開発言語の特性から、フロントエンドでスネークケースとキャメルケースの変換が必要になるかもしれません。

もし、フロントエンドで変換する必要が出てきた場合、TypeScriptを使用していればスネークケースをコンストラクタに閉じ込められそうです。

TypeScriptでのコンストラクタでの変換
class ProductCategory {
  id: number;
  name: string;

  constructor(id: number, name: string) {
    this.id = id;
    this.name = name;
  }
}

class Product {
  id: number;
  name: string;
  productCategory: ProductCategory;

  constructor(response: ApiResponse) {
    this.id = response.id;
    this.name = response.name;

    // コンストラクタで変換してしまえば...
    this.productCategory = new ProductCategory(
      response.product_category.id,
      response.product_category.name
    );
  }
}

const product = new Product(res);
console.log(product.productCategory.name);  // 使用するときはキャメルケース

さいごに

WebAPIのベストプラクティスはありますが、その全てを思考停止で採用するとオーバースペックになりますね。
なので、自分のいる組織の特性や、WebAPIの将来的な公開範囲も考慮して設計していきたいと思います。

17
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?