바이브 코딩 6개월, 불편한 것부터 하나씩

3 minute read

“불편한 걸 발견하면 자동화하는 게 패턴이 되었습니다.”

6개월 회고에서 이렇게 썼습니다. 거창한 계획 없이, 불편한 것부터 하나씩 만들었습니다. 이번 글에서는 그렇게 만든 도구들을 이야기하려고 합니다.

Claude Code를 6개월 사용하면서 가장 크게 바뀐 건, ‘만들까 말까’ 고민하던 것들을 이제는 고민 없이 바로 만든다는 점입니다.

하고 싶었던 것들

8년 전, EC2 접속과 Bastion 서버 접근 권한 관리를 쉘 스크립트로 자동화하려고 했습니다. 며칠을 고생했습니다. 그때 결심했죠.

“다시는 쉘로 하지 말자.”

Node나 Python이 훨씬 쉬우니까요. 물론 실제로 만들지는 않았습니다. 그럴 만한 계기가 없었거든요.

그런데 이번에 LLM을 쓰면서 다시 쉘 스크립트를 작성하게 됐습니다. AI한테 시키면 되니까요. 며칠 걸리던 게 몇 분이면 됩니다.

(당시 쉘 스크립트 - 마지막 업데이트가 2021년 10월이네요)


커밋 메시지 자동화

시작: 쉘 스크립트

Claude Code로 작업하다 보니, 작업이 끝날 때마다 커밋하라고 시키는 게 작업 흐름을 끊는 느낌이었습니다. 그렇다고 직접 커밋 메시지를 작성하는 건 번거로웠고요.

그래서 별도 터미널에서 커밋만 수행하는 스크립트를 만들었습니다.

./scripts/generate-commit-msg.sh

claude -p 옵션으로 diff를 보내고, JSON으로 메시지를 받아서, 사용자 확인 후 커밋하는 방식입니다.

잘 됐습니다. 문제는 그다음이었습니다.

문제: 배포가 번거로움

업무 프로젝트 워크트리가 3~4개, 개인 사이드 프로젝트가 4~5개. 합치면 10개 가까운 프로젝트에서 이 스크립트를 쓰고 있었습니다.

버그를 고치면 10개 프로젝트에 다시 복사해야 했습니다. 워크트리 프로젝트는 양쪽에서 수정하면 충돌이 생겼습니다.

배포 문제 외에 기능적인 한계도 있었습니다. diff가 50KB를 넘으면 잘렸습니다. 대규모 변경을 하면 메시지가 이상해졌죠. 그래서 v2를 만들었습니다. 파일 목록을 트리 형식으로 압축해서 정보 손실 없이 처리하는 방식입니다.

그런데 v2를 만들고 나니 또 10개 프로젝트에 복사해야 했습니다.

해결: Node.js CLI

결국 npm 패키지로 만들었습니다. npx로 실행하면 프로젝트마다 복사할 필요가 없으니까요.

npx genai-commit claude-code

그리고 하나 더. Claude Code 토큰이 아까웠습니다. 회사에서 Cursor 라이선스를 지원받고 있는데 잘 안 쓰고 있었거든요. 그래서 Cursor CLI도 지원하게 만들었습니다.

npx genai-commit cursor-cli

Jira 연동도 추가했습니다. 티켓 URL을 입력하면 해당 티켓의 이전 커밋들과 현재 변경 사항을 하나의 커밋으로 합쳐줍니다. 원래는 diff 크기에 따라 커밋을 여러 개로 나눴는데, 같은 티켓 작업이라면 하나로 묶는 게 더 깔끔하니까요.

한 가지 원칙은 지켰습니다. 메시지 출력 후 사용자가 y를 입력해야 커밋됩니다. 그리고 절대 push하지 않습니다.

(genai-commit GitHub)


린팅 자동화

SonarLint 도입을 고려하면서 만든 도구입니다.

처음에는 모든 룰을 한 번에 처리하려고 했습니다. 근데 문제가 생겼습니다. 첫 번째 수정을 적용하면 라인 번호가 바뀝니다. 그러면 두 번째 수정이 엉뚱한 곳에 적용됩니다.

