본문 바로가기

엔지니어를 설득하는 논리·보안·지속 명확성을 갖춘 설계 문서 작성법

728x90

한눈에 이해하는 보기 좋은 설계 문서

  1. 정의: 설계 문서는 제약·트레이드오프 맥락에서 구현 전략을 설명하는 기술 보고서입니다.
  2. 목표: 독자가 “이 설계가 상황 대비 최적”임을 자연스럽게 납득하도록 만드는 것입니다. (가장 먼저 설득해야 할 대상은 작성자 본인)
  3. 조직화: 한 단락=한 개념. 문장은 이전 단락에서 자연스럽게 흐르게. 예상 반론은 선제 해소.
  4. 편집: 초안에서 ~30% 축소를 목표. 형용사→측정치(숫자·조건)로 치환. 독자의 주의력은 유한합니다.
  5. 부록: 복잡한 계산/시뮬레이션은 본문 요지 + 각주, 상세는 부록. 본문 이해는 부록 없이도 가능해야 합니다.
  6. 연습과 볼륨: 반복 작성·레드펜 주석·프리리드 문화가 실력을 만듭니다.
  7. 지속 관리: 승인 후에는 ADR(Architecture Decision Record) 로 의사결정 맥락/상태를 코드 옆에 보존하여 ‘디자인 고고학’을 방지합니다.

표준 설계 문서 템플릿 (보안 강화판, Markdown)

# [프로젝트/컴포넌트] 설계 문서
- 문서 상태: Draft | In Review | Approved
- 작성자/오너: 이름 (@handle)
- 버전/날짜: v1.0 / YYYY-MM-DD
- 관련 이슈/PR/ADR: ADR-00X, PR-123 등

## 0. TL;DR (요약)
- 결론 한 줄:
- 지금 당장 해야 할 일 3가지: [1] [2] [3]

## 1. 배경(Background)
- 현재 상황·문제(데이터/로그/사건 기반):
- 목표(성공 기준/KPI, SLO/SLA):

## 2. 요구사항(Functional & Non-Functional)
- 기능 요구:
- 비기능: 성능(X req/s), 지연(p95 Y ms), 가용성, 확장성, **보안/프라이버시/컴플라이언스**
- 제약: 레거시, 예산, 일정, 기술 스택

## 3. 위협 모델(Threat Model)
- 자산·경계·신뢰수준
- 공격자·시나리오(내부자, 외부자, 구성오류, 권한상승, 데이터유출 등)
- 가정/비가정(명시)

## 4. 설계 옵션 & 트레이드오프
- Option A: 장점/단점/리스크/완화책
- Option B: 장점/단점/리스크/완화책
- **선정안**과 선정 이유(탈락안 반려 근거 포함)

## 5. 상세 설계(High → Low)
- 아키텍처 다이어그램(링크/이미지 경로)
- 데이터 모델/스키마/수명주기
- 인터페이스(API/이벤트) 명세(예: OpenAPI 경로)
- 운영/관찰성(로그·메트릭·트레이싱)

## 6. 보안 설계(필수 체크리스트)
- 인증/인가(RBAC/ABAC, 최소권한)
- 데이터 보호(전송/저장 암호화, 키 관리, 마스킹, 삭제)
- 접근 통제(내/외부, 고객 간 격리, 네트워크 경계)
- 로깅/감사(무결성, 보존기간, 민감정보 마스킹)
- 비상 대응(탐지 룰, 알림, 롤백/킬스위치)
- 규정 준수(조직 표준/법·규제)

## 7. 성능·내고장성·용량 계획
- 기준 부하/피크/성장 가정
- 백오프/재시도/회로차단/레이트리밋

## 8. 배포·마이그레이션·롤백
- 전략(Blue/Green, Canary)
- 데이터 마이그레이션 절차(리허설)
- 롤백 시나리오와 데이터 일관성

## 9. 리스크 & 오픈이슈
- [R-01] 리스크 / 영향 / 가능도 / 대응
- [O-01] 결정 대기 이슈 / 책임자 / 마감일

## 10. 테스트/검증 계획
- 단위/통합/성능/보안/혼합부하
- **수용 기준(Exit Criteria)**

## 11. 운영 계획(런북 요약)
- 알람 임계치/온콜 루트
- 장애 시 SOP 링크

## 12. 비용/ROI(선택)
- 비용 추정, 효익 가설, TCO

## 13. 부록(Appendix)
- A. 시뮬레이션·계산 세부
- B. 대안 조사 상세
- C. 용어·표준

