Safely Modernizing Legacy Code: Claude Code 활용 가이드
safely modernizing legacy code: Claude Code 활용. 실용적인 코드 예시를 포함합니다.
レガシーコードとの戦い方
테스트がなく、문서も古く、誰も触りたくないコード。Claude Code는 そんなレガシーコードの理解から改善まで強力にサポートします。
ステップ1:コードの理解
まずClaude Code에コードを分析させましょう。
> src/legacy/ 다음의コードを分析して。
> 각파일の責務、依存関係、데이터フローを説明して。
> 問題点と改善の優先順位も提案して。
Claude Code는 コード全体を読んだ上で、構造の説明と改善計画を提示します。
ステップ2:테스트の추가
改修前に테스트を書いて、現在の振る舞いを保証します。
> src/legacy/orderProcessor.js の現在の振る舞いを
> 保証する테스트를 생성해줘。
> 함수の入출력を分析して、正常系・異常系をカバーして。
> まだコードは변경しないで。
// レガシーコードの振る舞いを保証する테스트
import { processOrder } from "../legacy/orderProcessor";
describe("processOrder - 既存の振る舞いを保証", () => {
it("正常な注文を処理できる", () => {
const order = {
items: [{ id: "A1", qty: 2, price: 1000 }],
customer: { id: "C1", type: "regular" },
};
const result = processOrder(order);
expect(result.total).toBe(2000);
expect(result.status).toBe("confirmed");
});
it("空の注文でエラーを返す", () => {
const order = { items: [], customer: { id: "C1", type: "regular" } };
const result = processOrder(order);
expect(result.status).toBe("error");
expect(result.message).toContain("items");
});
it("VIP顧客に割引を適用する", () => {
const order = {
items: [{ id: "A1", qty: 1, price: 10000 }],
customer: { id: "C2", type: "vip" },
};
const result = processOrder(order);
expect(result.total).toBe(9000); // 10% off
});
});
ステップ3:段階的리팩터링
테스트が通ることを확인しながら、少しずつ改善します。
> 테스트を維持しながら、orderProcessor.jsを다음의方針で
> 리팩터링して:
> 1. TypeScriptに変換
> 2. 타입定義を추가
> 3. 1함수1責務に分割
> 4. 각변경後に테스트が通ることを확인
// 리팩터링後の構造
// orderProcessor.ts - メイン処理
export function processOrder(order: OrderInput): OrderResult {
const validation = validateOrder(order);
if (!validation.valid) {
return { status: "error", message: validation.message };
}
const subtotal = calculateSubtotal(order.items);
const discount = calculateDiscount(subtotal, order.customer);
const total = subtotal - discount;
return {
status: "confirmed",
total,
items: order.items,
discount,
};
}
// validators.ts - 유효성 검사
export function validateOrder(order: OrderInput): ValidationResult {
if (!order.items || order.items.length === 0) {
return { valid: false, message: "items is required" };
}
return { valid: true };
}
// calculators.ts - 計算ロジック
export function calculateSubtotal(items: OrderItem[]): number {
return items.reduce((sum, item) => sum + item.price * item.qty, 0);
}
export function calculateDiscount(subtotal: number, customer: Customer): number {
if (customer.type === "vip") {
return subtotal * 0.1;
}
return 0;
}
ステップ4:JavaScriptからTypeScriptへの移行
> src/legacy/ 다음의JS파일をすべてTypeScriptに変換して。
> 1. まず.jsを.tsにリネーム
> 2. any타입で타입チェックを通す
> 3. anyを적절한타입に置き換える
> 4. 각ステップで테스트が通ることを확인
콜백地獄の解消
> 콜백ベースの비동기処理を
> async/awaitに書き換えて。
// Before fix:콜백地獄
function fetchUserData(userId, callback) {
db.getUser(userId, (err, user) => {
if (err) return callback(err);
db.getPosts(user.id, (err, posts) => {
if (err) return callback(err);
db.getComments(posts[0].id, (err, comments) => {
if (err) return callback(err);
callback(null, { user, posts, comments });
});
});
});
}
// After fix:async/await
async function fetchUserData(userId: string): Promise<UserData> {
const user = await db.getUser(userId);
const posts = await db.getPosts(user.id);
const comments = posts.length > 0
? await db.getComments(posts[0].id)
: [];
return { user, posts, comments };
}
依存関係の업데이트
> package.jsonの依存패키지で古いものを特定して。
> メジャーバージョンが2つ以上古いものを복원ップ。
> 업데이트時のbreaking changesも調べて。
리팩터링の구체적인パターンは리팩터링자동화가이드を、테스트추가の戦略はTDDとClaude Codeの相性를 참고하세요.段階的な改善で문서も업데이트する方法は문서自動생성도 함께 확인하세요.
정리
レガシーコード改善の鍵は「테스트で安全網を張ってから少しずつ変える」ことです。Claude Code는 이프로세스を大幅に효율화します。一度にすべてを変えようとせず、段階的に進めましょう。
レガシーコード改善の名著『Working Effectively with Legacy Code』の考え方とClaude Code는 非常に相性が良いです。Claude Code의 상세 정보는Anthropic공식 문서를 참고하세요.
Related Posts
Claude Code로 리팩토링을 자동화하는 방법
Claude Code를 활용해 코드 리팩토링을 효율적으로 자동화하는 방법을 알아봅니다. 실전 프롬프트와 구체적인 리팩토링 패턴을 소개합니다.
Claude Code로 사이드 프로젝트 개발 속도를 극대화하는 방법 [예제 포함]
Claude Code를 활용해 개인 프로젝트 개발 속도를 획기적으로 높이는 방법을 알아봅니다. 실전 예제와 아이디어부터 배포까지의 워크플로를 포함합니다.
Complete CORS Configuration Guide: Claude Code 활용 가이드
complete cors configuration guide: Claude Code 활용. 실용적인 팁과 코드 예시를 포함합니다.