← 블로그 목록
Claude CodeAI 리팩토링자동화테스트 생성개발 워크플로

Claude Code 100% 활용 워크플로: 프로젝트 자동 분석·리팩토링·테스트 생성

Claude Code의 skill, subagent, 플러그인을 활용한 프로젝트 자동 분석·리팩토링·테스트 생성 워크플로를 실제 사례로 설명합니다.

Vibeollio 팀-

Claude Code 100% 활용 워크플로: 프로젝트 자동 분석·리팩토링·테스트 생성

코드 리뷰, 리팩토링, 테스트 작성—개발 팀이라면 누구나 이 반복적인 작업에 시간을 쏟고 있습니다. Claude Code는 단순한 코드 생성 도구를 넘어, skill, subagent, 플러그인 같은 고급 기능으로 이 전체 워크플로를 자동화할 수 있습니다. 이 글에서는 실제 프로젝트 시나리오를 통해 Claude Code를 100% 활용하는 방법을 보여드리겠습니다.

워크플로 설계: 3단계 자동화 파이프라인

Claude Code의 고급 기능을 활용하려면 먼저 전체 워크플로를 설계해야 합니다. 일반적인 리팩토링 프로세스는 다음과 같이 나뉩니다:

  1. 프로젝트 분석 단계 - 코드 구조, 의존성, 성능 문제 파악
  2. 리팩토링 단계 - 식별된 문제 해결 및 코드 개선
  3. 테스트 생성 단계 - 단위 테스트 및 통합 테스트 자동 작성

예를 들어, 3년 된 Python 백엔드 프로젝트가 있다고 가정해봅시다. 초기 개발 당시 작성된 코드는 중복이 많고, 타입 힌팅이 없으며, 테스트 커버리지가 30% 수준입니다. 이런 상황에서 Claude Code의 skill과 subagent를 조합하면, 수동 작업 시간을 80% 이상 단축할 수 있습니다.

Skill을 활용한 자동 코드 분석

Claude Code의 skill은 특정 작업에 최적화된 프롬프트 템플릿과 실행 환경입니다. 프로젝트 분석 skill을 구성하려면 다음 요소를 포함해야 합니다:

  • 구조 분석: 디렉토리 구조, 모듈 간 의존성 매핑
  • 코드 메트릭: 순환 복잡도(cyclomatic complexity), 함수 길이, 클래스 크기
  • 안티패턴 감지: 중복 코드, 과도한 매개변수, 긴 메서드 식별
  • 보안 검사: 하드코딩된 시크릿, SQL 인젝션 위험, 인증 로직 문제

실제 예시를 보겠습니다. 다음과 같은 Python 함수가 있다고 가정합시다:

def process_user_data(user_id, db_connection):
    query = "SELECT * FROM users WHERE id = " + str(user_id)
    result = db_connection.execute(query)
    user = result.fetchone()
    if user:
        name = user[0]
        email = user[1]
        age = user[2]
        if age > 18:
            send_marketing_email(email)
            log_activity(user_id, 'marketing_email_sent')
            update_user_status(user_id, 'active')
            send_notification(email, 'Welcome to premium')
        return {"status": "success", "data": user}
    return {"status": "error", "data": None}

Claude Code의 분석 skill은 다음을 자동으로 감지합니다:

  • SQL 인젝션 취약점 (문자열 연결)
  • 매직 넘버 사용 (user[0], user[1], user[2])
  • 단일 책임 원칙 위반 (조회, 검증, 이메일, 로깅, 상태 업데이트를 모두 처리)
  • 에러 처리 부재
  • 타입 힌팅 없음

이 정보를 구조화된 리포트로 생성하면, 다음 단계인 리팩토링이 훨씬 수월해집니다.

Subagent를 통한 병렬 리팩토링

Subagent는 특정 작업을 독립적으로 수행하는 AI 에이전트입니다. 리팩토링 워크플로에서는 여러 subagent를 동시에 실행할 수 있습니다:

  • Security Refactor Agent: 보안 취약점 수정
  • Type Hint Agent: 타입 힌팅 추가
  • Modularity Agent: 함수 분리 및 단일 책임 원칙 적용
  • Performance Agent: 쿼리 최적화, 캐싱 추가

위의 예제 함수는 subagent를 통해 다음과 같이 변환됩니다:

from typing import Optional, Dict, Any
from dataclasses import dataclass
import logging

logger = logging.getLogger(__name__)

@dataclass
class User:
    id: int
    name: str
    email: str
    age: int

class UserRepository:
    def __init__(self, db_connection):
        self.db = db_connection
    
    def get_user_by_id(self, user_id: int) -> Optional[User]:
        """Parameterized query to prevent SQL injection"""
        query = "SELECT id, name, email, age FROM users WHERE id = %s"
        result = self.db.execute(query, (user_id,))
        row = result.fetchone()
        if row:
            return User(id=row[0], name=row[1], email=row[2], age=row[3])
        return None

class UserNotificationService:
    def notify_eligible_user(self, user: User) -> Dict[str, Any]:
        """Handle only notification logic"""
        if user.age <= 18:
            return {"status": "skipped", "reason": "underage"}
        
        try:
            self.send_marketing_email(user.email)
            self.log_activity(user.id, 'marketing_email_sent')
            return {"status": "success", "message": "Email sent"}
        except Exception as e:
            logger.error(f"Failed to notify user {user.id}: {e}")
            return {"status": "error", "message": str(e)}
    
    def send_marketing_email(self, email: str) -> None:
        # Implementation
        pass
    
    def log_activity(self, user_id: int, action: str) -> None:
        # Implementation
        pass