보안 관점 ‘10문 10답’ 체크리스트

  1. 무엇을 누구로부터 보호하나(자산/공격자)?
  2. 위협모델의 가정이 현실과 어긋나지 않는가?
  3. 권한 상승/수평 이동 방지 장치는 무엇인가?
  4. 민감정보 수집 최소화/가명화/보존기간 제한이 되는가?
  5. 키 관리(수명·보관·교체·권한 분리)는 어떻게 하나?
  6. 로그 무결성개인정보 마스킹은 보장되는가?
  7. 테넌트 격리가 네트워크/스토리지/캐시 레벨까지 일관적인가?
  8. Fail-safe/킬스위치와 정책 기본값은 안전한가?
  9. 탐지 룰/알람/온콜이 설계에 포함됐는가?
  10. 승인 후 ADR 등록·상태 갱신 계획이 있는가?

ADR(Architecture Decision Record) 템플릿 & 운영

# ADR-00X: 결정 제목
- 상태: Proposed | Accepted | Superseded by ADR-00Y
- 날짜: YYYY-MM-DD
- 맥락(Context): (필요성·제약·숫자)
- 결정(Decision): (간결·명시적)
- 결과(Consequences): 장점·단점·파급효과
- 보안 영향(Security Impact): (권한, 데이터 흐름 변경, 위협모델 변화)
- 링크: 관련 설계 문서/PR/티켓
  • 코드와 나란히 /adr/ 폴더로 버전 추적(예: adr/001-*.md).
  • 모든 PR은 관련 ADR 링크 필수. 상태(Status) 업데이트.
  • 변경은 “Superseded by ADR-00Y”로 선형 추적.
  • 보안·프라이버시·컴플라이언스 검토는 위험도 기반 샘플링으로 민첩성 확보.
300x250

“30% 줄이기” 편집 루틴 (실전 규칙)

  • 불필요한 접속사/군말 제거: “즉/사실/물론/따라서” 남용 금지.
  • 중복 제거: 문장 2개를 표/다이어그램 1개로 치환.
  • 형용사→수치: “빠르다”→“p95 150ms”, “높다”→“99.9%/월”.
  • 문장 구조: 주어·서술어를 가까이, 수식어는 뒤로.
  • 단락 규칙: “한 단락=한 개념=한 줄 요약 가능”.
  • 편집 전 → 후 예시
    • 전: “각 bullet point는 문서에서 별도 단락이 되어야 한다…(장황)”
    • 후: “각 bullet point는 한 단락으로, 읽고 나면 한 문장으로 요약될 수 있어야 한다.”

작은 예시 ①: “API 레이트리밋” 설계 요약

  • TL;DR: 토큰버킷(전역+테넌트별) 이중 제한. p95 200ms 유지. 오폭 방지 화이트리스트·버스트 허용.
  • 요구: 초당 10k req, 테넌트 간 간섭 방지, 공격 시 서비스 유지.
  • 옵션
    • A(선정): 외부 게이트웨이 + 분산 카운터(캐시) + 지역별 버킷.
    • B: 애플리케이션 내 미들웨어만(간단·정확성↓).
  • 보안: 인증된 클라이언트별 키·쿼터, 관리자 오남용 탐지(비정상 스파이크 알람), 감사로그 해시체인.
  • 검증: 혼합 부하·버스트·장시간 스로틀링 시나리오, 우회 패턴 테스트(프록시/아이피 로테이션).
  • 운영: 카나리 5→25→100%, 실패 시 10분 내 롤백.

작은 예시 ②: “멀티테넌트 격리” 설계 요약

  • TL;DR: 네임스페이스·네트워크폴리시·스토리지 경로 분리, DB 스키마 분리 + KMS 키 분리.
  • 위협모델: 구성오류·권한상승·쿼리 주입 통한 인접 테넌트 접근.
  • 옵션
    • A(선정): 스키마 분리(운영 단순·비용↓, 격리 중).
    • B: 인스턴스 분리(격리 강·비용↑).
  • 보안: 서비스 계정 최소권한, 컬럼 암호화(PII), 감사로그·접근 경로 추적, 데이터 삭제 정책.
  • 검증: 권한 상승·세션 고정·캐시 공유 누수·백업 복원 격리 체크.

자동화 스니펫

PR 템플릿 (.github/pull_request_template.md)

### 설계/결정 링크
- 설계 문서: …
- ADR: ADR-00X

### 체크리스트
- [ ] 위협모델 반영
- [ ] 인증/인가/데이터보호/로그/격리 적용
- [ ] 수용 기준 테스트 통과 (성능·보안)
- [ ] 롤백 계획/런북 업데이트

ADR 파일 생성 스크립트 (bash)

mkdir -p adr
idx=$(printf "%03d" $(($(ls -1 adr 2>/dev/null | wc -l)+1)))
cat > adr/${idx}-TITLE.md <<'MD'
# ADR-XXX: TITLE
상태: Proposed
날짜: YYYY-MM-DD
맥락:
결정:
결과:
보안 영향:
링크:
MD
echo "Created adr/${idx}-TITLE.md"

