89
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【35歳未経験でも理解できた】従来型のアプリケーション

89
Posted at

従来型Webアプリの裏側をスッキリ整理してみた

はじめまして!
35歳未経験でエンジニアを目指し日々奮闘している者です。

Webの勉強を始めてすぐ、こんなことありませんか?

「画面は動くけど、裏で何が起きてるのか説明できない…」

僕もそんな状況でした。

この記事では、そんなモヤモヤを整理するために、
従来型のWebアプリケーションの仕組みをシンプルに解説します。

今回は「牛丼屋」に例えながら、イメージで理解できるようにお伝えします!

この記事はこんな人におすすめ

  • 「Webアプリの裏側」と聞くと、なんとなく難しそうで手が止まる方

  • 「HTTPはステートレス」と聞いて、理解した気になるけど説明できない方

  • 「フレームワークが何をやってくれているのか」が曖昧な方

参考書籍:小森裕介『プロになるためのWeb技術入門』


ズバリ結論!

従来型のWebアプリケーションを、一言で言うとこうです。

「サーバーという名の“ワンオペ店長”が、注文ごとに記憶喪失になるバイトをフォローしながら、毎回フルコースを作り直して提供している状態」

…なかなかハードな現場ですよね(笑)

このイメージがつかめると従来型Webアプリの動きがかなりクリアに見えてきます。

ここから、順番に分解していきます。

Webアプリ開発、ここがツラいよ。

Webアプリを作るのが難しい理由は、根底に「2つの厄介な性質」があるからです。

1. HTTPは「毎回はじめましてのバイト(ステートレス)」

ブラウザとサーバーを繋ぐ「HTTP」というルールは、「ステートレス(状態を持たない)」という性質があります。

例えるなら、1リクエストごとに記憶がリセットされるアルバイトです。

僕:「牛丼ください!」

バイト:「はい、牛丼ですね!」(提供)

僕:「あ、やっぱり卵も追加で!」

バイト:「……申し訳ありません、初めてのお客様でしょうか?」

さっきのやり取り、全部リセットされてます。

悲しいですが、毎回「さっき牛丼を頼んだ者です」と自己紹介しないと、同一人物だと認識してくれません。

これがステートレスの正体です。

2. 同時に100人から注文が来る(複数ユーザーの同時利用)

Webアプリは、同時に何百人もの人が使います。
記憶喪失のバイトに対して、同時に100人が「牛丼!」「カレー!」と叫んでいる状態です。
これを絶対に間違えず処理しないといけません。

従来型Webアプリの「力技」アプローチ

この「記憶喪失」と「大行列」のハードな現場。
従来型のWebアプリは「裏のサーバー(ワンオペ店長)が、毎回『完成品』をゼロから作って出す」という超絶・力技で解決しました。

具体的にはこんな感じです。

調理も盛り付けも、ぜーんぶ店長(サーバーがHTMLを生成)

お客さん(ブラウザ)は、席で待つだけ。裏の計算から「どんぶりの見栄え(HTMLの組み立て)」まで全部サーバーがやります。ブラウザは「運ばれてきた完成済みの牛丼を、ただ食べる(表示する)だけ」の受け身な存在です。

「生卵追加」だけで、牛丼をゼロから作り直す(画面遷移の仕組み)

リンクを押して別の画面に移動する(画面遷移する)のは、「やっぱり生卵追加で!」とお願いするイメージです。
普通なら生卵だけ小鉢で渡せばいいのに、従来型は違います。
「食べてる途中の牛丼を一旦没収し、厨房で『最初から生卵が乗った新品の牛丼』をイチから作り直して出す」という狂気のオペレーションをします。
リンクを押すと画面が一瞬「チカッ」と白くなるのは、この「どんぶり(画面)まるごと強制交換」が起きているからです。
※ブラウザがページを一度リセットして、新しいHTMLを読み込み直しているため

記憶喪失をカバーする「クッキーとセッション」

最大の課題は「記憶喪失のバイトに、どうやって自分を覚えさせるか?」
その答えが、「セッション」と「クッキー(Cookie)」です!

・セッション(店長の裏メモ)
  サーバー(店長)の裏に、僕ら専用の「注文メモ」を作ります。
 「この人は牛丼注文済み」とコッソリ書いておきます。

・セッションID(引換券の番号)
  そのメモと照らし合わせるための「引換券(番号)」を発行します。

・クッキー / Cookie(お客さんの財布)
  店長は引換券をブラウザ(お客さん)に渡し
 「財布(クッキー)にしまっといて!」とお願いします。

以降、お客さんは注文するたびに「財布(クッキー)から引換券(セッションID)を見せる」ルールになります。
これでバイトも「あ、引換券999番の牛丼の人ですね!」と裏メモを見て思い出せるわけです。
平和!

シンプルな図で流れを整理してみました。

【ブラウザ(お客さん)】                 【サーバー(ワンオペ店長)】
       |                                          |
       |  1. 「ログインさせて!」(ID/Pass)           |
       |----------------------------------------->|
       |                                          | (認証OK!)
       |                                          | ・裏メモ作成(セッション)
       |                                          | ・引換券番号を発行(ID: 999)
       |                                          |
       |  2. 「ログイン完了画面」と「引換券 999」を返す |
       |<-----------------------------------------|
 (財布(Cookie)に999をしまう)                       |
       |                                          |
       |  3. 「マイページ見せて!」                   |
       |     (財布の引換券 999 を一緒に見せる)       |
       |----------------------------------------->|
       |                                          | (お!番号999だからあの人だ!)
       |                                          | ・999の裏メモを確認
       |                                          | ・マイページの画面を作る
       |                                          |
       |  4. 「マイページの画面」を返す               |
       |<-----------------------------------------|

だから「フレームワーク」に頼るんです

ここまで整理してみて、僕は思いました。

「引換券作って、毎回番号確認して、画面も手作りして……店長の負担エグすぎない?」

そうなんです。「状態の維持(セッション管理)」と「ユーザーの区別」には、めちゃくちゃ手間がかかります。これを毎回ゼロから手作業でプログラミングするのは、まさに苦行です。

そこで先人たちが作ってくれたのが、「Webアプリケーションフレームワーク」です!

フレームワークが、この面倒な「引換券のやり取り」や「裏方の雑務」というシステム部分などの、よく使う処理をまとめて提供してくれます。おかげで開発者は、「どんな美味しい牛丼(サービス)を作るか」という本質的な部分に集中できるんですね。

まとめ

僕の理解を、最後にまとめます。

・HTTPは記憶喪失なので、放っておくと誰が誰だか分からなくなる。

・だから、「Cookie(引換券)」と「セッション(裏メモ)」を使って
 サーバー側で必死にユーザーを記憶している。

・その「超面倒くさい裏方作業」を丸投げできるのがWebフレームワーク。

少しでも、「あ、そういうことだったのか!」とスッキリしていただけたら嬉しいです。

次回はSPAへの進化を記事にしたいと思います!

89
22
1

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
89
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?