0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

レガシーJava APIをClaude CodeでTypeScript+Honoに移行する手順(教材zip付き)

0
Last updated at Posted at 2026-08-08

この記事でわかること:

  • レガシーJava(Java 8スタイル)のAPIを Claude Code で TypeScript + Hono に移し替える具体的な手順
  • 移行を安全に進める順序 —— 仕様書化 → テストの安全網 → 移行 → 突き合わせレビュー
  • AIが高確率で取りこぼす仕様(大文字小文字・空文字・404)と、その見つけ方

前提

  • Windows 11 / Node.js 20 LTS / JDK 17以上(Temurin) / Claude Code(2026年8月時点の最新版)/ Hono v4
  • 題材は教材用のレガシー風Javaプロジェクト legacy-orders(注文管理。raw型・Calendar・長いメソッドを意図的に残した約500行。MIT)
  • 業務コードは使わない。教材zipは ハンズオン教材サイト から取得できる(Maven不要・JUnitランチャー同梱)
# 教材のセットアップ(zip展開後)
cd legacy-orders
run-tests.cmd        # 既存テスト2件がグリーンになればOK
claude               # Claude Code起動

Step 1: 現行仕様を読ませ、人間が突き合わせる

移行の最初の作業はコーディングではなく現行仕様の固定だ。Claude Code に次を指示する。

src/main/java/com/example/orders/OrderService.java の現行仕様を読み解き、
公開メソッドごとの入力・出力・例外、バリデーションのルール、
注文ステータスの遷移がわかる仕様書を docs/order-service-spec.md に作成してください

数分で仕様書が出てくるが、そのまま信用してはいけない。コードと突き合わせると、私の場合は 「キャンセル時に在庫を戻す」仕様が抜けていた。「◯◯が抜けている。追記して」と指摘すれば直る。この突き合わせをやるかどうかが移行の品質を決める。

Step 2: テストで現行の挙動を固定する

移行後の同値性を機械的に確認できるよう、先に移行元へテストを張る。境界値を明示的に指定するのがポイントだ。

PriceCalculator.java に JUnit 5 のユニットテストを作成してください。
送料無料になる5000円の境界、クーポン適用の3000円の境界、
まとめ買い割引の10個の境界、会員ランクごとの割引を必ず含める。
作成後、run-tests.cmd を実行して全テストが通ることを確認してください

生成されたテストは1本ずつ読む。「5000円ちょうどは送料無料か」を自分で答えられない状態でグリーンを喜んではいけない。

Step 3: Honoへ移行させる

OrderService の注文検索(顧客IDの前方一致)と1件取得と同等のREST APIを、
TypeScript + Hono で新規フォルダ hono-orders に実装してください。
- データはメモリ上のサンプル配列でよい
- GET /orders?customer=xx で検索、GET /orders/:id で1件取得
- 元のJava実装とAPI仕様の対応表を hono-orders/SPEC.md に作成
- npmで起動し、curlでの動作確認まで行ってください

生成される実装の骨格はおおむねこうなる。

import { Hono } from "hono";

const app = new Hono();

app.get("/orders", (c) => {
  const prefix = (c.req.query("customer") ?? "").toLowerCase();
  if (!prefix.trim()) return c.json([]);
  return c.json(
    orders.filter((o) => o.customerId.toLowerCase().startsWith(prefix))
  );
});

app.get("/orders/:id", (c) => {
  const found = orders.find((o) => o.id === c.req.param("id"));
  return found ? c.json(found) : c.json({ error: "not found" }, 404);
});

export default app;
cd hono-orders && npm install && npm run dev
curl "http://localhost:3000/orders?customer=ta"
curl "http://localhost:3000/orders/ORD-00001"

Step 4: SPEC.md の対応表を突き合わせる(ここが本番)

AIは動くコードを速く書くが、元実装の暗黙仕様を高確率で取りこぼす。SPEC.md の対応表を元のJavaコードと突き合わせ、差分を指摘して直させる。

ハマりどころ

1. 大文字小文字の扱い
Java側の検索は toLowerCase() で大文字小文字を無視していたが、初回生成のHono側は区別していた。?customer=TA で結果が変わってしまう。対応表に「case-insensitive」と書かれているかを必ず確認する。

2. 空文字・null の挙動
Java側は空文字・nullで「空リストを返す」仕様。Hono側は未指定時に全件を返す実装になりがちで、これは情報漏えい相当の仕様差になる。

3. 存在しないIDのレスポンス
Java側は null を返すだけだが、REST APIとしては404を返すべきだ。ここは「仕様差を直す」のではなく「移行を機に仕様を明文化する」判断ポイントになる。判断はAIではなく人間がやる。

実測のすすめ

「従来なら何分かかったか」を先に見積もってから各Stepの実時間を測ると、自分の環境での短縮率が手に入る。他人のベンチマークを引用するより、自分の実測値で語るほうが社内の説得力は圧倒的に高い。

まとめ

  • 移行は「仕様書化 → テスト → 移行 → 突き合わせ」の順序でやれば小さく安全に試せる
  • AIは書くのが速いが、大文字小文字・空文字・404 といった暗黙仕様を落とす。見つけて直させるのが人間の仕事
  • レガシーを読める人ほど、この分業の恩恵は大きい

この記事は Shimanto AIブログの元記事 を Qiita 向けに再編集したものです。手順を全3回・約8時間で体験できる無料ハンズオン教材(サンプルコードzip付き)も公開しています。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?