레거시 Java 코드를 1~100점으로 채점하고 Java 21로 현대화하는 Claude Code 스킬을 만들었습니다
요약
Java 8 레거시 코드를 Java 21로 현대화하기 위해 Claude Code를 활용한 두 가지 전문 스킬(리뷰 및 구현)을 개발했습니다. 이 시스템은 NPE 방지, 통화 정밀도, 스레드 안전성 등 9가지 차원을 기준으로 코드의 품질을 100점 만점으로 채점하고 개선된 코드를 생성합니다.
핵심 포인트
- Claude Code를 활용하여 Java 8에서 Java 21로의 마이그레이션을 자동화하는 전용 스킬 구축
- NPE, 정밀도 손실, 레이스 컨디션 등 레거시 코드의 주요 결함을 9가지 지표로 정량적 채점
- 분석 전용(/java-modernization-review)과 구현 전용(/java-modernization-implement) 스킬의 분리를 통한 안전한 워크플로우 제공
- 원본 파일을 보존하면서 현대적인 Java 기능(Records, Virtual Threads 등)을 적용한 코드 생성
Java 8 → Java 21 마이그레이션의 문제점
만약 여러분이 Java 8 코드베이스에서 작업 중이거나, 금융권 및 레거시 시스템 관련 직무를 목표로 하고 있다면 이 글이 도움이 될 것입니다. 모든 Java 8 코드베이스는 동일한 문제를 안고 있습니다. 문제의 존재는 알고 있지만, 50,000줄에 달하는 코드에서 이를 찾아내고 수정하는 작업은 매우 느립니다:
- 통화 값에
double사용 → 운영 환경에서 소리 없는 외환(FX) 정밀도 손실 발생 - 보호되지 않은
order.getCounterparty().getAccount().getBalance()→ 결제 과정에서 NPE (NullPointerException) 발생 synchronized HashMap→ 동시 거래 부하 발생 시 레이스 컨디션 (race conditions) 발생Executors.newFixedThreadPool(200)→ 피크 타임 시 병목 현상 발생- 수동으로
equals/hashCode를 구현한 60줄짜리 DTO → 도메인 로직을 가리는 노이즈 발생
내가 만든 것
시니어 Java 아키텍트 역할을 수행하는 두 가지 스킬의 Claude Code 플러그인을 구축했습니다:
- 스킬 1 —
/java-modernization-review: Java 파일을 분석하고, 전체 보고서를analysis.md에 저장한 뒤 종료합니다. 코드를 수정하기 전에 사용자가 먼저 검토할 수 있습니다. - 스킬 2 —
/java-modernization-implement:analysis.md를 읽고, 모든 변경 사항을 적용하며, 원본 파일 옆에*Modern.java파일을 작성합니다. 원본 파일을 절대 덮어쓰지 않습니다.
채점 시스템
모든 리뷰는 9가지 차원에 걸쳐 Before/After 점수(총 100점 만점)를 생성합니다:
채점 세부 내역 (총 100점 만점)
🔴 NPE 방지 — 15점
🔴 통화 정밀도 (BigDecimal) — 15점
🔴 스레드 안전성 (Thread safety) — 15점
🟡 스트림 및 컬렉션 (Streams & collections) — 10점
🟡 예외 처리 (Exception handling) — 10점
🟡 현대적 데이터 캐리어 (Records) — 10점
🟡 동시성 모델 (Concurrency model, 가상 스레드/virtual threads) — 10점
🟡 현대적 Java 기능 (Modern Java features) — 10점
🟢 금융 도메인 규칙 (Financial domain rules) — 5점
실제 예시: TradeProcessor.java
스킬이 치명적이라고 표시한 레거시 코드:
// C1 — NPE: 이 중 어느 것이든 null일 수 있음
return order.getCounterparty().getAccount().getBalance();
// C2 — 모든 FX 거래 시 정밀도 손실 발생
double total = 0.0;
total += t.getAmount() * t.getFxRate();
// C2 — 모든 FX 거래 시 정밀도 손실 발생
double total = 0.0;
total += t.getAmount() * t.
// C2 — 모든 FX 거래 시 정밀도 손실 발생
double total = 0.0;
total += t.getAmount() * t.
getFxRate (); // C3 — 포지션 업데이트 시 Race condition
private HashMap < String , Double > positionMap = new HashMap <>();
public synchronized void updatePosition ( String cp , double delta ) {
Double current = positionMap . get ( cp );
positionMap . put ( cp , current == null ? delta : current + delta );
}
// C4 — 처리되지 않은 정산 실패
} catch ( Exception e ) {
// TODO: 나중에 처리
}
After /java-modernization-implement:
// C1 수정됨 — Optional 체이닝, NPE 발생 불가
public BigDecimal getCounterpartyBalance ( Order order ) {
return Optional . ofNullable ( order ) . map ( Order: : getCounterparty ) . map ( Counterparty: : getAccount ) . map ( Account: : getBalance ) . orElseThrow (() -> new IllegalArgumentException ( "Account balance unavailable" ));
}
// C2 + C3 수정됨 — BigDecimal 스트림 + 락 프리(lock-free) 맵 사용
private final ConcurrentHashMap < String , BigDecimal > positionMap = new ConcurrentHashMap <>();
public void updatePosition ( String counterparty , BigDecimal delta ) {
positionMap . merge ( counterparty , delta , BigDecimal: : add );
}
// Java 21 — 가상 스레드(virtual threads)
private final ExecutorService executor = Executors .
newVirtualThreadPerTaskExecutor (); 점수: 3/100 → 95/100 (+92점)
포함 범위 — Java 9부터 21까지의 모든 릴리스
우선순위 1 — 스트림 (Streams), Optional, 메서드 참조 (method references)
우선순위 2 — var, 유용한 NPE (NullPointerException) 메시지, 내장 HTTP 클라이언트 (Java 9–11)
우선순위 3 — 레코드 (Records), 봉인된 클래스 (sealed classes), 패턴 매칭 (pattern matching), 텍스트 블록 (text blocks) (Java 12–16)
우선순위 4 — 가상 스레드 (Virtual threads), 구조화된 동시성 (structured concurrency), 락 프리 원자성 (lock-free atomics) (Java 17–21)
우선순위 5 — 문자열 템플릿 (String templates), 타입 추론 (type inference) 개선 (Java 18–21)
우선순위 6 — Date → java.time, StringBuffer → StringBuilder, 리액티브 (reactive) → 가상 스레드 (virtual threads)
우선순위 7 — 모듈 시스템 (module-info.java)
2단계 워크플로 — 코드 변경 전 검토
1단계 — /java-modernization-review → 파일을 분석 → analysis.md 저장 → 중단 후 사용자의 승인 대기
2단계 — /java-modernization-implement → analysis.md를 읽음 → 모든 변경 사항 적용 → *Modern.java 작성 (원본은 유지) → 최종 점수 + 차이(delta) 출력
Claude Code에 설치하기
/plugin marketplace add Santoshrt999/Java-Claude-Skills
/plugin install java-claude-skills@java-modernization-review
/plugin install java-claude-skills@java-modernization-implement
/reload-plugins
전체 소스 코드와 TradeProcessor 예제는 리포지토리에 있습니다:
👉 Santoshrt999 / Java-Claude-Skills
Claude Code 스킬: AI를 사용하여 레거시 Java 8 코드를 Java 21로 검토 및 현대화합니다. 1~100점 사이의 점수를 생성합니다. 금융 시스템에 특화되어 있습니다.
Java Claude Skills — Claude Code를 위한 Java 8 → Java 21 현대화
Claude Code를 위한 AI 기반 Java 코드 현대화 스킬입니다. 레거시 Java를 분석하고, 우선순위가 지정된 업그레이드 보고서를 생성하며, 1~100점의 점수를 매기고, 모든 변경 사항을 에디터 내부에서 직접 적용합니다.
이 스킬을 사용하는 이유?
Java 8 코드를 Java 21로 마이그레이션하는 것은 가치가 매우 높지만 지루한 작업입니다. 모든 코드베이스는 동일한 문제를 안고 있습니다:
| 문제 | 영향 |
|---|---|
| monetary values에 대한 double 사용 | 모든 외환 (FX) 계산 시 조용한 정밀도 손실 발생 |
| 보호되지 않은 체이닝된 .get() 호출 | 운영 환경의 결제 (settlement) 흐름에서 NPE (NullPointerException)로 인한 크래시 발생 |
| synchronized HashMap | 부하가 걸린 상태에서 포지션 업데이트 시 레이스 컨디션 (Race condition) 발생 |
| Fixed thread pools | 200~500개의 동시 거래 발생 시 병목 현상 발생 |
| 60줄 이상의 보일러플레이트 (Boilerplate) DTO | 도메인 로직을 가리는 노이즈 발생 |
이 스킬은 여러분의 Claude Code 세션에서 시니어 Java 아키텍트 (Senior Java Architect) 역할을 수행합니다. Java 8부터 21까지의 모든 기능을 숙지하고 있으며, 금융 도메인 (financial-domain)의 안전 규칙을 강제하며, 단순한 조언이 아닌 즉시 배포 가능한 코드를 생성합니다.
Skills … GitHub에서 보기
다시 말씀드리지만, Java 8 코드베이스를 다루고 있거나 금융 및 레거시 시스템 분야로 진출하려는 분들에게 이 리포지토리 (repo)는 당신을 위해 만들어졌습니다. 금융 도메인 예제들은 의도적인 것입니다: 거래 프로세서 (trade processors), 외환 (FX) 산술, 포지션 맵 (position maps), 결제 로직 (settlement logic) 등입니다. 이것이 바로 여러분이 은행 면접과 실무에서 실제로 마주하게 될 코드입니다. 운영 환경에 적용하기 전에 여기서 현대화하는 연습을 해보세요.
여러분의 코드베이스에서는 어떤 점수가 나오는지 궁금합니다. 댓글로 남겨주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기