광고 자리 모집 중 · 제휴 문의

Mutable.ai VS Code 확장 프로그램과 Auto Edit을 활용한 자연어 기반 복잡한 함수 리팩터링 가이드

365Finds Editorial
Wiki 문서 11,430편 수록

내 AI에서 365 Wiki 사용하기

아래 프롬프트를 복사해 평소 사용하는 AI에 붙여넣고 바로 질문하세요.

전체 Skill 다운로드

먼저 프롬프트로 체험해 보세요. 365 Wiki를 자주 쓴다면 전체 365Wiki Skill을 설치해 매번 붙여넣는 수고를 줄일 수 있습니다. 평소 쓰는 AI가 없다면 Gemini나 Microsoft Copilot 웹 버전도 사용할 수 있습니다.

소프트웨어 개발과 유지보수 과정에서 거대하고 복잡한 레거시 함수를 수작업으로 리팩터링하는 것은 엔지니어에게 가장 부담스럽고 오류가 발생하기 쉬운 작업 중 하나입니다. 수백 줄에 걸쳐 중첩된 조건문, 콜백 지옥(Callback Hell), 암묵적인 상태 변경, 그리고 오래된 '좀비 코드'가 뒤엉켜 있는 함수를 수동으로 한 줄씩 수정하다 보면 문법 오류가 발생하거나 변수 스코프가 깨져 심각한 회귀 버그(Regression)를 유발하기 쉽습니다.

Mutable.ai는 이러한 병목 현상을 해결하기 위해 공식 Visual Studio Code 확장 프로그램에 Auto Edit(자동 편집) 기능을 도입했습니다. 커서 위치에서 단순히 몇 글자를 예측하는 일반적인 코드 자동완성이나 브라우저와 IDE 사이에서 코드를 계속 복사·붙여넣기해야 하는 외부 챗봇과 달리, Auto Edit은 에디터 내부에서 직접 작동하는 자연어 리팩터링 엔진입니다. 개발자가 에디터 내에서 대상 코드 블록을 선택하고 자연어로 지시를 내리면, 전체 코드베이스의 컨텍스트를 파악하여 안전하고 검증 가능한 단위로 코드를 재구성합니다.


1. Auto Edit과 기존 자동완성 및 AI 챗봇의 핵심 차이점

기존의 AI 코딩 보조 도구는 대체로 다음 두 가지 형태로 나뉩니다:

  1. 인라인 자동완성(Ghost Text): GitHub Copilot이나 Tabnine처럼 커서 위치를 기반으로 바로 다음 토큰이나 코드 몇 줄을 추천합니다. 보일러플레이트 코드 작성에는 효율적이지만, 함수 전체의 논리 구조를 개편하거나 얽혀 있는 의존성을 안전하게 정리하지는 못합니다.
  2. 사이드바 챗봇(Chat Panel): 사이드바 대화창에 코드를 붙여넣어 리팩터링 방안을 물어보는 방식입니다. 하지만 에디터에서 코드를 복사해 외부 패널로 옮기고 생성된 코드를 다시 파일로 복원해야 하므로 개발 몰입(Flow)이 끊기고 세부 인터페이스 불일치가 발생할 위험이 있습니다.

Mutable.ai의 Auto Edit은 자연어 명령과 IDE 기본 기능을 유기적으로 결합했습니다:


2. VS Code에서 Auto Edit을 호출하는 3가지 방법

Mutable.ai 확장 프로그램은 작업 흐름에 맞춰 세 가지 직관적인 진입점을 제공합니다:

호출 방식위치 및 접근 경로권장 활용 시나리오
Code Lens함수 선언문 바로 위에 표시되는 Auto Edit 레이블 클릭특정 단일 함수, 메서드 또는 클래스의 집중 리팩터링
상태 표시줄(Status Bar)VS Code 하단 상태 표시줄의 Mutable.ai 아이콘 클릭전역 명령 호출 또는 확장 프로그램 상태 확인
우클릭 컨텍스트 메뉴선택 영역 또는 탐색기 파일 우클릭 후 Mutable.ai: Auto Edit 선택다중 코드 블록 수정 또는 모듈 단위 변경

호출 시 대상 코드 바로 위에 플로팅 프롬프트 입력창이 나타나며, 개발자의 자연어 명령을 입력받을 준비를 마칩니다.


3. Auto Edit을 활용한 단계별 리팩터링 워크플로

순환 복잡도(Cyclomatic Complexity)가 높은 복잡한 함수를 리팩터링할 때 권장되는 5단계 프로세스는 다음과 같습니다:

[복잡한 대상 함수]
        │
        ▼
[1단계: 범위 지정] ──► [2단계: Auto Edit 호출] ──► [3단계: 정밀 프롬프트 작성]
                                                              │
                                                              ▼
[5단계: 반영 / 검증] ◄── [4단계: 에디터 내 Diff 검토] ◄── [AI 엔진 컨텍스트 합성]

1단계: 대상 함수 범위 지정

리팩터링할 전체 함수 블록을 드래그하여 선택하거나 함수 선언 줄에 커서를 둡니다. 명확한 범위를 지정해야 AI 엔진이 인접한 다른 함수나 상단 import 구문을 실수로 수정하는 일을 방지할 수 있습니다.

2단계: Code Lens로 Auto Edit 실행

함수 헤더 위에 위치한 Auto Edit Code Lens 레이블을 클릭합니다. 선택된 블록이 컨텍스트로 고정되고 자연어 프롬프트 입력창이 활성화됩니다.

3단계: 명확하고 구조화된 리팩터링 프롬프트 작성

