- Published on
개발자를 위한 테크니컬 라이팅 가이드: RFC, ADR, 기술 블로그, API 문서 작성법
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 들어가며
- 1. 왜 개발자에게 글쓰기가 중요한가
- 2. RFC (Request for Comments)
- 3. ADR (Architecture Decision Records)
- 4. API 문서 (OpenAPI / Swagger)
- 5. README 작성법
- 6. CHANGELOG 작성법
- 7. 기술 블로그 작성법
- 8. 다이어그래밍 (Diagramming)
- 9. Docs-as-Code
- 10. 문서화 문화 사례
- 실전 퀴즈
- 도구 모음
- 참고 자료
들어가며
"코드는 개발자가 컴퓨터에게 하는 말이고, 문서는 개발자가 다른 개발자에게 하는 말이다."
소프트웨어 엔지니어에게 글쓰기 능력이 왜 중요할까요? 코드를 잘 짜는 것만으로는 부족합니다. 설계 결정을 설명하고, API를 문서화하고, RFC를 작성하여 팀의 합의를 이끌어내는 능력이 시니어 엔지니어와 주니어 엔지니어를 구분짓는 핵심 역량입니다.
Stripe, GitLab, Netflix 같은 기업들이 "문서화 문화"를 핵심 가치로 삼는 이유가 있습니다. 좋은 문서는 온보딩 시간을 단축하고, 의사결정을 투명하게 만들며, 조직의 지식을 보존합니다.
이 가이드에서는 개발자가 알아야 할 모든 유형의 기술 문서 작성법을 다룹니다.
1. 왜 개발자에게 글쓰기가 중요한가
1.1 글쓰기가 만드는 차이
| 상황 | 글쓰기 능력 없이 | 글쓰기 능력으로 |
|---|---|---|
| 설계 리뷰 | 구두 설명, 기억에 의존 | RFC 문서로 비동기 리뷰 |
| 아키텍처 변경 | "왜 이렇게 했지?" 반복 | ADR로 맥락 보존 |
| 신규 입사자 온보딩 | 구전으로 전해지는 부족 지식 | README + 아키텍처 문서 |
| 외부 API 제공 | "이거 어떻게 쓰는 거예요?" 반복 질문 | OpenAPI + 예제 코드 |
| 기술 블로그 | 팀 외부에 알려지지 않음 | 브랜딩 + 채용 효과 |
1.2 좋은 기술 문서의 4가지 원칙
- 정확성 (Accuracy): 코드와 문서가 일치해야 한다
- 간결성 (Conciseness): 불필요한 내용을 제거한다
- 구조화 (Structure): 스캔하기 쉽게 제목, 목록, 표를 활용한다
- 독자 중심 (Reader-Focused): 독자가 누구인지 먼저 파악한다
1.3 독자 분석 프레임워크
문서를 작성하기 전에 반드시 독자를 정의하세요:
독자 분석 체크리스트:
- 독자의 기술 수준은? (주니어/시니어/비개발자)
- 독자가 이미 아는 것은 무엇인가?
- 독자가 이 문서를 읽고 할 수 있어야 하는 것은?
- 독자가 이 문서를 어떤 상황에서 읽는가? (학습/참조/문제해결)
2. RFC (Request for Comments)
2.1 RFC란?
RFC는 기술적 제안을 문서화하여 팀원들의 피드백을 받고, 합의를 도출하는 프로세스입니다. Google, Meta, Uber 등 대부분의 빅테크 기업에서 사용합니다.
RFC를 써야 하는 경우:
- 새로운 시스템이나 서비스 도입
- 기존 아키텍처의 대규모 변경
- 팀 간 영향을 미치는 기술 결정
- 새로운 표준이나 프로세스 도입
2.2 RFC 템플릿
# RFC-001: 사용자 알림 시스템 재설계
## 메타데이터
- 작성자: 홍길동
- 상태: Draft / In Review / Accepted / Rejected / Superseded
- 작성일: 2025-03-15
- 리뷰어: 김철수, 이영희, 박지민
- 관련 RFC: RFC-042 (이벤트 시스템)
## 요약 (Summary)
현재 폴링 기반 알림 시스템을 WebSocket 기반 실시간 알림 시스템으로
교체하여 지연 시간을 30초에서 1초 이내로 단축합니다.
## 동기 (Motivation)
- 현재 시스템은 30초마다 폴링하여 알림을 확인 (높은 지연)
- 폴링으로 인한 불필요한 API 호출이 전체 트래픽의 15% 차지
- 사용자 만족도 조사에서 "알림이 느리다" 불만 42%
## 제안 (Proposal)
### 기술 설계
WebSocket 서버를 도입하고, 이벤트 기반 알림 파이프라인을 구축합니다.
### 대안 검토 (Alternatives Considered)
1. SSE (Server-Sent Events): 단방향만 가능, 양방향 통신 불가
2. 폴링 간격 축소 (5초): 서버 부하 6배 증가
3. Long Polling: 커넥션 관리 복잡도 증가
### 마이그레이션 전략
1. Phase 1: WebSocket 서버 구축 및 내부 테스트 (2주)
2. Phase 2: 10% 카나리 배포 (1주)
3. Phase 3: 전체 배포 및 폴링 제거 (1주)
## 리스크 및 우려 사항
- WebSocket 연결 유지 비용
- 방화벽/프록시 환경에서의 WebSocket 제한
- 모바일 환경에서의 배터리 소모
## 오픈 질문 (Open Questions)
- Redis Pub/Sub vs Kafka를 메시지 브로커로 사용할지?
- 오프라인 사용자 알림 큐잉 전략은?
## 참고 자료
- Slack의 실시간 메시징 아키텍처
- Discord의 WebSocket 구현 사례
2.3 RFC 프로세스 플로우
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Draft │ -> │ In Review│ -> │ Decision │ -> │ Accepted │
│ (작성) │ │ (리뷰) │ │ (회의) │ │ (승인) │
└─────────┘ └──────────┘ └──────────┘ └──────────┘
│ │
v v
┌──────────┐ ┌───────────┐
│ Revision │ │ Superseded│
│ (수정) │ │ (대체됨) │
└──────────┘ └───────────┘
2.4 RFC 리뷰 체크리스트
## RFC 리뷰 포인트
- [ ] 문제가 명확하게 정의되었는가?
- [ ] 제안이 문제를 실제로 해결하는가?
- [ ] 대안이 충분히 검토되었는가?
- [ ] 마이그레이션 전략이 현실적인가?
- [ ] 리스크가 식별되고 완화 방안이 있는가?
- [ ] 성공/실패 측정 기준이 있는가?
- [ ] 롤백 계획이 있는가?
3. ADR (Architecture Decision Records)
3.1 ADR이란?
ADR은 아키텍처 의사결정의 맥락, 이유, 결과를 기록하는 짧은 문서입니다. Michael Nygard가 제안한 형식이 가장 널리 사용됩니다.
RFC와의 차이: RFC는 "제안과 토론"이고, ADR은 "결정 기록"입니다.
3.2 ADR 템플릿 (Michael Nygard 형식)
# ADR-007: PostgreSQL을 주 데이터베이스로 선택
## 상태 (Status)
Accepted (2025-02-20)
## 맥락 (Context)
새 프로젝트의 주 데이터베이스를 선택해야 합니다. 주요 요구사항:
- ACID 트랜잭션 지원
- JSON 데이터 타입 네이티브 지원
- 전문 검색(Full-text search) 기능
- 팀의 기존 경험 활용
후보: PostgreSQL, MySQL 8.0, MongoDB, CockroachDB
## 결정 (Decision)
PostgreSQL 16을 주 데이터베이스로 사용합니다.
이유:
1. JSONB 타입으로 반정형 데이터를 효율적으로 처리 가능
2. pg_trgm, ts_vector로 전문 검색 가능 (별도 Elasticsearch 불필요)
3. 팀원 5명 중 4명이 PostgreSQL 경험 보유
4. MVCC 기반 동시성 제어가 우리 워크로드에 적합
## 결과 (Consequences)
긍정적:
- 단일 데이터베이스로 관계형 + JSON + 검색 처리
- 운영 복잡도 감소 (Elasticsearch 불필요)
- 팀 학습 비용 최소화
부정적:
- 수평 확장(horizontal scaling)이 MySQL보다 복잡
- Write-heavy 워크로드에서 MVCC 오버헤드 가능성
- Citus 등 확장 시 추가 비용 발생
## 대체 검토 (Alternatives)
- MySQL 8.0: JSON 지원이 PostgreSQL JSONB보다 제한적
- MongoDB: ACID 트랜잭션 지원이 4.0부터이나, 복잡한 조인 불가
- CockroachDB: 분산 SQL이나 팀 경험 부족, 운영 비용 높음
3.3 ADR 디렉토리 구조
docs/
└── adr/
├── 0001-use-react-for-frontend.md
├── 0002-adopt-typescript.md
├── 0003-choose-postgresql.md
├── 0004-implement-event-sourcing.md
├── 0005-migrate-to-kubernetes.md
├── 0006-adopt-graphql.md # Status: Superseded by 0010
├── 0007-choose-postgresql.md
├── 0008-use-redis-for-caching.md
├── 0009-adopt-trunk-based-dev.md
├── 0010-rest-api-over-graphql.md # Supersedes 0006
└── template.md
3.4 ADR 자동화 도구
# adr-tools 설치 및 사용
brew install adr-tools
# 새 ADR 생성
adr new "Use React for Frontend"
# -> docs/adr/0001-use-react-for-frontend.md 생성
# ADR 대체
adr new -s 6 "REST API over GraphQL"
# -> 0006의 상태를 Superseded로 변경
# 목차 생성
adr generate toc
4. API 문서 (OpenAPI / Swagger)
4.1 OpenAPI 3.1 명세 작성
openapi: 3.1.0
info:
title: User Management API
description: 사용자 관리를 위한 RESTful API
version: 2.1.0
contact:
name: Platform Team
email: platform@example.com
servers:
- url: https://api.example.com/v2
description: Production
- url: https://staging-api.example.com/v2
description: Staging
paths:
/users:
get:
summary: List all users
description: |
페이지네이션을 지원하는 사용자 목록 조회 API입니다.
기본적으로 활성(active) 사용자만 반환합니다.
operationId: listUsers
tags:
- Users
parameters:
- name: page
in: query
description: 페이지 번호 (1부터 시작)
schema:
type: integer
minimum: 1
default: 1
- name: limit
in: query
description: 페이지당 항목 수
schema:
type: integer
minimum: 1
maximum: 100
default: 20
- name: status
in: query
description: 사용자 상태 필터
schema:
type: string
enum: [active, inactive, suspended]
default: active
responses:
'200':
description: 성공
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/User'
pagination:
$ref: '#/components/schemas/Pagination'
example:
data:
- id: "usr_abc123"
name: "Alice Kim"
email: "alice@example.com"
role: "admin"
createdAt: "2025-01-15T09:00:00Z"
pagination:
page: 1
limit: 20
totalItems: 150
totalPages: 8
'401':
description: 인증 실패
'429':
description: 요청 제한 초과
post:
summary: Create a new user
operationId: createUser
tags:
- Users
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUserRequest'
example:
name: "Bob Lee"
email: "bob@example.com"
role: "member"
responses:
'201':
description: 사용자 생성 성공
'400':
description: 유효성 검증 실패
'409':
description: 이메일 중복
components:
schemas:
User:
type: object
required: [id, name, email, role, createdAt]
properties:
id:
type: string
description: 사용자 고유 ID (usr_ 접두사)
example: "usr_abc123"
name:
type: string
description: 사용자 이름
example: "Alice Kim"
email:
type: string
format: email
description: 이메일 주소
role:
type: string
enum: [admin, member, viewer]
createdAt:
type: string
format: date-time
CreateUserRequest:
type: object
required: [name, email, role]
properties:
name:
type: string
minLength: 1
maxLength: 100
email:
type: string
format: email
role:
type: string
enum: [admin, member, viewer]
Pagination:
type: object
properties:
page:
type: integer
limit:
type: integer
totalItems:
type: integer
totalPages:
type: integer
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- BearerAuth: []
4.2 API 문서 도구 비교
| 도구 | 특징 | 추천 상황 |
|---|---|---|
| Swagger UI | OpenAPI 렌더링, 인터랙티브 테스트 | 빠른 시작 |
| Redoc | 깔끔한 3-panel 레이아웃 | 외부 공개 API |
| Stoplight | 비주얼 편집, 목 서버 | 디자인 퍼스트 |
| Mintlify | MDX 기반, 예쁜 UI | 스타트업/오픈소스 |
| ReadMe | 대시보드, 분석 | 엔터프라이즈 |
4.3 좋은 API 문서의 체크리스트
## API 문서 품질 체크리스트
- [ ] 모든 엔드포인트에 설명이 있는가?
- [ ] 요청/응답 예제가 있는가?
- [ ] 에러 응답과 에러 코드가 문서화되었는가?
- [ ] 인증 방법이 명시되었는가?
- [ ] Rate limit 정보가 포함되었는가?
- [ ] 페이지네이션 방법이 설명되었는가?
- [ ] SDK/코드 예제가 제공되는가?
- [ ] 변경 이력(changelog)이 관리되고 있는가?
5. README 작성법
5.1 README 구조 템플릿
# 프로젝트 이름
간결한 한 줄 설명: 이 프로젝트가 무엇이고 왜 사용하는지



