본문으로 건너뛰기

전략적 명확성: 포괄적인 의사결정 문서 가이드

· loading · loading ·
인재덕
작성자
인재덕
A Kiwi living in Korea
목차

현대 프로젝트의 빠른 세계에서 의사결정은 복잡하고 다면적일 수 있습니다. 팀은 종종 경쟁하는 우선순위, 수많은 이해관계자, 그리고 쏟아지는 정보를 동시에 다뤄야 합니다. 의사결정 문서—아키텍처 결정 기록(ADR), Request for Comments(RFC), 또는 단순히 “결정 로그"라고도 불리는—는 명확성, 정렬, 책임을 보장하기 위한 매우 가치 있는 도구입니다.

이 가이드에서는 의사결정 문서가 중요한 이유, 언제 사용해야 하는지, 효과적으로 작성하는 방법, 그리고 팀에 적용할 수 있는 템플릿을 다룹니다.


의사결정 문서가 중요한 이유
#

1. 명확성과 투명성
#

의사결정 문서는 주요 결정, 검토된 솔루션, 최종 선택의 근거를 명확하게 기술하는 구조화된 방법을 제공합니다. 이 정보를 중앙 집중식 문서에 기록함으로써 팀은 오해를 줄이고 모든 사람이 같은 이해를 가질 수 있습니다. 투명성은 결정이 신중하고 포괄적으로 이루어지고 있음을 보여주므로 이해관계자 간의 신뢰를 증진시킵니다.

2. 팀 간 정렬
#

대규모 프로젝트는 일반적으로 다양한 관점과 우선순위를 가진 부서 간 팀이 참여합니다. 의사결정 문서는 솔루션을 평가하기 위한 명확한 프레임워크를 제공하여 이러한 다양한 그룹의 정렬을 돕습니다. 모든 당사자가 결정에 영향을 미치는 요소를 이해하면 동의를 얻고 함께 앞으로 나아가기가 더 쉬워집니다.

3. 재작업과 끝없는 논쟁 방지
#

팀이 같은 논의를 몇 번이나 반복했나요? “왜 MongoDB 대신 PostgreSQL을 선택했지?” “API 버전 관리 전략은 이미 결정하지 않았나?” 결정을 문서화하면 팀이 이미 해결된 문제를 다시 검토하는 것을 피할 수 있습니다. 과거 결정과 그 맥락에 대한 명확한 기록이 있으면 팀은 발자취를 되짚는 대신 실행에 집중할 수 있습니다.

4. 조직 지식 보존
#

프로젝트는 몇 달에서 몇 년에 걸쳐 진행될 수 있으며, 그 동안 팀원이 입사하거나 퇴사할 수 있습니다. 의사결정 문서는 특정 경로가 선택되었는지—무엇이 결정되었는지뿐만 아니라—에 대한 중요한 지식을 보존하는 역사적 기록 역할을 합니다. 이를 통해 인원이 바뀌어도 연속성이 보장됩니다.

5. 책임과 오너십
#

의사결정자, 기여자, 승인자를 명시함으로써 의사결정 문서는 책임을 생성합니다. 각 사람이 자신의 역할과 책임을 알고 있어 진행 상황을 추적하고 후속 조치를 보장하기가 더 쉬워집니다.


언제 의사결정 문서를 작성해야 하는가
#

모든 결정에 공식적인 문서화가 필요한 것은 아닙니다. 다음의 경우에 의사결정 문서를 사용하세요:

영향이 큰 결정:

  • 기술 스택 선택 (프레임워크, 데이터베이스, 클라우드 제공업체)
  • 아키텍처 패턴 (마이크로서비스 vs 모놀리스, 이벤트 기반 vs 요청-응답)
  • 서드파티 벤더 선정
  • 보안 및 규정 준수 접근 방식

장기적인 영향을 미치는 결정:

  • 외부 시스템이 의존하는 API 계약
  • 여러 서비스에 영향을 미치는 데이터 모델 설계
  • 확립된 패턴에 대한 파괴적 변경

