Design Docs: 소프트웨어 개발의 필수 설계 문서
" "First, solve the problem. Then, write the code." — John Johnson
들어가며
개발자들은 주로 코드를 작성하며 비즈니스 가치를 만들어내고, 현실 세계의 문제를 해결하며 일을 합니다.
문제를 해결하기 위해선 문제인식을 공유해야 하고 이때 작게는 바로 옆의 팀원이나 팀장님, 크게는 조직이나 회사 차원의 설득이 필요할 때가 있습니다.
내가 해결해야 한다고 생각했던 문제가 다른 사람은 동의하지 않을 때가 생각보다 자주 있으며 그럴때는 근거에 기반한 합리적인 설득 과정이 필요하게 됩니다. 이러한 문제를 해결하기 위해 Google, Amazon, Uber 등 세계적인 기술 기업들이 공통적으로 사용하고 있는 도구가 바로 Design Docs(설계 문서)입니다.
Design Docs는 단순한 기술 문서가 아닙니다. 이는 프로젝트의 성공과 실패를 가르는 핵심 도구이며, 개발팀의 규모가 커질수록 그 중요성은 더욱 증대됩니다.
Design Docs란 무엇인가?
정의와 핵심 개념
Design Docs(또는 Technical Spec, RFC)는 코드를 작성하기 전에 작성하는 경량화된 계획 문서입니다. 이 문서는 특정 문제를 어떻게 해결할 것인지를 기술하며, 팀의 피드백을 수집하고 합의를 도출하며 향후 참고할 수 있는 문서화를 제공합니다.
핵심 특징
- 비공식적이지만 구조화된 문서: 엄격한 형식보다는 문제 해결에 초점
- 협업 중심: 작성자 혼자만의 문서가 아닌 팀 전체의 지혜가 담긴 결과물
- 결정의 기록: 왜 이런 선택을 했는지에 대한 트레이드오프와 의사결정 과정을 문서화
- 미래를 위한 투자: 단기적 시간 투자로 장기적 개발 효율성 확보
역사적 배경과 진화
RFC의 기원 (1960년대)
Design Docs의 뿌리는 1960년대 IETF(Internet Engineering Task Force)에서 시작된 **RFC(Request For Comments)** 프로세스에서 찾을 수 있습니다. 초기 인터넷 개발자들은 복잡한 기술적 결정을 내리기 위해 공개적으로 아이디어를 제안하고 커뮤니티의 피드백을 받는 방식을 도입했습니다.
현대 기업으로의 전파
1990년대와 2000년대를 거치며 소프트웨어의 복잡성이 급격히 증가했습니다. 이에 따라 대형 기술 기업들은 각자의 방식으로 Design Docs 문화를 발전시켰습니다:
- Google: 2000년대 초부터 Design Docs 문화를 정착시켜 현재까지 핵심 개발 프로세스로 유지
- Amazon: Working Backwards 문서와 함께 기술 설계 검토 프로세스 도입
- Uber: 수십 명에서 수천 명으로 성장하면서 RFC 프로세스를 체계화하여 급속한 확장 지원
원격 근무 시대의 재조명
COVID-19 팬데믹 이후 원격 근무가 일반화되면서 Design Docs의 중요성이 더욱 부각되었습니다. 비동기 협업과 명확한 의사소통의 필요성이 증대되면서, 많은 기업들이 이 방법론을 적극적으로 도입하고 있습니다.
Design Docs의 핵심 구성 요소
1. 헤더 정보
```
제목: [RFC-001] 사용자 인증 시스템 마이크로서비스 전환
작성자: 김개발 (kihttp://m.dev@company.com)
검토자: 이아키텍트, 박시니어, 최리드
상태: Draft | Under Review | Approved | In Progress | Completed
최종 수정일: 2025-07-08
```
2. 개요 (Overview)
모든 팀원이 이해할 수 있는 고수준 요약입니다. 3문단 이내로 작성하며, 다음을 포함합니다:
- 해결하려는 문제
- 제안하는 솔루션의 핵심
- 예상되는 영향과 이익
3. 배경 (Background)
프로젝트가 필요한 이유와 현재 상황을 설명합니다:
- 비즈니스 요구사항
- 기술적 제약사항
- 기존 시스템의 한계점
4. 목표와 비목표 (Goals & Non-Goals)
명확한 범위 설정을 위해 무엇을 할 것인지, 무엇을 하지 않을 것인지를 구분합니다.
목표:
- 인증 서비스의 99.9% 가용성 확보
- 응답 시간 100ms 이하 달성
- 일일 100만 요청 처리 능력
비목표:
- 기존 사용자 데이터 마이그레이션 (별도 프로젝트)
- OAuth 2.0 외 다른 인증 방식 지원
5. 제안된 솔루션 (Proposed Solution)
기술적 세부사항을 포함한 구체적인 해결책을 제시합니다:
- 시스템 아키텍처 다이어그램
- API 설계
- 데이터베이스 스키마
- 보안 고려사항
6. 대안 고려사항 (Alternatives Considered)
왜 다른 방법이 아닌 이 방법을 선택했는지 설명합니다:
- 고려했던 다른 아키텍처
- 각 대안의 장단점 분석
- 비용-효과 분석
7. 구현 계획 (Implementation Plan)
프로젝트 실행을 위한 구체적인 로드맵입니다:
- 마일스톤별 작업 분할
- 타임라인과 담당자
- 위험 요소와 완화 방안
언제 Design Docs를 작성해야 할까?
작성이 필요한 경우
1. 1 엔지니어-월 이상의 프로젝트: 상당한 시간 투자가 필요한 모든 프로젝트
2. 크로스 팀 영향: 여러 팀이나 시스템에 영향을 미치는 변경사항
3. 아키텍처 변경: 기존 시스템의 구조적 변화가 필요한 경우
4. 새로운 기술 도입: 팀에서 처음 사용하는 기술이나 도구 적용 시
5. 외부 의존*: 서드파티 서비스나 라이브러리와의 복잡한 통합
실제 적용 예시
Git 전환 방안
상태: Under review, 날짜: 2025/07/13, 담당: 개발팀 다메카솔 (damecasol@damecasol.com)
Objective
현재 프로젝트의 소스 코드 관리 시스템(SCM)으로 사용 중인 SVN(Subversion)은 중앙 집중식 버전 관리 시스템으로, 최신 개발 환경의 요구사항을 충족하기에는 여러 한계가 있습니다. 특히 분산형 버전 관리 시스템(DVCS)인 Git에 비해 협업 효율성, 브랜치/머지(Branch/Merge)의 유연성, 오프라인 작업의 용이성, 그리고 개발자 생산성 측면에서 개선이 필요합니다. 따라서 본 문서에서는 이러한 문제점들을 해결하고 개발 프로세스의 효율성을 높이기 위해 Git으로의 전환을 제안합니다.
Proposal
1. Git 도입
Git은 현재 소프트웨어 개발 업계에서 가장 널리 사용되는 분산형 버전 관리 시스템입니다. 각 개발자가 독립적인 저장소 복사본을 가지므로, 네트워크 연결 없이도 작업이 가능하며, 빠르고 유연한 브랜치 및 머지 기능을 제공하여 병렬 개발 및 기능별 개발에 최적화되어 있습니다.
향상된 협업: 각 개발자가 로컬 저장소에서 독립적으로 작업하고, 필요한 시점에 중앙 저장소와 동기화함으로써 충돌을 최소화하고 협업 효율성을 높일 수 있습니다.
유연한 브랜치 전략: Git의 가볍고 빠른 브랜치 기능은 다양한 개발 워크플로우(예: Git Flow, GitHub Flow)를 적용할 수 있게 하여, 안정적인 릴리즈 관리와 신속한 기능 개발을 가능하게 합니다.
성능: SVN에 비해 커밋, 브랜치 생성, 머지 등의 작업 속도가 훨씬 빠릅니다.
2. GitHub 또는 GitLab 도입
Git 저장소를 호스팅하고 팀 협업 기능을 제공하는 플랫폼으로 GitHub 또는 GitLab을 도입하는 것을 제안합니다. 이 플랫폼들은 코드 리뷰, 이슈 트래킹, CI/CD 연동 등 개발 생명주기 전반을 지원하는 강력한 기능들을 제공합니다.
코드 리뷰: 풀 리퀘스트(Pull Request) 또는 머지 리퀘스트(Merge Request) 기능을 통해 효율적인 코드 리뷰 프로세스를 구축할 수 있습니다.
이슈 트래킹 및 프로젝트 관리: 내장된 이슈 관리 시스템을 활용하여 개발 진행 상황을 투명하게 관리하고, 프로젝트 계획을 효율적으로 수립할 수 있습니다.
CI/CD 연동: Jenkins, CircleCI, GitLab CI/CD 등 다양한 CI/CD 도구와 연동하여 자동화된 테스트 및 배포 파이프라인을 구축할 수 있습니다.
3. 전환 전략 (선택)
SVN에서 Git으로의 전환은 여러 가지 방식으로 진행될 수 있습니다. 현재 프로젝트의 규모와 이력을 고려하여 가장 적합한 방식을 선택해야 합니다.
히스토리 전체 마이그레이션: SVN의 모든 커밋 히스토리를 Git으로 가져오는 방식입니다. 히스토리 보존이 중요할 때 적합합니다. git svn clone 등의 도구를 사용할 수 있습니다.
새로운 Git 저장소 시작: 기존 SVN 히스토리는 보존하고, 특정 시점부터 새로운 Git 저장소에서 작업을 시작하는 방식입니다. 빠르고 간단하지만, 이전 히스토리는 SVN에서만 확인할 수 있습니다.
Check Points
개발자 교육: Git은 SVN과 사용 방식이 다르므로, 개발자들이 Git에 익숙해질 수 있도록 충분한 교육과 연습 시간이 필요합니다.
기존 CI/CD 파이프라인 변경: SVN 기반으로 구축된 기존 CI/CD 파이프라인이 있다면 Git 저장소와 연동되도록 수정해야 합니다.
대규모 저장소 히스토리 마이그레이션: 프로젝트의 SVN 히스토리가 매우 크다면, Git으로의 마이그레이션에 시간이 오래 걸리거나 추가적인 설정이 필요할 수 있습니다.
Limits
초기 학습 곡선: Git의 강력한 기능만큼이나 처음 접하는 사용자에게는 학습 곡선이 존재할 수 있습니다. 이는 교육을 통해 완화해야 합니다.
전환 기간 동안의 혼란: 전환 과정에서 일시적으로 개발자들의 혼란이나 생산성 저하가 발생할 수 있습니다. 이를 최소화하기 위한 명확한 전환 계획과 지원이 필요합니다.
Alternatives
Mercurial (Hg): Git과 유사한 분산형 버전 관리 시스템이지만, Git만큼 보편적으로 사용되지는 않습니다.
Perforce (Helix Core): 대규모 프로젝트와 바이너리 파일 관리에 강점이 있는 중앙 집중식 시스템이지만, 라이센스 비용이 발생할 수 있습니다.
기존 SVN 유지: 현재 시스템을 유지하는 방안도 있지만, 앞서 언급된 문제점들(협업 효율성, 유연성 등)은 해결되지 않을 것입니다.
Reference
Git 공식 홈페이지: https://git-scm.com/
GitHub: https://github.com/
GitLab: https://about.gitlab.com/
작성 시 주의사항
DO: 해야 할 것들
- 간결하고 명확한 언어 사용
- 시각적 다이어그램 적극 활용
- 트레이드오프와 의사결정 근거 명시
- 구체적인 예시와 시나리오 제공
- 정기적인 업데이트와 버전 관리
DON'T: 하지 말아야 할 것들
- 과도하게 세부적인 구현 코드 포함
- 불확실한 추측이나 가정에 의존
- 일방적인 결정 강요
- 완벽한 문서 작성에 과도한 시간 투자
- 작성 후 방치하여 실제와 다른 내용 유지
조직 차원의 도입 전략
점진적 도입 방법
1단계: 파일럿 프로젝트 (1-2개월)
- 소규모 팀에서 시범 적용
- 간단한 템플릿으로 시작
- 초기 저항 최소화에 집중
2단계: 프로세스 정립 (2-3개월)
- 파일럿 결과를 바탕으로 프로세스 개선
- 팀별 특성에 맞는 템플릿 커스터마이징
- 리뷰 프로세스와 승인 기준 수립
3단계: 전사 확산 (6개월+)
- 성공 사례 공유와 교육 프로그램 실시
- 도구와 인프라 개선
- 문화 정착을 위한 지속적 노력
마무리: Design Docs로 만드는 더 나은 개발 문화
Design Docs는 조직의 기술적 의사결정 능력을 향상시키고 개발팀의 협업 문화를 발전시키는 강력한 도구입니다.
성공적인 Design Docs 문화 정착의 핵심은 완벽한 문서를 만드는 것이 아니라, 문제를 함께 해결하고 지식을 공유하는 과정에 있습니다. 오늘부터 작은 프로젝트 하나에 Design Docs를 적용해보세요. 그 작은 시작이 여러분의 팀과 조직에 큰 변화를 가져올 것입니다.