概要
HTTP サーバー自作連載のまとめとして、ここまで扱ってきた要素を一つの学習用サーバーに並べて見直します。最小ルーティング、POST フォーム、TODO の CSV 永続化、静的ファイル配信、Cookie ベースの状態管理を一度つなげてみると、HTTP サーバーの内側で何が起きているかを通しで見やすくなります。ここでの完成版は実運用向けの完成品ではなく、連載全体の振り返り用です。
使いどころ
連載全体を通して HTTP サーバー自作の全体像を振り返りたい
学習用サンプルとして、各要素がどうつながるかを見直したい
既製の基盤に進む前に、ここまでの理解を一度まとめたい
コード例
import java.io.IOException;
import java.net.ServerSocket;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class LearningHttpServerOverview {
static final int PORT = 8086;
public static void main(String[] args) throws IOException {
var sessions = new ConcurrentHashMap<String, String>();
ExecutorService executor = Executors.newFixedThreadPool(10);
try (var serverSocket = new ServerSocket(PORT)) {
while (true) {
var client = serverSocket.accept();
executor.submit(() -> {
try {
// 1. リクエスト行とヘッダーを読む
// 2. ルーティングする
// 3. TODO は CSV に保存する
// 4. 静的ファイルは static/ から配信する
// 5. Cookie を読み、sessions で状態管理する
client.close();
} catch (IOException ignored) {
}
});
}
}
}
}Version Coverage
record、テキストブロック、`var` により、学習用のまとめコードでも読みやすさを保ちやすい。
record SessionUser(String name) {}
var sessions = new ConcurrentHashMap<String, SessionUser>();Library Comparison
注意点
完成版でも認証、アップロード、監査など実務で必要になる要素はかなり省いている
一つのサンプルにまとめる構成は学習には向くが、責務分離の見本として使うものではない
CSV 永続化とメモリセッションは、再起動や複数台構成を前提にしていない
静的配信と動的処理を一つの学習用サーバーに載せているのは、理解しやすさを優先しているためである
FAQ
勧めません。完成版は連載全体を振り返るための学習用まとめであり、実アプリの土台として使う前提ではありません。
学習用サンプルとして公開するのは問題ありませんが、公開時には学習用であることを README などで明示しておくと誤解が少なくなります。
連載の主眼が HTTP の仕組み理解だからです。永続化を DB に置き換えると、今度は DB 側の理解が主題になりやすくなります。
Spring Boot、Play、Jakarta EE などのフレームワーク実装に進み、認証・バリデーション・ログ・例外処理をどう基盤側に任せるかを見るのが自然です。