Subagent가 병렬로 작동하면, 각각의 리팩토링 결과를 자동으로 병합하고 충돌을 해결합니다. 이 과정에서 플러그인이 추가적인 검증 역할을 합니다.

플러그인 연동: 자동 테스트 생성 및 검증

Claude Code 플러그인은 외부 도구와의 통합을 담당합니다. 테스트 자동 생성 워크플로에서는 다음 플러그인들이 활용됩니다:

  • pytest 플러그인: 단위 테스트 실행 및 커버리지 측정
  • 코드 린팅 플러그인: 스타일 가이드 준수 확인
  • 의존성 분석 플러그인: 패키지 버전 호환성 검사
  • CI/CD 연동 플러그인: GitHub Actions 또는 GitLab CI 트리거

リファクト링된 코드에 대해 Claude Code는 자동으로 테스트를 생성합니다:

import pytest
from unittest.mock import Mock, patch
from user_service import UserRepository, UserNotificationService, User

class TestUserRepository:
    @pytest.fixture
    def mock_db(self):
        return Mock()
    
    @pytest.fixture
    def repository(self, mock_db):
        return UserRepository(mock_db)
    
    def test_get_user_by_id_success(self, repository, mock_db):
        # Arrange
        mock_db.execute.return_value.fetchone.return_value = (1, 'John', '[email protected]', 25)
        
        # Act
        user = repository.get_user_by_id(1)
        
        # Assert
        assert user is not None
        assert user.id == 1
        assert user.name == 'John'
        assert user.email == '[email protected]'
        assert user.age == 25
        mock_db.execute.assert_called_once_with(
            "SELECT id, name, email, age FROM users WHERE id = %s",
            (1,)
        )
    
    def test_get_user_by_id_not_found(self, repository, mock_db):
        # Arrange
        mock_db.execute.return_value.fetchone.return_value = None
        
        # Act
        user = repository.get_user_by_id(999)
        
        # Assert
        assert user is None

class TestUserNotificationService:
    @pytest.fixture
    def service(self):
        return UserNotificationService()
    
    def test_notify_eligible_user_success(self, service):
        # Arrange
        user = User(id=1, name='John', email='[email protected]', age=25)
        
        # Act
        with patch.object(service, 'send_marketing_email') as mock_email:
            with patch.object(service, 'log_activity') as mock_log:
                result = service.notify_eligible_user(user)
        
        # Assert
        assert result['status'] == 'success'
        mock_email.assert_called_once_with('[email protected]')
        mock_log.assert_called_once_with(1, 'marketing_email_sent')
    
    def test_notify_underage_user_skipped(self, service):
        # Arrange
        user = User(id=2, name='Jane', email='[email protected]', age=16)
        
        # Act
        result = service.notify_eligible_user(user)
        
        # Assert
        assert result['status'] == 'skipped'
        assert result['reason'] == 'underage'

생성된 테스트는 자동으로 실행되며, 플러그인이 커버리지 리포트를 생성합니다. 이 경우 테스트 커버리지가 30%에서 85%로 상승합니다.

실제 워크플로 실행: 단계별 가이드

전체 워크플로를 실행하려면 다음 순서를 따릅니다:

1단계: 프로젝트 초기화

  • Claude Code에 프로젝트 루트 디렉토리 업로드
  • 분석 skill 활성화
  • 기본 메트릭 리포트 생성

2단계: 분석 결과 검토

  • 자동 생성된 분석 리포트에서 우선순위 결정
  • 리팩토링 범위 정의 (예: 보안 > 성능 > 스타일)

3단계: Subagent 실행

  • 각 카테고리별 subagent 활성화
  • 병렬 처리로 리팩토링 수행
  • 결과 병합 및 충돌 해결

4단계: 테스트 생성 및 실행

  • 테스트 생성 플러그인 활성화
  • 자동 생성된 테스트 실행
  • 커버리지 리포트 검토

5단계: CI/CD 통합

  • 변경사항을 Git 브랜치로 커밋
  • CI/CD 파이프라인 자동 트리거
  • 최종 검증 및 병합

이 워크플로는 팀 규모에 따라 조정할 수 있습니다. 소규모 팀이라면 2-3단계를 수동으로 검토하고, 대규모 팀이라면 완전 자동화할 수 있습니다.

Vibeollio에서 AI 개발 도구 프로젝트 공유하기

Claude Code를 활용한 자동 리팩토링 워크플로는 팀의 생산성을 크게 향상시킵니다. 하지만 도구 선택, 워크플로 구성, 팀 적응 과정은 프로젝트마다 다릅니다.

혹시 Claude Code나 다른 AI 개발 도구를 활용한 자동화 솔루션을 개발하고 있다면, Vibeollio에 프로젝트를 등록해보세요. Vibeollio는 AI 기반 개발 도구와 워크플로를 소개하고, 실제 사용 사례를 공유하는 커뮤니티입니다. 당신의 프로젝트가 다른 개발 팀에게 영감을 줄 수 있습니다.