LLM 코딩 품질을 높이는 나의 agent.md
개발자 파비앙 상라르(Fabien Sanglard)가 LLM 기반 코딩 에이전트의 코드 품질 문제를 해결하기 위해 agent.md 파일에 코딩 스타일 규칙을 누적 기록하는 방법을 소개했습니다. 세션이 시작될 때 코딩 하네스가 agent.md를 프롬프트에 주입하므로, 매번 반복하던 피드백을 자동화할 수 있어 실무에서 LLM 활용 효율이 크게 향상됩니다.
LLM 코딩 품질을 높이기 위한 나의 agent.md 활용법
LLM으로 코딩을 가속화하려는 첫 시도는 2025년 중반이었다. 당시에는 인상적이지 않았다. 나는 당시 Rust로 작성된 mDNS 구현체인 libadbmdns를 개발하고 있었는데, LLM이 생성한 코드는 컴파일조차 되지 않았다.
2026년 1월에 LLM을 다시 시도했다. 이번에는 더 잘 작동했다. 복잡한 인덱스 기반 이진 힙(binary heap) 클래스를 작성했을 뿐만 아니라, Windows IOCP 구현 때문에 발생한 polling 크레이트의 잘 알려지지 않은 버그까지 정확히 찾아냈다. 하지만 코드 품질은 형편없었다. 주석도 없고 구조도 없는 스파게티 코드였다. 멋있긴 했지만, 속도 이득이 프로덕션 수준의 기준을 충족시키기 위해 코드를 정리하는 데 다 소모된다면 LLM과 함께 작업하는 것은 현실적이지 않았다.
반복적인 피드백의 지루함
2026년 3월, Antigravity나 VS Code의 Claude Code 플러그인 같은 에이전틱(agentic) IDE를 사용해보았다. 이제 '단계적으로 작성된(staged)' 코드를 반복(iterate)하며 개선할 수 있었다. 나는 무한히 인내심 많은 컴퓨터공학과 신입 사원의 코드를 리뷰하는 듯한 경험을 했다. "매직 넘버를 쓰지 마라", "여기에 짧은 주석을 달아 설명해라", "함수 이름을 짧게 써라" 같은 피드백을 주면서 말이다. 코드 품질은 극적으로 향상되었고, 내가 직접 작성했을 결과물과 매우 가까워졌다. 하지만 지루한 작업이었다. 새 세션을 시작할 때마다 같은 지적을 반복하게 되었다.
agent.md가 해결사로 등장하다
코딩 세션이 시작되면 코딩 하네스는 agent.md라는 파일을 로드해 프롬프트에 주입한다. 이것이 코딩 스타일 선호도를 세밀하게 튜닝하기에 완벽한 장소다. 코드 개선을 위해 같은 지적을 반복하게 될 때마다 그 내용을 이 파일에 추가했다. 필요하다면 시작점으로 삼을 수 있도록 내 버전의 agent.md를 공유한다. 프로젝트 루트에 배치하는 것만으로 충분하다. 또는 gemini.md/claude.md를 agent.md로 심볼릭 링크하면 어디서든 활성화할 수 있다.
FAB의 AGENT.MD
- 사람이 읽을 콘텐츠(주석, 커밋 메시지, 프롬프트 응답)를 작성할 때는 가능한 한 적은 단어를 사용하라. 볼륨을 최소한으로 줄이도록 모든 단어를 꼼꼼히 골라라. 핵심만 간결하게. 덜을수록 더다.
- 과장 표현과 칭찬을 피하라. 내가 절대적으로 옳다고 말하지 마라. 차갑고 냉정한 진실을 말하라.
- 반복되거나 의미 있는 값을 설명적인 상수(const)나 enum으로 추출해 매직 넘버와 매직 문자열을 피하라. 자명한 일회성 값은 코드를 어지럽히지 않도록 인라인으로 유지하라. 값이 스펙에서 온 것이라면(예: HTTP 200 OK) 일회성이어도 반드시 상수를 사용하라.
- 코드 들여쓰기를 줄여라. 화살표 안티패턴(Arrow Anti-Pattern)을 피하라. 조기 반환(early return)과 continue를 활용하라.
- 함수 이름을 짧게 유지하라. 30자 미만으로.
- 함수 매개변수에 불리언 대신 enum을 사용하라.
- 코드를 읽는 사람이 숨 쉴 공간을 줘라. 논리적 코드 블록 사이에 빈 줄을 추가하라.
- 해당 블록이 무엇을 하는지(what) 왜 하는지(why)를 설명하는 짧고 핵심적인 주석을 달아라. 가능하면 예시를 사용하라. 전체 시스템을 설명할 때는 ASCII 다이어그램을 제안하라.
- 멤버 접근성 변경을 파괴적인 설계 변화로 간주하라. 설계상 외부 접근이 반드시 필요한 경우가 아니면 모든 필드와 함수를 private으로 유지하라. 접근 제어자를 private에서 internal 또는 public으로 변경하기 전에는 사용자에게 명시적인 승인을 요청하라.
- 추상화 계층에 맞춰 프로그래밍하라. 저수준 메커니즘(예: 원시 하드웨어 I/O, 섹터 파싱, 직접 소켓 스트림)은 전용 드라이버/추상화 계층에 캡슐화해야 한다. 나머지 애플리케이션에는 깔끔한 고수준 API를 노출해 호출 코드가 원시 구현 세부사항이 아닌 도메인 개념으로 작업하게 하라.
- 구현하는 기능과 무관한 코드 블록은 건드리지 마라. 예를 들어 직접 만들거나 수정하지 않은 코드 블록에 주석을 추가하지 마라. 기능 구현 시 변경되는 줄 수를 최소화하도록 노력하라.
- 계층 경계 위계를 엄격히 준수하라: 각 계층은 바로 아래 인접 계층과만 직접 통신할 수 있다. 계층을 "뚫고" 내려가지 마라(예: 컨트롤러나 UI 컴포넌트가... [원문 여기서 잘림])