Windsurf의 Cascade 모드로 레거시 API 마이그레이션 자동화

문제 상황

레거시 REST API를 GraphQL로 전환하는 프로젝트를 진행 중이었다. 단순 변환 작업이지만 200개가 넘는 엔드포인트와 각각의 타입 정의, resolver, 테스트 코드를 일관되게 유지해야 했다.

수동으로 진행하기엔 실수가 잦았고, 단순 find-replace로는 비즈니스 로직의 차이를 반영할 수 없었다.

Cascade 모드 활용

Windsurf의 Cascade 모드는 멀티 파일 편집에 특화되어 있었다. 하나의 프롬프트로 관련된 파일들을 동시에 수정할 수 있다는 점이 핵심이었다.

// Before: routes/users.ts
router.get('/users/:id', async (req, res) => {
  const user = await db.users.findById(req.params.id);
  res.json(user);
});

// After: resolvers/user.ts
export const userResolver = {
  Query: {
    user: async (_: any, { id }: { id: string }) => {
      return db.users.findById(id);
    }
  }
};

Cascade에 "users 엔드포인트를 GraphQL resolver로 변환하되, 기존 에러 핸들링 로직은 유지"라고 지시하면 route, resolver, schema, test 파일을 함께 수정했다.

실제 워크플로우

  1. 레퍼런스로 이미 마이그레이션된 파일 2~3개를 컨텍스트에 추가
  2. Cascade 모드에서 변환할 엔드포인트 그룹 지정 (보통 도메인 단위)
  3. 생성된 코드 검토 후 일부 수정
  4. 다음 그룹 진행 시 이전 결과물을 레퍼런스로 활용

특히 인증, 권한 체크 같은 공통 로직은 첫 그룹에서 패턴을 잡아두니 이후 작업에서 일관되게 적용됐다.

결과

  • 예상 3주 작업을 1주로 단축
  • 타입 불일치나 누락된 필드 같은 휴먼 에러 감소
  • 코드 리뷰 시간도 줄었음 (패턴이 일관되니 차이점만 집중)

단순 반복 작업일수록 Cascade 모드의 강점이 두드러졌다. 다만 복잡한 비즈니스 로직 변환은 여전히 직접 검토가 필요했다.