## 주요 기능 (Features)
- 기능 1: 간결한 설명
- 기능 2: 간결한 설명
- 기능 3: 간결한 설명
## 빠른 시작 (Quick Start)
설치부터 첫 실행까지 3단계 이내로 설명합니다.
## 설치 (Installation)
다양한 설치 방법을 운영체제별로 안내합니다.
## 사용법 (Usage)
가장 일반적인 사용 예제를 코드와 함께 제공합니다.
## 설정 (Configuration)
환경 변수, 설정 파일 등을 표로 정리합니다.
## API 참조 (API Reference)
주요 API의 사용법을 간략히 안내합니다.
## 기여 방법 (Contributing)
PR 프로세스, 코드 스타일, 테스트 요구사항을 설명합니다.
## 라이선스 (License)
MIT, Apache 2.0 등 라이선스를 명시합니다.
5.2 README 작성 팁
첫 30초 규칙: 개발자가 README를 열었을 때 30초 이내에 "이 프로젝트가 나에게 필요한가?"를 판단할 수 있어야 합니다.
Bad README:
# my-project
Install and run.
Good README:
# FastCache
Redis 호환 인메모리 캐시 서버. Go로 작성되어 Redis 대비 40% 낮은 메모리 사용량.
## 왜 FastCache인가?
- Redis 프로토콜 100% 호환 — 기존 클라이언트 그대로 사용
- 메모리 사용량 40% 절감 (벤치마크 결과 포함)
- 단일 바이너리, 제로 디펜던시
## 30초 시작
(3줄의 설치/실행 코드)
6. CHANGELOG 작성법
6.1 Keep a Changelog 형식
# Changelog
이 프로젝트의 모든 주요 변경사항을 기록합니다.
[Keep a Changelog](https://keepachangelog.com/) 형식을 따릅니다.
## [Unreleased]
### Added
- 다크 모드 지원 (#234)
- 사용자 프로필 이미지 업로드 기능 (#256)
### Changed
- 로그인 페이지 UI를 새 디자인 시스템으로 마이그레이션 (#278)
## [2.1.0] - 2025-03-01
### Added
- WebSocket 기반 실시간 알림 시스템 (#189)
- 관리자 대시보드 분석 차트 (#201)
- API 요청 제한(rate limiting) 기능 (#215)
### Changed
- JWT 토큰 만료 시간을 24시간에서 12시간으로 변경
- 데이터베이스 커넥션 풀 크기를 10에서 20으로 증가
### Fixed
- 동시 로그인 시 세션 충돌 버그 수정 (#220)
- 프로필 수정 시 이메일 검증 우회 가능한 보안 취약점 수정 (#225)
### Deprecated
- /api/v1 엔드포인트 (v3.0에서 제거 예정)
### Removed
- Legacy XML 응답 형식 지원 제거
### Security
- 의존성 업데이트: lodash 4.17.21 (CVE-2021-23337)
## [2.0.0] - 2025-01-15
### Breaking Changes
- 인증 방식이 API Key에서 JWT로 변경
- 응답 형식 변경: snake_case에서 camelCase로 통일
6.2 Semantic Versioning (SemVer)
MAJOR.MINOR.PATCH
MAJOR: 호환되지 않는 API 변경 (Breaking Change)
MINOR: 이전 버전과 호환되는 새 기능 추가
PATCH: 이전 버전과 호환되는 버그 수정
예시:
1.0.0 -> 1.0.1 (버그 수정)
1.0.1 -> 1.1.0 (새 기능 추가)
1.1.0 -> 2.0.0 (Breaking Change)
6.3 CHANGELOG 자동화
# conventional-changelog 사용
npx conventional-changelog -p angular -i CHANGELOG.md -s
# standard-version 사용
npx standard-version
# release-please (GitHub Action)
# .github/workflows/release.yml
# .github/workflows/release.yml
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v4
with:
release-type: node
7. 기술 블로그 작성법
7.1 기술 블로그 글의 구조
1. 제목 (Title)
- 구체적이고 검색 가능한 키워드 포함
- Bad: "내가 배운 것들"
- Good: "PostgreSQL에서 100만 행 쿼리를 2초에서 50ms로 최적화한 방법"
2. 도입부 (Introduction)
- 문제 정의: 독자가 공감할 수 있는 상황
- 결과 미리보기: "이 글을 읽으면 X를 할 수 있습니다"
3. 본문 (Body)
- 문제 -> 시도 -> 실패 -> 해결의 스토리 구조
- 코드 예제는 실행 가능한 형태로
- 다이어그램으로 복잡한 개념 시각화
4. 결론 (Conclusion)
- 핵심 교훈 요약 (3줄 이내)
- 다음 단계 제안
5. 참고 자료 (References)
7.2 기술 블로그 SEO
## SEO 체크리스트
- [ ] 제목에 핵심 키워드 포함 (50~60자)
- [ ] 메타 설명(description) 작성 (150~160자)
- [ ] H2/H3 헤딩에 관련 키워드 포함
- [ ] 이미지에 alt 태그 추가
- [ ] 내부/외부 링크 포함
- [ ] URL이 깔끔하고 키워드 포함
- [ ] 코드 블록에 syntax highlighting 적용
7.3 기술 블로그 글쓰기 팁
스토리 구조 활용:
"우리 팀은 매일 3시에 서버가 다운되는 문제를 겪었다." (문제)
"처음에는 메모리 누수라고 생각했다." (가설)
"하지만 프로파일링 결과, 문제는 GC가 아니라 커넥션 풀 고갈이었다." (발견)
"커넥션 풀 설정을 변경하고 모니터링을 추가한 결과..." (해결)
"이 경험에서 배운 3가지 교훈:" (교훈)
8. 다이어그래밍 (Diagramming)
8.1 Mermaid
Markdown 안에서 다이어그램을 작성할 수 있는 텍스트 기반 도구입니다. GitHub, GitLab, Notion 등에서 네이티브 지원합니다.
시퀀스 다이어그램:
sequenceDiagram
participant Client
participant API Gateway
participant Auth Service
participant User Service
participant Database
Client->>API Gateway: POST /login
API Gateway->>Auth Service: Validate credentials
Auth Service->>Database: Query user
Database-->>Auth Service: User data
Auth Service-->>API Gateway: JWT token
API Gateway-->>Client: 200 OK + token
아키텍처 다이어그램:
graph TD
A[Client] --> B[Load Balancer]
B --> C[API Server 1]
B --> D[API Server 2]
C --> E[Redis Cache]
D --> E
C --> F[PostgreSQL Primary]
D --> F
F --> G[PostgreSQL Replica]
C --> H[Message Queue]
D --> H
H --> I[Worker 1]
H --> J[Worker 2]
상태 다이어그램:
stateDiagram-v2
[*] --> Draft
Draft --> InReview: Submit for review
InReview --> Approved: All reviewers approve
InReview --> Draft: Changes requested
Approved --> Published: Deploy
Published --> Archived: Deprecate
Archived --> [*]
8.2 PlantUML
더 복잡한 다이어그램에 적합한 도구입니다.
@startuml
!theme plain
package "Frontend" {
[React App] as react
[Next.js SSR] as nextjs
}
package "Backend" {
[API Gateway] as gateway
[User Service] as user
[Order Service] as order
[Notification Service] as notif
}
package "Data" {
database "PostgreSQL" as pg
database "Redis" as redis
queue "Kafka" as kafka
}
react --> gateway
nextjs --> gateway
gateway --> user
gateway --> order
user --> pg
order --> pg
user --> redis
order --> kafka
kafka --> notif
@enduml
8.3 다이어그램 도구 비교
| 도구 | 유형 | 장점 | 단점 |
|---|---|---|---|
| Mermaid | 텍스트 기반 | Git 친화적, 마크다운 통합 | 복잡한 레이아웃 제한 |
| PlantUML | 텍스트 기반 | 풍부한 다이어그램 유형 | 자바 런타임 필요 |
| D2 | 텍스트 기반 | 모던한 문법, 깔끔한 출력 | 아직 생태계 작음 |
| Excalidraw | 비주얼 | 손그림 스타일, 직관적 | Git diff 불가 |
| draw.io | 비주얼 | 무료, 풍부한 템플릿 | XML 기반으로 diff 어려움 |
8.4 다이어그램 작성 원칙
- 적절한 추상화 수준: 모든 세부사항을 포함하지 말고, 전달하려는 핵심만
- 일관된 방향성: 데이터 흐름은 왼쪽에서 오른쪽, 또는 위에서 아래로
- 레이블 활용: 화살표에 설명을 달아 관계를 명확히
- 색상 절제: 최대 3~4가지 색상만 사용
- 범례 포함: 기호와 색상의 의미를 설명
9. Docs-as-Code
9.1 Docs-as-Code란?
문서를 코드처럼 관리하는 방법론입니다:
- 버전 관리: Git으로 문서 이력 추적
- PR 리뷰: 문서 변경도 코드 리뷰처럼
- CI/CD: 문서 빌드 및 배포 자동화
- 린팅: 문법, 스타일 자동 검사
9.2 Docs-as-Code 도구 비교
| 도구 | 특징 | 추천 상황 |
|---|---|---|
| Docusaurus | React 기반, MDX, 버전관리 | 오픈소스 프로젝트 |
| MkDocs (Material) | Python 기반, 깔끔한 UI | 내부 문서 |
| Mintlify | AI 기반, 예쁜 기본 테마 | API 문서, 스타트업 |
| GitBook | WYSIWYG, 협업 | 비개발자 포함 |
| Astro Starlight | Astro 기반, 빠른 성능 | 성능 중시 |
9.3 문서 린팅 (Linting)
# .github/workflows/docs-lint.yml
name: Docs Lint
on: [pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: markdownlint
uses: DavidAnson/markdownlint-cli2-action@v18
with:
globs: 'docs/**/*.md'
- name: vale (prose linter)
uses: errata-ai/vale-action@v2
with:
files: docs/
vale_flags: "--config=.vale.ini"
Vale 설정 예시:
# .vale.ini
StylesPath = .vale/styles
MinAlertLevel = suggestion
[*.md]
BasedOnStyles = Vale, Google
Google.Passive = warning
Google.We = warning
Google.Will = error
Vale.Terms = error
9.4 문서 자동 생성
// TypeDoc으로 TypeScript API 문서 자동 생성
// tsconfig.json에 아래 추가:
// "plugins": [{ "name": "typedoc" }]
/**
* 사용자 서비스
*
* @remarks
* 사용자 CRUD 작업을 처리합니다.
*
* @example
* ```typescript
* const service = new UserService(repository);
* const user = await service.getUser('usr_123');
* ```
*/
export class UserService {
/** 사용자 조회 */
async getUser(id: string): Promise<User> {
// ...
}
}
10. 문서화 문화 사례
10.1 Stripe
- 모든 것을 문서화: 설계 결정, 장애 보고서, 온보딩 가이드
- Writing Culture: 글쓰기가 승진 기준에 포함
- API 문서: 업계 최고 수준의 API 문서 (대화형 예제, 다국어 SDK)
10.2 GitLab
- Handbook-First: 모든 프로세스를 핸드북에 먼저 문서화
- 퍼블릭 핸드북: 2,000페이지 이상의 오픈 핸드북
- 모든 커뮤니케이션을 문서화: 미팅 노트, 의사결정 로그 전부 공개
10.3 Netflix
- RFC 문화: 기술 결정에 RFC 프로세스 필수
- Postmortem: 장애 후 상세한 사후 분석 문서 작성
- Paved Road: 권장 기술 스택과 패턴을 문서화
10.4 Amazon
- 6페이지 메모: 파워포인트 대신 6페이지 내러티브 문서
- PR/FAQ 문서: 새 제품/기능은 보도자료 형식으로 제안
- 역방향 작업(Working Backwards): 고객 관점에서 문서 시작
10.5 문서화 문화 도입 단계
1단계: README 표준화 (1~2주)
- 모든 저장소에 README 템플릿 적용
- PR 체크리스트에 "문서 업데이트" 항목 추가
2단계: ADR 도입 (2~4주)
- ADR 템플릿 및 디렉토리 구조 설정
- 주요 아키텍처 결정에 ADR 작성 의무화
3단계: RFC 프로세스 도입 (1~2개월)
- RFC 템플릿 및 리뷰 프로세스 수립
- 영향도 높은 변경에 RFC 필수
4단계: Docs-as-Code (2~3개월)
- 문서 사이트 구축 (Docusaurus/MkDocs)
- CI/CD 파이프라인에 문서 빌드/배포 통합
- 린팅(markdownlint, Vale) 자동화
5단계: 문화 정착 (지속)
- 좋은 문서에 대한 인정과 보상
- 글쓰기 워크숍 정기 진행
- 신입 온보딩에 문서 작성 연습 포함
실전 퀴즈
퀴즈 1: 이 RFC의 문제점을 찾으세요.
# RFC: 새 시스템
## 요약
새 시스템을 만들 겁니다.
## 제안
Redis를 사용합니다.
## 결론
이게 좋습니다.
문제점:
- 동기 부재: 왜 새 시스템이 필요한지 설명이 없다
- 대안 검토 없음: Redis만 언급하고 다른 대안을 비교하지 않았다
- 구체적인 설계 없음: "무엇"은 있지만 "어떻게"가 없다
- 리스크 분석 없음: 어떤 위험이 있는지, 완화 방안은 무엇인지
- 성공 기준 없음: 어떤 지표로 성공을 측정할 것인지
- 마이그레이션 전략 없음: 어떻게 전환할 것인지
- 메타데이터 없음: 작성자, 리뷰어, 상태 정보 없음
퀴즈 2: 이 API 엔드포인트 문서를 개선하세요.
## GET /users
사용자를 가져옵니다.
개선안:
## GET /users
사용자 목록을 페이지네이션으로 조회합니다. 기본적으로 활성(active)
사용자만 반환합니다.
### 파라미터
| 이름 | 위치 | 타입 | 필수 | 설명 | 기본값 |
|------|------|------|------|------|--------|
| page | query | integer | No | 페이지 번호 (1부터) | 1 |
| limit | query | integer | No | 페이지당 항목 수 (1-100) | 20 |
| status | query | string | No | 상태 필터 (active/inactive/suspended) | active |
### 응답 예시
**200 OK**
(JSON 응답 예시 포함)
### 에러 응답
| 상태 코드 | 설명 | 해결 방법 |
|-----------|------|----------|
| 401 | 인증 토큰이 없거나 만료됨 | Authorization 헤더에 유효한 토큰 포함 |
| 429 | 요청 제한 초과 (100req/min) | Retry-After 헤더 참조 후 재시도 |
퀴즈 3: 이 ADR에서 빠진 항목을 찾으세요.
# ADR-003: MongoDB 사용
## 결정
MongoDB를 사용합니다.
빠진 항목:
- 상태(Status): Proposed/Accepted/Deprecated 등
- 맥락(Context): 어떤 문제를 해결하기 위한 결정인지
- 결과(Consequences): 긍정적/부정적 영향
- 대안 검토(Alternatives): 왜 다른 옵션이 아닌 MongoDB인지
- 날짜: 언제 결정했는지
- 이유: 왜 MongoDB를 선택했는지 구체적 근거
퀴즈 4: README의 첫 30초 규칙을 적용해보세요.
다음 README를 30초 이내에 판단할 수 있도록 개선하세요:
# project-x
Node.js 프로젝트입니다.
개선안:
# ProjectX - 실시간 협업 화이트보드
브라우저 기반 실시간 화이트보드 도구. WebSocket으로 최대 50명이
동시에 드로잉/노트/다이어그램 작업 가능.
주요 기능:
- 실시간 멀티플레이어 편집 (50명 동시 접속)
- 무한 캔버스 + 벡터 기반 렌더링
- Slack/Notion 연동
기술 스택: Next.js, WebSocket, Canvas API, PostgreSQL
빠른 시작:
(3줄의 설치/실행 코드)
퀴즈 5: Mermaid로 다음 아키텍처를 다이어그램으로 표현하세요.
"클라이언트가 API 게이트웨이를 통해 인증 서비스와 상품 서비스에 접근하고, 두 서비스는 각각 별도의 데이터베이스를 사용한다."
정답:
graph TD
A[Client] --> B[API Gateway]
B --> C[Auth Service]
B --> D[Product Service]
C --> E[(Auth DB)]
D --> F[(Product DB)]
- 각 서비스의 경계가 명확하다
- 데이터베이스가 서비스별로 분리되어 있다 (Database per Service 패턴)
- API Gateway가 단일 진입점 역할을 한다
도구 모음
문서 작성 도구
| 카테고리 | 도구 | 용도 |
|---|---|---|
| API 문서 | Swagger/Redoc/Stoplight | OpenAPI 렌더링 |
| 문서 사이트 | Docusaurus/MkDocs/Mintlify | 기술 문서 사이트 |
| 다이어그램 | Mermaid/PlantUML/D2 | 텍스트 기반 다이어그램 |
| 린팅 | markdownlint/Vale | 문서 품질 자동 검사 |
| ADR 관리 | adr-tools/log4brains | ADR 생성/관리 |
| CHANGELOG | conventional-changelog/release-please | 변경 로그 자동 생성 |
| 스크린샷 | carbon.now.sh/ray.so | 코드 스크린샷 생성 |
| 협업 | Notion/Confluence/GitBook | 팀 문서 협업 |
참고 자료
- "Docs for Developers" by Jared Bhatti et al. (2021)
- Google Technical Writing Course (developers.google.com/tech-writing)
- Michael Nygard, "Documenting Architecture Decisions" (2011)
- OpenAPI Specification 3.1.0 (spec.openapis.org)
- Keep a Changelog (keepachangelog.com)
- Semantic Versioning (semver.org)
- Mermaid.js Documentation (mermaid.js.org)
- GitLab Handbook (handbook.gitlab.com)
- Stripe Engineering Blog — "Writing Culture"
- Amazon's "Working Backwards" Methodology
- Docusaurus Documentation (docusaurus.io)
- Vale.sh — Prose Linter (vale.sh)
- PlantUML Documentation (plantuml.com)
- "The Diagramming Playbook" — Simon Brown (structurizr.com)