README 정비로 프로젝트 가독성과 유지보수성 개선
목차
문서 작업은 다들 대충 하고 넘어간다. 나도 오랫동안 그랬다. "나중에 정리하지 뭐" 하고 커밋하면, 그 나중이 안 온다. 이번에 README에 실제 repo URL조차 제대로 안 들어가 있다는 걸 발견하고 손을 봤는데, 고치면서 새삼 느낀 게 꽤 됐다.
README는 코드의 첫 인상이다. 저장소를 열었을 때 아무것도 없거나 템플릿 그대로 냅둔 README가 보이면 그 프로젝트의 품질을 의심하게 된다. 반대로 설치 방법 한 줄, 환경 변수 표 하나가 정리돼 있으면 "이 사람은 본인 코드를 관리하는 사람이구나"라는 신뢰가 생긴다. 그 신뢰는 PR 리뷰에서도, 팀원 온보딩에서도 조용히 작동한다.
README에 반드시 들어가야 할 것들
여러 프로젝트를 거치면서 최소한 이건 있어야 한다고 정착된 구조가 있다.
## 프로젝트 개요
어떤 문제를 해결하는지 1-2줄로
## 설치 방법
복붙 가능한 명령어 위주로
## 환경 변수
| 키 | 설명 | 필수 여부 |
## 아키텍처 다이어그램
있으면 100배 이해 빠름
프로젝트 개요는 두 줄을 못 넘기는 게 원칙이다. 거기서 무슨 문제를 푸는 도구인지 모르겠으면 그 아래를 읽어야 할 이유가 없다. 설치 방법은 설명 없이 명령어 블록만 있어도 된다. 복붙해서 실행해봤는데 에러가 안 나면 그게 최고의 문서다.
환경 변수 표는 빠트리면 진짜 나중에 고생한다. CI 서버에 올려놓고 왜 안 되나 한참 들여다보다가 .env.example이 없었다는 걸 깨달은 경험이 한두 번이 아니다. 필수/선택 여부까지 명시해두면 새로 합류한 사람이 쓸데없이 물어볼 일이 줄어든다.
아키텍처 다이어그램은 "있으면 좋다" 수준이 아니라, 서비스 간 통신이 조금이라도 엮이는 구조라면 사실상 필수다. 텍스트로 설명할 수 있는 아키텍처는 별로 없다. Mermaid는 GitHub README에서 바로 렌더링되니 별도 이미지 없이도 충분히 표현 가능하다.
graph TD
A[Client] --> B[API Gateway]
B --> C[Service A]
B --> D[Service B]
C --> E[(DB)]
D --> E
이 정도만 있어도 전체 흐름이 한눈에 들어온다.
한국어로 쓸지 영어로 쓸지
팀 내에서 가끔 나오는 주제다. 정답은 상황마다 다른데, 개인적으로는 아래 기준을 쓴다.
| 상황 | 선택 | 이유 |
|---|---|---|
| 내부 팀 전용 | 한국어 OK | 온보딩 속도가 중요 |
| 오픈소스 | 영어 필수 | 기여자가 어디서 올지 모름 |
| 포트폴리오 | 영어 권장 | 스택 검색 노출 효율 |
| 사내 도구 | 영어 권장 | 팀원 바뀌어도 검색 가능 |
한국어 README의 실질적인 단점은 검색이다. 코드 에러 메시지를 복붙해서 검색할 때 영어 문서가 훨씬 많이 걸린다. 팀 규모가 커지거나 나중에 외부 공개로 전환할 가능성이 조금이라도 있다면, 처음부터 영어로 쓰는 편이 나중에 마이그레이션 비용을 아낀다.
반대로, 온보딩 속도가 최우선이고 영어가 팀원들한테 오히려 장벽이 된다면 한국어가 맞다. 결국 문서의 목적은 읽히는 것이다. 안 읽히는 문서는 없는 것과 같다.
이 작업을 하면서 다시 확인한 것들
README 하나 손보는 데 생각보다 시간이 걸렸다. repo URL이 잘못 들어가 있었고, 설치 방법이 한참 전 버전 기준이었으며, 환경 변수 표에 실제로 사용하지 않는 키가 남아 있었다. 문서가 코드랑 따로 논다는 전형적인 증거다.
이번 작업을 계기로 재확인한 원칙 세 가지.
작은 커밋. README 수정도 하나의 단위 작업으로 커밋했다. 코드 변경이랑 섞으면 리뷰할 때 뭘 봐야 할지 흐릿해진다. 무조건 변경 단위를 잘게 쪼개는 게 리뷰와 롤백 모두에 유리하다.
문서 동기화. 코드가 바뀌는 PR에 문서 업데이트를 함께 요구하면 이 문제가 줄어든다. 강제성이 없으면 잘 안 되는데, PR 체크리스트에 "README 업데이트 필요 여부 확인" 하나만 넣어도 의식의 흐름이 달라진다.
명시적 코드. README도 결국 코드 철학의 연장이다. 함수명 하나 대충 짓고 주석 없이 넘어가는 습관이 쌓이면 README도 같은 방식으로 방치된다. 읽는 사람을 의식하는 태도는 코드든 문서든 동일하게 적용된다.
코드를 작성할 때 항상 떠올리는 질문들이 있다.
- 6개월 후에 내가 이걸 다시 봤을 때 의도가 파악되는가
- 나 말고 다른 사람이 컨텍스트 없이 이 코드를 보면 어떻게 느낄까
- 새벽에 장애가 났을 때 이 코드가 원인을 빠르게 찾게 해주는가
이 세 질문에 모두 "그렇다"고 답할 수 없으면 뭔가 더 손봐야 한다는 신호다.
| 좋은 코드의 기준 | 나쁜 코드의 신호 |
|---|---|
| 읽으면 의도가 바로 보임 | 주석 없으면 이해 불가 |
| 변경이 한 곳에만 영향 | 한 곳 바꾸면 여러 곳 수정 필요 |
| 테스트 작성이 자연스러움 | 테스트하려면 구조부터 바꿔야 함 |
| 함수명이 동작을 설명함 | 이름이 의미 없어 본문을 열어봐야 함 |
당장 티가 안 나는 작업이다. 이번 배포에 README가 잘 정리됐다고 기능이 더 빠르게 돌아가지는 않는다. 그런데 이런 작업들이 6개월, 1년 단위로 쌓이면 디버깅 시간이 체감 가능한 수준으로 줄어든다. 지금 10분 투자하면 나중에 1시간 아낀다는 말이 진부하게 들려도, 직접 경험하고 나면 맞는 말이라는 걸 인정하게 된다. README가 없는 repo는 6개월 뒤 내가 봐도 모른다. 작성 당시의 컨텍스트는 커밋 메시지 몇 줄로는 다 담기지 않는다.
댓글 0
첫 댓글 달아줘.