フレームワークとライブラリ — 何が違うの?
コーディングを学んでいると「フレームワーク」と「ライブラリ」という言葉が繰り返し出てきます。Expressは「Webフレームワーク」で、jQueryは「ライブラリ」で、Reactは…実は「ライブラリ」なのに「フレームワークのように」使われるとか。
一体何が違うのでしょうか?
実験室の例え:キット vs 試薬
ライブラリ = 個別の試薬
Bradford assay試薬を思い浮かべてください。タンパク質定量が必要な時に取り出して使い、使わない時は冷蔵庫にしまいます。実験のフローは自分が設計し、試薬はその中の1ステップにだけ登場します。
コードでのライブラリも同じです:
const axios = require("axios");
const response = axios.get("https://api.example.com/genes");axiosというライブラリを自分が必要な時に呼び出して使っています。プログラム全体のフローは自分が決めます。
フレームワーク = 実験キット(プロトコル付き)
ELISAキットを思い浮かべてください。キットの中に96ウェルプレート、抗体、バッファー、wash solutionが入っていて、決められたプロトコル通りに進める必要があります。ステップ1:coating → ステップ2:blocking → ステップ3:サンプル追加… 順番を変えると結果が出ません。
Expressも同じです:
const express = require("express");
const app = express();
app.get("/samples", function(req, res) {
res.json({ message: "サンプル一覧" });
});
app.listen(3000);Expressというフレームワークが定めた構造の中で、自分が埋めるべき部分("/samples"パスで何を返すか)だけを書きます。app.get()という枠の中に自分のコードを入れるのであって、HTTPリクエスト処理フロー全体を自分で設計するわけではありません。
核心的な違い:誰が誰を呼ぶか
| ライブラリ | フレームワーク | |
|---|---|---|
| 主導権 | 自分がコードを書き、必要な時にライブラリを呼ぶ | フレームワークが全体のフローを管理し、自分のコードを呼ぶ |
| 例え | 自分が試薬を取り出して使う | キットのプロトコルが自分を導く |
| コード形態 | ライブラリ.関数() 自分が呼ぶ | フレームワークが自分の関数を呼ぶ |
| 自由度 | 高い(好きなように組み合わせ) | 低い(定められた構造の中で作業) |
この違いをソフトウェア工学では**「制御の逆転(Inversion of Control)」**と呼びます。ライブラリを使う時は自分が制御権を持ちますが、フレームワークを使う時はフレームワークが制御権を持ち、適切なタイミングで自分のコードを呼び出します。
Expressでapp.get("/samples", function(req, res) { ... })を書く時 — このコールバック関数を自分で実行するわけではありません。 誰かが/samplesにアクセスすると、Expressが自動的にこの関数を呼び出します。 これが「フレームワークが自分を呼ぶ」構造です。
学んだものの分類
| 名前 | 分類 | 理由 |
|---|---|---|
| Express | フレームワーク | リクエスト-レスポンスのフローをExpressが管理。自分のコードはコールバックとして組み込む |
| React | ライブラリ(公式) | UIレンダリングのみ担当。ルーティング/状態管理は別途選択 |
| mysql2 | ライブラリ | DB接続が必要な時に自分が呼び出す |
| Next.js | フレームワーク | ファイル構造、ルーティング、ビルドをNext.jsが管理 |
Reactは公式には「ライブラリ」です。しかしNext.jsと一緒に使うとフレームワークのように動作します。この境界はナイフで切るように明確ではありません。
なぜフレームワークを使うのか
「自由度が低いのに、なぜフレームワークを使うの?」
一貫性 — チームメンバー10人がそれぞれ違う構造でサーバーを作ると、メンテナンスが不可能になります。フレームワークが構造を強制すれば、誰が書いたコードでも似たパターンで読めます。
繰り返しの排除 — ルーティング、エラー処理、ミドルウェアなどを毎回自分で作ると時間の無駄です。フレームワークがすでに用意しているものを使います。
検証された設計 — 世界中の数万人の開発者が使いテストした構造です。自分一人で設計したものよりバグが少ないです。
実験でも同じです。独自のassayを作ることもできますが、検証されたキットを使えば結果の信頼性が高く、他の研究者が再現するのも容易です。
結論:一文で
ライブラリは「自分が呼ぶ道具」で、フレームワークは「自分を呼ぶシステム」です。
Expressでapp.get()にコールバックを入れた時のことを思い出してください。そのコールバックを実行したのは自分ではなくExpressでした。それがフレームワークです。