문서화와 인수인계 시리즈 8/9
실무에서 만든 문서는 좋은 블로그 재료가 된다.
아키텍처 문서, HANDOVER, 트러블슈팅 가이드, 배포 가이드, 용어집에는 실제 경험이 들어 있다. 검색해서 만든 글보다 훨씬 구체적이고, 판단의 흔적이 남아 있다.
하지만 내부 문서를 그대로 공개하면 안 된다.
실제 회사명, 도메인, 리소스 이름, API 경로, 인증 방식, 장애 날짜, 운영 데이터가 노출될 수 있다. 그래서 공개 글로 바꾸기 전에 익명화 과정이 필요하다.
공개할 수 있는 것과 없는 것
먼저 구분해야 한다.
공개해도 좋은 것은 보편적인 판단 기준이다.
- 왜 콘솔을 분리했는가
- 왜 S3와 CloudFront를 썼는가
- 왜 Lambda와 상주 서버를 나눴는가
- 왜 job table로 비동기 작업을 관리했는가
- 왜 CORS를 Gateway에서 처리했는가
- 왜 HANDOVER 문서를 만들었는가
공개하면 안 되는 것은 식별 가능한 정보다.
- 실제 회사명
- 실제 서비스명
- 실제 도메인
- 실제 API URL
- 실제 S3 버킷명
- 실제 Lambda 함수명
- 실제 DB명
- 실제 쿠키명
- 실제 로그 그룹
- 실제 장애 날짜
- 고객, 파트너, 내부 조직명
- 보안 정책의 구체값
공개 글의 목적은 내부 시스템을 보여주는 것이 아니다. 판단 방식을 공유하는 것이다.
익명화 기본 원칙
익명화는 단순히 이름만 바꾸는 일이 아니다.
다음 원칙을 지킨다.
- 실제 리소스명은 모두 예시 이름으로 바꾼다.
- 내부 업무명은 일반적인 업무 표현으로 바꾼다.
- 수치는 정확한 값보다 범위로 표현한다.
- 보안 설정은 원칙 중심으로 설명한다.
- 장애 사례는 날짜와 식별 정보를 제거한다.
- 코드 예시는 실제 코드가 아니라 축약 예시로 바꾼다.
- 다이어그램의 노드 이름도 일반화한다.
이 과정을 거치면 글은 안전해지고, 오히려 더 많은 독자가 이해할 수 있게 된다.
이름 바꾸기 규칙
먼저 공통 명명 규칙을 만든다.
| 실제 범주 | 블로그용 표현 |
|---|---|
| 회사명 | 운영 조직 |
| 내부 운영 콘솔 | 운영 리포트 콘솔 |
| 외부 신청 콘솔 | 신청 관리 콘솔 |
| 외부 사용자 | 외부 파트너 |
| 내부 사용자 | 내부 운영자 |
| 실제 도메인 | console.example.com |
| 실제 API 도메인 | api.example.com |
| S3 버킷 | static-assets-bucket, console-data-bucket |
| Lambda 함수 | sync-api-function, report-worker-function |
| DB | operations_db, reporting_db |
| 작업 테이블 | report_job |
| 인증 쿠키 | internal-auth-token |
공통 규칙을 먼저 정하면 시리즈 전체의 표현이 흔들리지 않는다.
API 경로 익명화
API 경로는 생각보다 많은 정보를 드러낸다.
예를 들어 실제 업무명이 들어간 endpoint는 내부 도메인을 노출할 수 있다.
공개 글에서는 다음처럼 일반화한다.
| 실제 성격 | 공개 예시 |
|---|---|
| 신청 동기화 | POST /api/sync |
| 대시보드 조회 | GET /api/dashboard |
| 리포트 생성 요청 | POST /api/reports |
| 작업 상태 조회 | GET /api/jobs/{jobId} |
| 공개 캘린더 조회 | GET /api/public-calendar |
경로는 패턴을 설명할 정도면 충분하다. 실제 path 전체를 공개할 필요는 없다.
데이터 구조 익명화
데이터 구조도 조심해야 한다.
컬럼명이나 필드명이 내부 업무를 드러낼 수 있기 때문이다.
공개 글에서는 저장 전략 중심으로 설명한다.
예를 들어 S3 구조는 다음 정도로 일반화할 수 있다.
console-data-bucket/
├── latest/data.json
├── monthly/data-YYYY-MM.json
├── public/calendar-YYYY-MM.json
└── audit/YYYY-MM/YYYY-MM-DD/sync-HHMMSS.json이 구조는 패턴을 보여주지만 실제 회사나 업무를 식별하게 하지는 않는다.
DB도 마찬가지다.
실제 테이블명 대신 다음처럼 쓴다.
report_job
monthly_statistics
operation_event수치 익명화
정확한 수치는 식별 정보가 될 수 있다.
예를 들어 "월 137건", "Lambda timeout 283초", "특정 날짜 오전 10시 장애" 같은 표현은 피한다.
대신 범위로 바꾼다.
| 실제 표현 | 공개 표현 |
|---|---|
| 137건 | 수십~수백 건 |
| 283초 | 수분 이내 |
| 매월 25일 | 월말 |
| 특정 장애 날짜 | 한 배포 과정에서 |
| 특정 비용 | 월 몇 달러 수준 |
정확한 수치가 글의 핵심이 아니라면 범위로 충분하다.
보안 정보 익명화
보안 관련 글은 특히 조심해야 한다.
공개해도 되는 것:
- CORS의 원리
- credentials 사용 시 wildcard origin이 안 되는 이유
- 공개 API와 내부 API를 나눠야 하는 이유
- IAM 최소 권한 원칙
- CloudFront 경로별 정책의 개념
공개하면 안 되는 것:
- 실제 허용 도메인 목록
- 실제 쿠키명
- 실제 토큰 구조
- 실제 IAM policy 전문
- 실제 security group 정보
- 내부 관리자 경로
- 우회 가능한 보안 예외
원칙은 설명하되, 공격 단서가 될 정도로 구체적인 값은 제거한다.
코드 예시 익명화
코드도 실제 운영 코드를 그대로 붙이지 않는다.
나쁜 예:
# 실제 함수명, 실제 버킷명, 실제 테이블명이 포함된 코드좋은 예:
def create_report_job(request):
job_id = insert_job(status="IN_PROGRESS")
invoke_worker_async(job_id)
return {"jobId": job_id}핵심 흐름만 보여주면 된다.
코드 예시는 설명을 돕는 것이지 운영 코드를 공개하는 곳이 아니다.
다이어그램 익명화
다이어그램은 텍스트보다 더 많은 정보를 드러낼 수 있다.
노드 이름, 도메인, 경로, 데이터 저장소 이름을 모두 일반화한다.
예시:

