pile·
백엔드·flexflex·

[의존성의 방향을 따라 3/5] OpenRewrite와 Claude가 코드를 변환한다

50개 레포 Spring Boot 버전업 시나리오에서 Updater가 OpenRewrite(정적 코드 변환)와 Claude(빌드 에러 수정)를 역할 분담하는 방법을 상세히 설명하는 시리즈 3편. 결정론적 변환은 OpenRewrite recipe가 AST 기반으로 처리하고, 비즈니스 맥락이 필요한 예외는 Claude가 분석·수정하며, 빌드가 최종 가드레일이 되는 구조다.

핵심 포인트
  • Updater의 두 무기: OpenRewrite(결정론적 AST 기반 변환) + Claude(AI 빌드 에러 수정). 순서: OpenRewrite 먼저 → 빌드 성공 시 종료, 실패 시 Claude 투입 → 빌드 재시도 루프
  • AST 기반 변환의 결정론: 단순 텍스트 치환(sed/정규식)은 주석·문자열 리터럴까지 건드림 — AST 기반은 "이 타입의, 이 시그니처를 가진 메서드 호출"만 정확히 지목
  • Recipe 방식 2종: YAML(선언적 — 의존성 버전 조정, deprecated API 마이그레이션) + Java/Kotlin(프로그래밍 — AST visitor 구현, 비즈니스 판단 필요 변환)
  • Init script 주입 방식: `build.gradle.kts` 수정 없이 외부에서 recipe 주입 → "변환 도구를 위한 변환"이라는 닭-달걀 순환 문제 회피, 대상 레포에 흔적 없음
  • Claude의 역할 경계: 빌드 에러 로그 분석 + 주변 코드의 예외 처리 패턴을 읽어 수정안 생성. 수정이 옳은지는 Claude가 보장 불가 — 빌드 가드레일이 최종 검증
  • Recipe = 실행 가능한 문서: 슬랙 메시지 대비 실행 가능성·재현 가능성·테스트 가능성·Idempotency·버전 관리 모두 우위
상세 정리
  • Recipe 변환 대상 4가지: 의존성 버전 업데이트, deprecated API 마이그레이션(.allowedOrigins → .allowedOriginPatterns), import 문(패키지 이동), application.yml 설정 프로퍼티 마이그레이션
  • 공식 rewrite-spring + 커스텀 recipe 조합: 공식은 프레임워크 표준 마이그레이션, 커스텀은 내부 라이브러리 버전 규약·사내 컨벤션 추가
  • Recipe 버전 관리(Nexus): 6개월 후에도 동일한 변환을 토씨 하나 다르지 않게 재현 가능. 변환 규칙 자체가 코드처럼 버전 이력을 가짐
  • Idempotent recipe: 이미 변환된 코드에 다시 적용해도 추가 변경 없음 → 언제든 안전하게 재실행 가능
  • Claude 수정 예시 1: nullable 타입 변경(findWorkspace 반환이 Workspace? 로 바뀜) — 주변 코드 패턴 읽어 WorkspaceNotFoundException(id) 예외 투입
  • Claude 수정 예시 2: 대소문자 오류(getDefaultTimezone → getDefaultTimeZone) 수정
  • Convention Plugin + 테스트 스위트가 Claude의 가드레일: 의존성 방향 강제 + 비즈니스 로직 검증 → Claude는 이 가드레일 안에서만 동작
  • 파이오니어 경험 인코딩 과정: 첫 레포에서 MySQL 커넥션 릭 발견 → recipe 작성 → 커밋 + Nexus 퍼블리시 → 나머지 49개 레포에 자동 적용. 슬랙 메시지가 recipe로 대체되는 과정
  • JUnit 기반 recipe 테스트: "이 변환이 의도한 것만 바꾸는지, 바꾸면 안 되는 것을 건드리지 않는지" 코드로 검증 가능
왜 읽나대규모 다중 레포 마이그레이션에서 OpenRewrite AST 변환과 Claude AI를 역할 분담해 결정론적 변환과 유연한 예외 처리를 동시에 달성하는 설계 — init script 주입 방식, recipe 조합, 빌드 가드레일 구조까지 실제 코드와 함께 배울 수 있는 시리즈 3편이다.
flex
flex 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2