카테고리 없음

클로드(Claude) 란 무엇인가? 그리고 왜 클로드를 적용하는가?

쿠키담임선생님 2024. 11. 4. 20:03

 

 

클로드에 대해 아무것도 모르고 있다가, 친구랑 코드 리뷰에 대해 이야기하게 되었다.

 

그때 친구가 코드 리뷰 요즘은 깃에 올리면 클로드가 리뷰해준다고 해서.... 그런게 있다고??? 어떻게 그게 가능한지 궁금해져서 알아보기로 했다.

 

클로드란?


클로드란 일단 챗 지피티 같은 ai 라고 생각하면 된다. 하지만 chat GPT 보다 개발자에게 필요한 기능? 이 조금 더 추가된 느낌이다. 그래서 요즘 개발자들은 챗 지피티에서 클로드로 넘어간다고 한다. 나는 지피티를 유료 구독하는 입장에서 한번 클로드도 사용해보고싶다. 

 

그래서 이번 기회에 클로드 무료버전이 있다면 한번 적용해보고 코드 리뷰까지 받아보려고 한다.

 

 

적용 순서


  1. 명령어 입력.
  2. 그러면 코드베이스에서 변경 내용 감지, 해당 내용 클로드에게 전송.
  3. 클로드는 변경 내용을 감지, 일어날 수 있는 버그 가능성, 개선사항, 최적화 방안 등을 제안한다.
  4. 클로드의 피드백을 확인하고, 필요한 경우 코드 수정한다.

 

클로드는 hook으로 작동한다. 음 hook이 뭐냐면, 깃 action과 비슷하다고 생각하면 되는데 깃 액션은 웹 환경에서 작동, 훅은 내 로컬 환경에서 작동한다는 점이 다르다.

 

훅에는 여러 종류가 있다. 훅과 깃의 커밋 라이프 사이클에 대해 순서대로 설명하자면 다음과 같다.

 

가장 먼저 커밋을 호출한다!!! 그 뒤부터 아래 단계 따라감

  1. Pre-Commit Hook
    • 커밋 시 제일 먼저 실행되는 훅
    • 커밋 메세지 작성 전에 호출된다.
    • Exit code가 0이 아니면 커밋 취소
  2. Commit 생성
  3. Prepare-Commit-Msg
  4. 편집기 실행
  5. Commit-Msg
    • 최종적으로 커밋이 완료 되기 전
    • 0이 아닌 값을 반환하면 커밋x
  6. Commit 완료
  7. Post-commit
    • 커밋 완료 후
    • 최종적으로 커밋이 완료된 것을 누군가에게 또는 다른 프로그램에게 알리고 싶을 때 사용한다.

 

쉽게 말해서 깃에 코드를 올리게 되면 다시 되돌리기 어렵다. 그래서 로컬 환경에서 먼저 확인작업을 하고, 코드가 이상이 없다면 클로드를 통해 깃에 올리는 것이다.

 

우리는 Pre-Commit Hook을 통해 스크립트를 작성해서 클로드를 붙일 예정이다.

 

스크립트 작성 위치는

.git/hook/pre-commit.manual 을 생성한다.

 

.git 위치는 숨겨져 있다. 맥북 같은 경우는 shift + command + . 을 눌러서 이렇게 숨긴 폴더들을 볼 수 있다.

 

 

hooks 안에 들어가보면 이렇게 미리 다 sample이 정의되있는 것을 확인 할 수 있다.

 

 

스크립트


#!/bin/bash

# 프로젝트의 루트 디렉토리로 이동
cd "$(git rev-parse --show-toplevel)"

# .env.local 파일에서 환경 변수 로드
source ./.env.local

# 수정된 JAVA 관련된 파일들을 찾음
files=$(git diff --cached --name-only --diff-filter=ACM | grep ".java$")

for file in $files
do
    # 파일의 전체 내용을 가져옴
    full_content=$(cat "$file")
    
    # 변경된 내용만 가져옴
    changed_content=$(git diff --cached "$file" | grep '^[+-]' | grep -v '^[-+][-+][-+]' | sed 's/^[+-]//')
    
    if [ -n "$changed_content" ]; then
        # Claude API에 보낼 JSON 페이로드 생성
        json_payload=$(jq -n \
            --arg full_content "$full_content" \
            --arg changed_content "$changed_content" \
            --arg prompt "다음 JavaScript 파일의 전체 내용과 변경 사항을 검토해주세요. 변경 사항으로 인해 생길 수 있는 문제점과 개선 방안을 제안해주세요:" \
            '{ "model": "claude-3-5-sonnet-20241022", "max_tokens": 1024, "messages": [ {"role": "user", "content": ($prompt + "\n\n전체 파일 내용:\n" + $full_content + "\n\n변경된 내용:\n" + $changed_content)} ] }')

        # Claude API 호출
        if ! response=$(curl -s -w "\n%{http_code}" https://api.anthropic.com/v1/messages \
            -H "Content-Type: application/json" \
            -H "x-api-key: $CLAUDE_API_KEY" \
            -H "anthropic-version: 2023-06-01" \
            -d "$json_payload")
        then
            echo "에러: API 요청 실패"
            exit 1
        fi

        # HTTP 상태 코드와 응답 본문 분리
        http_code=$(echo "$response" | tail -n1)
        body=$(echo "$response" | sed '$d')

        if [ "$http_code" -ne 200 ]; then
            echo "에러: API가 상태 코드 $http_code를 반환했습니다"
            echo "$body"
            exit 1
        fi

        # JSON 응답에서 리뷰 내용 추출
        review_content=$(echo "$body" | jq -r '.content[0].text')
        echo "Claude의 $file 파일에 대한 리뷰:"
        echo "$review_content"

        # 사용자에게 커밋 진행 여부 확인
        read -p "커밋을 진행하시겠습니까? (y/n) " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 1
        fi
    else
        echo "에러: $file 파일의 내용이 비어있습니다"
        exit 1
    fi
done

exit 0