이 정도면 구조는 전달되지만 실제 시스템은 드러나지 않는다.
발행 전 체크리스트
글을 발행하기 전에 다음을 확인한다.
- 실제 회사명과 서비스명이 없는가
- 실제 도메인과 API URL이 없는가
- 버킷명, 함수명, 배포 ID가 없는가
- DB명, 테이블명, 컬럼명이 식별 가능하지 않은가
- 쿠키명, 토큰명, 인증 헤더명이 실제 값이 아닌가
- 내부 메뉴명과 업무명이 과도하게 구체적이지 않은가
- 고객, 파트너, 지역, 조직명이 노출되지 않는가
- 장애 날짜와 정확한 수치가 불필요하게 남아 있지 않은가
- 보안 설정이 공격 단서가 될 만큼 구체적이지 않은가
- 코드 예시가 실제 운영 코드가 아닌가
- 다이어그램 노드 이름이 일반화되어 있는가
이 체크리스트는 매번 써야 한다. 한 번 만든 규칙도 글을 쓰다 보면 놓치기 쉽다.
내부 문서가 블로그가 되는 과정
내부 문서를 블로그로 바꾸는 과정은 다음과 같다.
- 문서에서 핵심 의사결정을 뽑는다.
- 실제 식별 정보를 제거한다.
- 특정 업무를 보편적인 문제로 바꾼다.
- 선택지와 트레이드오프를 정리한다.
- 코드와 명령어는 예시로 축약한다.
- 마지막에 다시 설계한다면 볼 점을 덧붙인다.
이렇게 하면 내부 문서는 단순 기록에서 공개 가능한 실무 회고로 바뀐다.
정리
내부 문서는 좋은 블로그 재료다. 하지만 그대로 공개하면 안 된다.
공개해야 할 것은 실제 이름이 아니라 판단 기준이다.
익명화의 목적은 숨기는 것이 아니다. 불필요한 식별 정보를 제거하고, 더 많은 사람이 읽을 수 있는 보편적인 글로 바꾸는 것이다.
실무 문서가 블로그 콘텐츠가 되려면 다음 세 가지가 필요하다.
- 식별 정보 제거
- 문제의 일반화
- 의사결정과 트레이드오프 중심의 재구성
이 과정을 거치면 내부 문서는 안전하면서도 깊이 있는 기술 글이 된다.
다음 글에서는 이렇게 정리한 문서가 어떻게 기술 블로그와 커리어 자산으로 이어지는지 다룬다.
'성장과 기술 > 시스템 설계' 카테고리의 다른 글
| 배포 가이드는 명령어 모음이 아니다 (0) | 2026.05.28 |
|---|---|
| 트러블슈팅 문서는 장애가 난 뒤 쓰면 늦다 (0) | 2026.05.27 |
| 기술 용어집을 프로젝트 맥락으로 쓰는 이유 (0) | 2026.05.26 |
| ADR은 면접 답변이 아니라 운영 자산이다 (0) | 2026.05.25 |
| README, 아키텍처 문서, HANDOVER는 역할이 다르다 (0) | 2026.05.24 |
글에서 정리한 생각은 GitHub의 코드와 포트폴리오로 이어지고, 일부는 FamBlend 같은 제품 실험으로 확장됩니다.