クックパッドにおけるJSON Schemaによる複雑なロジックとバリデーションの重複排除
課題
クックパッドマートは、クックパッド株式会社が注力している新規事業の一つです。主に生鮮食品を取り扱うECプラットフォームであり、都市部の小売店や地域の生産者が販売者としてクックパッドマートに参加しています。ユーザー向けの受け取り場所として、コンビニエンスストア、ドラッグストア、駅、マンションなど様々な場所に専用冷蔵庫が設置されており、ユーザーはアプリから注文し、冷蔵庫から生鮮食品を受け取ることができます。
クックパッドマートでは、販売者が商品を登録したり、日々の出荷業務を行ったりするための管理画面を開発していました。
「商品の種類や状態によって入力する必要のあるデータが異なるが、全ての項目が羅列されたフォームからどの情報を手入力すべきか毎回判断するのは非常に難しい」と、クックパッドマートチームのエンジニア、塩出賢志氏は言います。商品の種類や状態に応じて適切なフォームを振り分ける仕組みが必要でした。
また、フロントエンドでのフォームの振り分けを制御するだけでは、不正なデータの登録を完全に防ぐことはできません。社内の運営メンバーが商品の販売開始前に商品スクリーニングを行いますが、商品スクリーニングの負担やミスを避けるため、バックエンド側でバリデーションを行った上で商品を登録できることが望ましい状況でした。
解決策
チームは、複雑なフォームを生成するためにカスタムコードを使用することを検討しましたが、ブラウザ側とサーバー側で一貫したバリデーションを行うことを懸念していました。共通のスキーマを作成することを検討した結果、JSON Schemaがそのメカニズムとして選ばれました。「複雑なフォームを分離して検証できるメカニズムとして、JSON Schemaを導入することにしました」と塩出氏は述べています。
インパクト
JSON Schemaの導入により、商品登録時の正確性とユーザーエクスペリエンスが向上し、商品スクリーニングの運用負荷が大幅に軽減されました。
JSON Schemaを使用することで、要件変更に伴う負担も軽減されました。「今後、新しい要件が増えた場合でも、JSON Schemaの定義を更新するだけで対応でき、フロントエンド側のフォーム振り分け制御ロジックとバックエンド側のバリデーションを簡単に実行できます」と塩出氏は述べています。
主なインパクトの結果
「以前は、新規登録された商品の約10%に品質保証項目の入力不備がありましたが、JSON Schemaの導入により、品質保証項目の不備はなくなりました」と塩出氏は述べています。
クックパッド株式会社について
クックパッドは、世界中で月間平均1億人が利用するレシピ共有プラットフォームであり、76か国に展開し、34言語に対応し、550万件以上の共有レシピを誇ります。日本最大のレシピ共有サービスです。


テクノロジー企業として、「毎日の料理を楽しくする」ことを目指しています。料理は、人、コミュニティ、そして地球にとって、より幸せで健康的な生活への鍵であると信じています。新鮮で高品質な食材へのアクセスを容易にすることが、より良い料理を可能にし、クックパッドマートが影響を与える部分です。
「おいしいものは、おいしいうちに」というのがクックパッドマートの主な考え方の一つで、生産者と顧客をより直接的に結びつけることを目指しています。新鮮な食材、おすすめ、レシピは、魅力的な提案となります。「サクサクとした弾力のある食感と、とろけるようなミルキーな舌触りが、フレッシュモッツァレラの醍醐味です」とは、ある商品の例です。
小規模生産者からの高品質な食材は、一般的な市場では見つけにくい傾向があるため、ほとんどがセルフサービスでの出品が最も合理的です。クックパッドマートは現在、限られた地域で運営されていますが、顧客が最も新鮮な食材を手に入れることができるようにすることに加え、規模を拡大し、手動レビューと承認を減らす能力が重要です。
開発におけるメリット
「バックエンドとフロントエンドのアプリケーションで同じロジックを使うべきだと考えました。最初は独自のカスタムJSON構造を作成することを考えましたが、たくさんのif
文を書かなければならず、想像したくありませんでした!」
開発者がよく耳にするマントラの1つに、DRY「Don't Repeat Yourself(繰り返しを避ける)」があります。「私たちはJSON Schemaの定義にのみ集中することができ、すべてが自動的に生成され適用されました」と塩出氏は述べ、「それは素晴らしい瞬間でした」と付け加えました。ロジックの重複を減らすことで、クライアント側とサーバー側の期待値の不一致の可能性を減らすことができます。
AIはしばしば多くのif
文に例えられますが、経験豊富なアプリケーション開発者は通常、複雑さを減らし、したがってリスクを減らそうとします。多くの条件ブロックを削除して複雑さを減らすことで、コードレビューが容易になり、継続的なメンテナンス作業にもプラスの影響を与えました。「エンジニアはできるだけ「if」文を減らしたいと思っていると思います」と塩出氏は冗談を言います。
多くの場合、JSON Schemaは非常に単純なものとして使われがちですが、ドキュメントを読もうとする人には多くの力が提供されています。「JSON Schemaの語彙には本当に驚きました」と塩出氏は続け、「型や長さのような単純な式だけでなく、oneOf
やIf-Then-Else
のような複雑な式もあります。」
JSON Schemaの長い歴史を考えると、条件付きバリデーションは新しいものです。サブスキーマを適用する複数のアプローチを理解し、使いこなせるようになると、構成が満足のいく強力なものになるでしょう。「JSON Schemaによって用意された豊富な語彙を見つけたとき、JSON Schemaを使う自信がつきました。本当に素晴らしい!」私たちも同感です、塩出さん!
塩出賢志様(エンジニア)とクックパッド様、この事例を皆様と共有することを許可してくださり、ありがとうございました。
注:この事例の一部は、クックパッドのブログ記事(https://techlife.cookpad.com/entry/mart-json-schema)に元々掲載されています。許可を得て使用しています。