단순히 "이 코드 개선해 줘" 같은 모호한 요청은 피해야 합니다. 아키텍처 목적, 구조적 제약 조건, 하위 호환성 유지를 명확히 지정합니다:

4단계: 에디터 내 시각적 Diff 검토

Mutable.ai가 코드를 생성하면 VS Code 내에서 차이점 비교 뷰가 렌더링됩니다:

기존 호출처와의 반환 규격이 유지되는지, 에러 throw 방식이 기존 시스템의 계약을 위반하지 않는지 꼼꼼히 점검합니다.

5단계: 반영, 반복 수정 또는 취소


4. 실전 사례: 복잡한 주문 처리 함수 리팩터링

콜백 지옥, 암묵적인 상태 계산, 그리고 과거 프로모션의 잔재가 남아 있는 레거시 JavaScript 함수를 리팩터링하는 예시입니다.

리팩터링 전 레거시 코드 (Before)

function processOrder(order, callback) {
    if (order) {
        if (order.id && order.items && order.items.length > 0) {
            var total = 0;
            for (var i = 0; i < order.items.length; i++) {
                if (order.items[i].price && order.items[i].qty) {
                    total += order.items[i].price * order.items[i].qty;
                } else {
                    // 2021년 임시 이벤트의 레거시 폴백 로직
                    if (order.legacyPromo) {
                        total += 10;
                    }
                }
            }
            if (order.user && order.user.email) {
                database.saveOrder(order.id, total, function(err, res) {
                    if (err) {
                        callback(err, null);
                    } else {
                        emailService.sendReceipt(order.user.email, res, function(err2) {
                            if (err2) {
                                callback(null, { status: "partial_success", res: res });
                            } else {
                                callback(null, { status: "success", res: res });
                            }
                        });
                    }
                });
            } else {
                callback(new Error("Missing user email"), null);
            }
        } else {
            callback(new Error("Invalid items payload"), null);
        }
    } else {
        callback(new Error("Empty order"), null);
    }
}

Auto Edit 자연어 지시문

"processOrder 함수를 최신 TypeScript로 리팩터링해 줘: 콜백 대신 async/await를 적용하고, 다중 중첩 조건문을 조기 반환 보호 구문으로 평탄화하며, 주문 총액 계산 로직은 별도의 헬퍼 함수로 분리해 줘. 더 이상 쓰이지 않는 legacyPromo 로직은 완전히 삭제하고 Order와 OrderResult 인터페이스를 정의해 줘."

리팩터링 후 현대적 코드 (After)

interface OrderItem {
    id: string;
    price: number;
    qty: number;
}

interface Order {
    id: string;
    items: OrderItem[];
    user: { email: string };
}

interface OrderResult {
    status: "success" | "partial_success";
    res: unknown;
}

function calculateOrderTotal(items: OrderItem[]): number {
    return items.reduce((sum, item) => sum + item.price * item.qty, 0);
}

async function processOrder(order: Order): Promise<OrderResult> {
    if (!order) {
        throw new Error("Empty order");
    }
    if (!order.id || !order.items || order.items.length === 0) {
        throw new Error("Invalid items payload");
    }
    if (!order.user?.email) {
        throw new Error("Missing user email");
    }

    const total = calculateOrderTotal(order.items);
    const res = await database.saveOrder(order.id, total);

    try {
        await emailService.sendReceipt(order.user.email, res);
        return { status: "success", res };
    } catch (emailError) {
        return { status: "partial_success", res };
    }
}

리팩터링을 통한 개선 효과:

  1. 순환 복잡도 급감: 6단계 깊이로 중첩되었던 인덴트가 단일 레벨의 간결한 보호 구문으로 정리되었습니다.
  2. 기술 부채 제거: 테스트 코드로 보장되지 않던 사장된 legacyPromo 분기를 안전하게 제거했습니다.
  3. 단일 책임 원칙 준수: 금액 계산을 calculateOrderTotal 함수로 격리하여 개별 단위 테스트가 용이해졌습니다.
  4. 컴파일 타임 안전성 확보: TypeScript 인터페이스를 통해 함수 호출부의 타입 오류를 원천 차단했습니다.

5. 엔지니어링 모범 사례 및 주의점

자연어 기반 코드 리팩터링을 효과적으로 수행하기 위해 준수해야 할 지침입니다:

권장 사례

피해야 할 함정


6. 제품의 현주소와 현대적 개발 생태계

Mutable.ai는 2021년 Omar Shams와 Maxwell Siegelman이 설립하고 Y Combinator(W22)의 투자를 받은 기업으로, 코드베이스 자동 문서화(Auto Wiki)와 저장소 전체 맥락을 이해하는 AI 개발 보조 솔루션으로 큰 주목을 받았습니다.

2024년 12월, Mutable.ai는 Alphabet(Google)에 공식 인수되었습니다. 이 인수 이후 독립형 상용 서비스와 공식 VS Code 마켓플레이스 확장 프로그램은 단독 배포를 종료하고 Google의 내부 엔지니어링 생태계로 통합되었습니다. 비록 기존 독립형 확장 프로그램의 신규 배포는 중단되었으나, Mutable.ai가 개척한 '에디터 내 제자리 자연어 편집', '전체 저장소 맥락 이해', '시각적 네이티브 Diff 검토'라는 아키텍처 철학은 오늘날 Cursor의 Composer, GitHub Copilot Edits, Continue.dev, Aider 등 차세대 AI 개발 도구들의 표준 인터페이스로 자리 잡았습니다.


참고 자료