그래서 한 룰씩 처리하는 방식으로 바꿨습니다. 수정 적용 → ESLint 재실행 → 다음 룰 선택. 매번 새로운 라인 번호로 분석합니다.

npx genai-sonar-lint analyze src/

역할을 나눴습니다:

  • 사람: 어떤 룰을, 어떻게 처리할지 결정 (수정/비활성화/무시)
  • 스크립트: ESLint 실행, 결과 수집, 수정 적용
  • LLM: 수정 코드 생성

수정만 있는 게 아닙니다. 룰 비활성화나 eslint-disable 코멘트 추가도 지원합니다. 모든 이슈를 AI로 수정할 필요는 없으니까요. 어떤 건 그냥 무시하는 게 맞을 때도 있습니다.

(genai-sonar-lint GitHub)


세션 관리: Trello 스킬

저는 Claude Code 터미널을 여러 개 열어놓고 작업합니다. 업무 프로젝트 몇 개, 개인 프로젝트 몇 개. 동시에 진행하다 보면 어떤 세션에서 뭘 했는지 헷갈립니다.

그래서 Trello와 연동하는 Claude Code 스킬(커스텀 슬래시 명령어)을 만들었습니다.

/trello 생성    → 새 카드 생성 (대화 분석 후 자동 요약)
/trello 기록    → 작업 내용을 코멘트로 추가
/trello 완료    → 상태 변경

세션을 시작하면 카드를 만들고, 작업 중간중간 기록하고, 끝나면 완료 처리합니다. 나중에 “저번에 뭐 했더라?” 할 때 카드를 보면 됩니다.


티켓 관리: Jira 스킬

회사에서 Jira를 씁니다. 티켓 생성하고 관리하는 데 시간이 꽤 듭니다. 비효율적이라고 느낄 때도 있습니다.

하지만 회사에서 정량 평가 지표로 쓰고 있고, 업무 프로세스를 체계화하려는 시도이기도 합니다. 무조건 반발심만 가지는 건 안 된다고 생각했습니다.

그래서 주어진 환경 내에서 자동화하기로 했습니다.

/jira              → 현재 브랜치 티켓 조회
/jira 목록         → 내 담당 티켓
/jira 상태 진행중   → 상태 변경
/jira 코멘트 "내용" → 코멘트 추가

자연어로도 됩니다. “내 담당 티켓 보여줘”, “이거 완료로 바꿔줘” 같은 식으로요.

여기서 생각해볼 점이 있습니다. 상태 변경, 코멘트 추가, 목록 조회 같은 건 스크립트로 다 됩니다. AI가 없어도 가능한 영역입니다.

AI로 추가로 자동화할 수 있는 건 뭘까요? 생성형 텍스트입니다. 티켓 내용 작성, 코멘트 요약, 커밋 메시지 생성 같은 것들이요.

이 구분이 명확해지니까 어디에 AI를 쓰고 어디에 스크립트를 쓸지 결정하기 쉬워졌습니다.


뭐가 달라졌나

예전에는 스크립트로 가능한 것만 자동화했습니다. 상태 변경, 파일 처리, API 호출 같은 것들이요.

지금은 생성형 텍스트도 자동화 대상입니다. 커밋 메시지, 티켓 내용, 코드 수정. 예전 같으면 “이건 사람이 해야지”라고 넘겼을 것들입니다.

그리고 이런 도구 자체를 AI로 빠르게 만들 수 있다는 게 큽니다. 아이디어에서 구현까지 거리가 짧아졌습니다.


마무리

6개월 회고에서 “불편하면 자동화한다”고 했는데, 실제로 만든 것들입니다. 커밋 메시지 자동 생성(genai-commit), 린팅 자동화(genai-sonar-lint), 다중 세션 관리(Trello 스킬), 티켓 관리 자동화(Jira 스킬).

다음 글에서는 화면 기획을 위한 DSL, Wireweave 이야기를 다룰 예정입니다.