팀 간 정렬이 필요한 결정:

  • 여러 팀이나 부서에 영향을 미치는 변경
  • 비기술적 이해관계자의 동의가 필요한 결정
  • 리소스 할당 및 우선순위 선택

스파이크에서 나온 결정:

  • 타임박스된 조사가 완료되면 조사 결과와 결정을 공식 문서에 기록

공식 문서화를 건너뛸 수 있는 경우:

  • 쉽게 되돌릴 수 있는 결정
  • 팀 내부 구현 세부 사항
  • 직접적인 범위 외 영향이 최소인 선택

의사결정 문서 라이프사이클
#

의사결정 문서가 조직 내에서 어떻게 흐르는지 이해하면 효과를 극대화할 수 있습니다:

┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   초안      │ ──► │   리뷰      │ ──► │   승인      │ ──► │   구현      │
│   제안      │     │  피드백     │     │   수락      │     │   완료      │
└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘
                    ┌─────────────┐
                    │   거부/     │
                    │   대체      │
                    └─────────────┘

초안/제안: 작성자가 초기 문서를 작성하고 문제와 잠재적 솔루션의 개요를 설명합니다.

리뷰/피드백: 이해관계자가 문서를 검토하고 질문을 하며 대안을 제안합니다. 이 단계가 중요합니다—가정이 검증되고 맹점이 드러나는 곳입니다.

승인/수락: 의사결정자(종종 기술 리드, 아키텍트 또는 프로덕트 오너)가 최종 결정을 내립니다.

구현/완료: 팀이 결정을 실행합니다. 구현 중에 이루어진 변경 사항을 반영하도록 문서를 업데이트합니다.

거부/대체: 일부 결정은 리뷰 중에 거부됩니다. 다른 결정은 상황이 바뀌면서 폐기됩니다. 혼란을 피하기 위해 이러한 것들을 명확하게 표시하세요.


효과적인 의사결정 문서 작성하기
#

솔루션이 아닌 문제부터 시작하기
#

흔한 실수는 바로 솔루션으로 뛰어드는 것입니다. 대신 다음을 명확하게 설명하세요:

  • 우리는 어떤 문제를 해결하려고 하는가?
  • 이 문제가 지금 왜 중요한가?
  • 해결하지 않으면 어떻게 되는가?

이 프레이밍은 솔루션을 논의하기 전에 모든 사람이 문제에 동의하도록 보장합니다.

여러 옵션 제시하기
#

강한 선호도가 있더라도 최소 2-3개의 대안을 문서화하세요. 이는 실사를 보여주고 다른 사람들이 선택된 솔루션이 왜 선호되는지 이해하는 데 도움이 됩니다. 각 옵션에 대해 다음을 포함합니다:

  • 간단한 설명
  • 장단점
  • 공수 추정 (대략적인 티셔츠 사이징도 괜찮습니다: S/M/L/XL)
  • 리스크와 완화 전략

트레이드오프를 명시적으로 표현하기
#

모든 결정에는 트레이드오프가 수반됩니다. 이를 솔직하게 인정하세요:

  • “아키텍처 순수성보다 시장 출시 속도를 선택합니다”
  • “더 나은 확장성을 위해 운영 복잡성 증가를 수용합니다”
  • “원시 성능보다 개발자 경험을 우선시합니다”

이러한 진술은 미래의 독자가 맥락과 제약을 이해하는 데 도움이 됩니다.

구체적인 예시 포함하기
#

추상적인 논의는 추상적인 결정으로 이어집니다. 문서를 다음으로 구체화하세요:

  • 솔루션이 어떻게 구현될지 보여주는 코드 스니펫
  • 시스템 상호작용을 보여주는 다이어그램
  • 스파이크의 개념 증명 구현 링크

명확한 타임라인 설정하기
#

기한 없는 결정은 무한정 표류합니다. 다음을 명시하세요:

  • 결정이 내려져야 하는 시점
  • 누가 언제까지 의견을 제공해야 하는지
  • 결정이 지연되면 무엇이 진행을 차단하는지

예시: 아키텍처 결정 기록 (ADR)
#

