13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サーバー描画?ブラウザ描画? 管理画面で「AIに任せたらJSだらけになった話」と、今回選んだ方針

13
Posted at

初めに

不動産検索サイトを作成中、
Spring Boot + Thymeleaf で都道府県や路線情報の選択肢表示する機能を作っている中で、
AI(Codex)に実装を任せた結果、想定より JS が増えすぎて混乱したという経験をしました。

後から冷静に見直すと、
• なぜ AI はブラウザ描画(JS主体)を選んだのか
• 自分の想定していた「サーバー描画」と何が違ったのか
• 結局どちらがいいのか

が整理できたので、学習メモとして投稿させていただきます。

そもそも「サーバー描画」と「ブラウザ描画」って何?

サーバー描画(SSR)

HTMLをサーバー側で完成させてからブラウザに返す方式。

例(Spring + Thymeleaf):
1. ブラウザがURLにアクセス
2. サーバーがDB/APIから都道府県一覧を取得
3. サーバーが を含むHTMLを生成
4. 完成したHTMLをブラウザに返す
5. ブラウザは「表示するだけ」

<select>
  <option value="13">東京都</option>
  <option value="27">大阪府</option>
</select>

ポイント
• 初期表示が確定している
• HTMLを見るだけで状態が分かる
• 編集画面やバリデーション戻りと相性が良い

ブラウザ描画(CSR / JS描画)

HTMLは枠だけ返し、JSがAPIを叩いてHTMLを組み立てる方式。
1. ブラウザがページを開く
2. 空の が表示される
3. JS が /api/prefectures を fetch
4. JSON を受け取る
5. JS が を生成して挿入

<select id="prefecture"></select>

fetch('/api/prefectures')
  .then(res => res.json())
  .then(data => {
    select.innerHTML = data.map(p =>
      `<option value="${p.id}">${p.name}</option>`
    ).join('');
  });

ポイント
• API再利用しやすい
• 画面遷移なしで更新できる
• JSの責務が増えやすい

なぜ AI(Codex)はブラウザ描画を選んだのか?

codex曰く、AIの評価軸と、人間(特に管理画面)の評価軸が違ったという理由だそうです(真偽は未確認)

AIが暗黙に優先しがちなもの
• API中心設計
• 再利用性
• 将来拡張
• フロントエンド主導
• 「全部JSで制御した方が汎用的」

今回の状況には、
• 既に API が存在していた
• user側画面でJS検索を使っていた
• 管理画面でも動的な候補が必要だった

という前提があり、AIは
「このプロジェクトはJSで組み立てる思想だ」と判断しました。

その結果、
• 初期候補もJSで取得
• 編集画面の既存値復元もJS
• hydrate / fetch / setOptions のような補助関数が大量発生

という構成になりました。

レビュー中にもう一度AIと設計相談すると、「サーバー描画がいい」と答えたのはなぜか?

これは チャットでの会話の流れから質問の前提が変わったからとのこと。

チャットでの会話からcodexは下記の前提条件を読み取ったようです
• 可読性
• 管理画面としての分かりやすさ
• Thymeleafとの相性
• RPG(バリデーションエラー戻り)の安定性

この評価軸を含めると、
管理画面ではサーバー描画の方が圧倒的に楽という結論になります。

何を重要視するか、前提は何かを指示していなかった私の運用ミスですね。

結論:今回はハイブリッドに着地

今回の実装を振り返って、いちばんしっくりきた方針はこれでした。

サーバー描画に向いているもの(初期状態)
• 都道府県
• 路線
• 編集画面の既存選択値
• バリデーションNG時の再表示

→ Controller + Model + Thymeleaf で完結

JSに任せるべきもの(ユーザー操作で変わる)
• 市区町村(都道府県変更時)
• 駅(路線変更時)
• 数が多く、依存関係があるもの

→ JS + API で動的取得

この分け方が「壊れにくい」理由
• 初期表示が空にならない
• 編集画面の復元ロジックが激減する
• JSが「依存項目の更新」に集中できる
• HTMLを見れば状態が分かる
• デバッグが圧倒的に楽

教訓:AIに設計を任せるときに気をつけること
• APIがある = JS描画が正解、ではない
• エンジニア視点での「分かりやすさ」 を考慮するよう指示
• AIは汎用性を取りに行く
• 人間は保守性と理解コストを取る

まとめ

• サーバー描画とブラウザ描画に「絶対の正解」はない
• JSは「必要なところだけ」に絞るとjsファイルがごちゃつかずスッキリ
• AIの提案は「評価軸」を明示しないとズレやすい

同じように「JS増えすぎ問題」で悩んでいる人の参考になれば幸いです。

13
2
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
13
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?