문체 검사(Vale 예시)

# .vale.ini
StylesPath = styles
MinAlertLevel = warning
Packages = write-good
[*.md]
BasedOnStyles = write-good

커밋 훅으로 문서 규칙 강제(예: pre-commit)

# .pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: md-lint
        name: Markdown format check
        entry: mdformat .
        language: system
        types: [markdown]

문서 조직 패턴

  • BOO: Background → Objective → Overview
    • 지금 (배경), 무엇을(목표), 어떻게(개요). 작은 팀·짧은 사이클에 적합.
  • 진단 → 지침/전제/제약 → 행동
    • 핵심 문제를 진단하고, 선택 원칙과 제약을 명문화, 이어서 명확한 행동 제시.

LLM 보조 워크플로우 & 프롬프트

  1. 브레인덤프: 문제·사실·가정·우려를 단어 수준으로 쏟아내기(음성→텍스트 OK).
  2. 구조화 프롬프트
    • “다음 메모를 BOO 구조로 재정렬하고, 누락 위험/예상 반론을 항목화해줘. 각 단락 끝에 한 문장 요약을 붙여줘.”
  3. 초안 작성: 구조 반영, 도식/표 우선.
  4. 압축 프롬프트
    • “의미 보존을 최우선으로 30% 분량 축소. 형용사를 수치/조건으로 치환하고 중복을 제거해줘.”
  5. 반론 주입 프롬프트
    • “이 설계의 강력한 반대 논거 5개와 각각의 근거·반박을 작성해줘.”
  6. 체크리스트 점검 프롬프트
    • “아래 보안·운영 체크리스트로 미충족 항목을 찾아 diff 형태로 보여줘.”

주의: 결과를 그대로 채택하지 말고, 핵심 문장·지표는 직접 재작성하여 책임성과 톤을 확보하세요.

리뷰·회의 운영(두 방식의 절충)

  • 동시 읽기: 사전 프리리드가 어려운 현실 반영. 동일 맥락에서 출발, 의사결정 집중.
  • 프리리드: 회의 시간을 단축하고 의견 숙성.
  • 절충안(권장): 1-6p 본문 + 회의 초반 10분 동시 읽기 → 20-40분 토의/결정.
    • 문서 머리말에 “결정 필요 항목”을 명확히 박아 둡니다.

흔한 안티패턴과 치유책

  • “문서=모든 여정 기록” → 아니오. 본문은 앞으로의 결정을 가능하게 하는 정보만. 우여곡절은 부록/별도 문서.
  • “긴 문단=깊이” → 아니오. 깊이는 근거·수치·대안 비교에서 옵니다.
  • “보안 항목은 나중에” → 아니오. 보안은 요구사항 단계부터 내재화.
  • “승인 후 방치” → ADR 로 결정/변경 이력을 관리, PR 게이트와 연결.

완성 예시(요약형 본문 + 부록 분리)

주제: 고객 PII 저장·보관 정책 개편

  • TL;DR: PII 저장을 최소화, 저장 시 필드별 암호화 + 키 분리, 조회 경로 감사, 보존기간 1년, p95 조회 200ms 유지.
  • 배경: 고객 범위 확대·내부 접근 경로 증가·컴플라이언스 요구 강화.
  • 요구: 기능(검색/정정/삭제), 비기능(가용성 99.9%, p95 200ms), 보안·프라이버시·컴플라이언스 충족.
  • 위협모델: 내부자 오남용, 쿼리 주입, 백업 누출, 키 도난, 구성오류.
  • 옵션 비교
    • A(선정): 컬럼 단위 암호화 + KMS 키 분리 + 토큰화(검색 키 유지).
    • B: 전량 토큰화(검색성↓), C: 전량 암호화(운영 복잡도↑).
  • 보안 설계: 최소권한, 요청 맥락 기반 접근(업무 역할·시간·위치), 감사로그 무결성, 데이터 삭제 API.
  • 검증 계획: 부하/혼합/장시간, 권한 상승·세션 고정·키 순환·백업 복원 테스트.
  • 운영 계획: 카나리 배포, 롤백 15분 내, 온콜/알람 기준.
  • 부록: 샘플 데이터 흐름도, 암호화 성능 수치, 토큰화 누락 케이스 재현 로그.

마지막 원칙 정리

  • 결론 먼저, 근거는 아래: 독자가 먼저 핵심을 잡고 세부를 선택적으로 탐색.
  • 논쟁의 범위를 설계자가 관리: ‘논쟁할 가치가 있는 주제’에만 집중.
  • 지표 없이 설계 없음: 수치·조건·합격선이 없는 문장은 설득력이 약합니다.
  • 더 많은 시간, 더 짧은 문서: 팀의 시간은 문서의 길이에서 절약됩니다.
728x90
그리드형(광고전용)

댓글