다음은 의사결정 문서의 실용적인 예시입니다:

# ADR-001: API 인증 전략

**상태:** 승인됨
**날짜:** 2024-11-15
**의사결정자:** Sarah Chen (플랫폼 아키텍트)
**기여자:** 백엔드 팀, 보안 팀, 모바일 팀

## 맥락

우리의 퍼블릭 API는 현재 인증에 API 키를 사용하고 있습니다.
서드파티 통합과 모바일 앱 지원을 확장함에 따라 다음을 지원하는
더 강력한 인증 메커니즘이 필요합니다:
- 토큰 만료 및 갱신
- 범위 지정 권한
- 사용자 수준 인증 (서비스 수준만이 아닌)

## 결정

API 인증에 OAuth 2.0과 JWT 토큰을 구현합니다.

## 검토한 옵션

### 옵션 1: OAuth 2.0 + JWT (권장)
**설명:** 자체 포함 토큰을 가진 업계 표준 프로토콜

| 장점 | 단점 |
|------|------|
| 업계 표준, 잘 문서화됨 | 초기 구현이 더 복잡 |
| 자체 포함 토큰으로 DB 조회 감소 | 토큰을 즉시 무효화할 수 없음 |
| 광범위한 라이브러리 지원 | 리프레시 토큰 관리 필요 |

**공수:** 중간 (2-3 스프린트)

### 옵션 2: 세션 기반 인증
**설명:** 쿠키를 사용한 전통적인 서버 측 세션

| 장점 | 단점 |
|------|------|
| 구현이 간단 | 모바일 앱에 적합하지 않음 |
| 세션 취소가 쉬움 | 스티키 세션 또는 공유 세션 저장소 필요 |
| 대부분의 개발자에게 익숙함 | 확장성이 떨어짐 |

**공수:** 작음 (1 스프린트)

### 옵션 3: 커스텀 토큰 시스템
**설명:** 자체 토큰 기반 인증 구축

| 장점 | 단점 |
|------|------|
| 완전히 커스터마이징 가능 | 바퀴의 재발명 |
| 외부 의존성 없음 | 커스텀 구현의 보안 리스크 |

**공수:** 큼 (4+ 스프린트)

## 결과

- 모바일 팀은 표준 OAuth 플로우를 구현할 수 있음
- 토큰 갱신 메커니즘 설정 필요
- OAuth 플로우를 위한 API 문서 업데이트 필요
- 기존 API 키 사용자는 마이그레이션 경로 필요 (6개월 폐기 기간)

## 참조

- [OAuth 2.0 RFC 6749](https://tools.ietf.org/html/rfc6749)
- 내부 스파이크 문서: [인증 옵션 스파이크](/spikes/auth-spike-2024)
- 보안 팀 리뷰: SEC-2024-042

의사결정 문서 템플릿
#

이 템플릿을 팀의 시작점으로 사용하세요:

속성세부사항
결정/이슈 이름[명확하고 설명적인 제목]
상태[초안 / 검토 중 / 승인됨 / 거부됨 / 대체됨]
영향도[높음 / 중간 / 낮음]
오너[결정을 추진하는 사람 이름]
의사결정자[최종 권한을 가진 사람]
기한[결정을 내려야 하는 기한]

문제 설명
#

어떤 문제를 해결하려고 하는가? 왜 중요한가? 아무것도 하지 않을 때의 비용은?

배경
#

맥락, 이력, 관련 세부사항을 제공합니다. 관련 문서, 이전 결정, 스파이크 결과에 대한 링크를 포함합니다.

제약사항
#

모든 솔루션이 준수해야 하는 제한이나 요구사항은 무엇인가?

  • 예산 제약
  • 타임라인 요구사항
  • 기술적 제약 (기존 시스템, 스킬셋)
  • 규정 준수 또는 보안 요구사항

검토한 솔루션
#

옵션설명장점단점공수리스크
옵션 1설명장점A, 장점B단점A, 단점BS/M/L/XL낮음/중간/높음
옵션 2설명장점A, 장점B단점A, 단점BS/M/L/XL낮음/중간/높음
옵션 3설명장점A, 장점B단점A, 단점BS/M/L/XL낮음/중간/높음

권장사항
#

권장하는 옵션을 명시하고 제약과 트레이드오프를 고려할 때 왜 최선의 선택인지 요약합니다.

결정
#

결정이 내려지면 최종 결정을 문서화합니다. 권장사항과 다르면 이유를 설명합니다.

결과
#

이 결정의 영향은 무엇인가? 필요한 후속 작업은 무엇인가?

액션 아이템
#

액션담당자기한
액션 1이름날짜
액션 2이름날짜

참조
#

관련 문서, 외부 리소스, 스파이크 결과, 이전 결정에 대한 링크.


의사결정 문서 문화를 위한 팁
#

발견 가능하게 만들기: 의사결정 문서를 일관된 위치에 저장하세요—저장소의 전용 폴더, 위키 공간 또는 문서 시스템. 찾을 수 없으면 사용하지 않습니다.

가볍게 유지하기: 작성하는 데 며칠이 걸리는 의사결정 문서는 작성되지 않습니다. 필수 사항으로 시작하고 중요한 곳에 세부 사항을 추가하세요.

회고에서 검토하기: 회고에서 정기적으로 과거 결정을 검토하세요. 어떤 결정이 잘 작동했나요? 어떤 것을 다르게 할 건가요? 이 피드백 루프가 미래의 의사결정을 개선합니다.

결정을 구현에 연결하기: 코드 주석, 커밋 메시지, 풀 리퀘스트에서 의사결정 문서를 참조하세요. 이것은 “왜"와 “무엇” 사이의 추적성을 만듭니다.

버전 관리 및 업데이트: 상황은 변합니다. 결정이 대체될 때 이전 문서를 삭제하지 말고, 대체되었다고 표시하고 새 결정에 링크하세요. 이렇게 하면 역사적 기록이 보존됩니다.


피해야 할 일반적인 함정
#

분석 마비: 완벽이 좋은 것의 적이 되지 않게 하세요. 기한을 정하고, 가용한 정보로 최선의 결정을 내리고, 앞으로 나아가세요. 대부분의 결정은 필요하면 다시 검토할 수 있습니다.

형식적 승인: 리뷰가 항상 의미 있는 피드백 없이 승인으로 끝나면, 프로세스가 가치를 더하지 않는 것입니다. 진정한 비평과 대안적 관점을 장려하세요.

고아 문서: 작성되었지만 구현되지 않은 의사결정 문서는 문서가 없는 것보다 나쁩니다. 결정이 행동으로 이어지도록 보장하세요.

너무 많은 세부사항: 의사결정 문서는 “왜"와 “무엇"을 설명해야 하며, “어떻게"가 아닙니다. 구현 세부사항은 기술 사양서에 속하며 결정 기록에는 속하지 않습니다.

반대 의견 무시: 이해관계자가 결정에 동의하지 않으면 그들의 우려를 문서화하세요. 결정이 유지되더라도 반대 의견을 인정하는 것은 존중을 보여주고 미래의 독자에게 중요한 맥락을 제공합니다.


결론
#

의사결정 문서는 관료적 오버헤드가 아닙니다—전략적 추진력입니다. 명확성, 정렬, 책임을 촉진함으로써 팀이 복잡한 프로젝트의 도전을 자신감과 목적을 가지고 탐색할 수 있도록 힘을 줍니다.

간단하게 시작하세요. 다음 중요한 결정을 선택하고 간단한 문서를 작성하세요. 팀에 맞는 것을 기반으로 프로세스를 개선하세요. 시간이 지남에 따라 의사결정을 가속화하고 조직의 지혜를 보존하는 가치 있는 지식 기반을 구축하게 될 것입니다.

결정을 문서화하기 시작하기 가장 좋은 때는 프로젝트가 시작되었을 때였습니다. 두 번째로 좋은 때는 바로 지금입니다.


참고 자료
#

이 사이트의 관련 글:

외부 리소스: