소프트웨어 개발을 하다 보면 이런 상황이 반복된다.
처음에는 모두 알고 있었던 내용이지만, 시간이 지나면 맥락(Context)은 사라지고 결과(Result)만 남는다.
그리고 결국 팀은 같은 논의를 반복하거나, 이미 검토했던 결정을 다시 뒤집게 된다.
이 문제를 해결하기 위해 사용하는 것이 바로 ADR(Architecture Decision Record) 이다.
ADR은 특정 기술적 의사결정에 대해 아래 내용을 기록하는 문서다.
쉽게 말하면:
“왜 이런 결정을 했는지 남기는 기술 의사결정 로그”
라고 볼 수 있다.
👉 GitHub Engineering Blog에서도 ADR을 다음과 같은 관점으로 설명한다.
ADR은 단순 문서가 아니라, 미래의 팀원과 자신에게 남기는 의사결정의 맥락이다.

코드는 남는다.
하지만 “왜 그렇게 만들었는지”는 남지 않는다.
예를 들어:
queue_system: rabbitmq
설정은 남아있다.
하지만 아래 정보는 대부분 사라진다.
결국 몇 달 뒤 누군가는 다시 같은 비교를 시작한다.
ADR은 이런 중복 비용을 줄인다.
신규 개발자가 가장 어려워하는 부분은:
“현재 구조를 이해하는 것”
이다.
특히 레거시 프로젝트에서는 코드만 보고 의도를 파악하기 어렵다.
ADR이 있으면:
같은 맥락을 빠르게 이해할 수 있다.
즉:
를 설명한다.
ADR을 작성하기 시작하면 자연스럽게 아래를 고민하게 된다.
즉, 문서화 자체가 사고를 정리하는 과정이 된다.
실제로 ADR 문화가 잘 잡힌 팀은:
같은 효과가 나타난다.
ADR은 복잡할 필요 없다.
보통 아래 정도면 충분하다.
# ADR-001: RabbitMQ 도입
## 상태
Accepted
## 배경(Context)
실시간 이벤트 처리 시스템이 필요하다.
현재는 API 서버 간 직접 호출 구조이다.
## 고려한 선택지
- Kafka
- RabbitMQ
- AWS SQS
## 결정(Decision)
RabbitMQ 채택
## 이유
- 운영 난이도가 상대적으로 낮음
- 현재 트래픽 규모에 적합
- 빠른 도입 가능
## 결과(Consequences)
### 장점
- 구축 속도 향상
- 운영 부담 감소
### 단점
- 대규모 스트리밍에는 한계 가능성
핵심은:
“결론”보다 “판단 근거”를 남기는 것
이다.
아래는 프로젝트에서 담당한 기능에 대해 작성한 ADR의 일부이다.
당시에 복잡하고 세세하게 기억하기 어려웠던 의사소통 과정을 문서로 정리하여 관리하니 한결 편안했다.
# ADR-001: Milvus 하이브리드 검색(dense + sparse)과 가중 rerank
## 상태
Accepted
## 컨텍스트
벡터 유사도만으로는 한국어 질의·키워드 매칭 품질이 불안정할 수 있고, 반대로 희소(BM25)만으로는 의미 확장이 부족할 수 있다. Milvus 2.x 계열에서 **dense ANN + sparse BM25**를 한 번에 조회하고 가중치로 합치는 API를 사용할 수 있다.
## 결정
- `hybrid_search`에서 `AnnSearchRequest` 두 개(dense: `dense_vector`, sparse: `sparse_vector`)를 구성하고, `FunctionType.RERANK`의 `weighted` 방식으로 `Config.HYBRID_WEIGHTS`를 적용한다.
- 명사가 있을 때는 dense/sparse 입력 문자열에 명사를 덧붙여 임베딩·희소 입력을 보강한다(`USE_NOUN_EXPANDED_EMBEDDING`, `USE_NOUN_BOOSTED_SPARSE`).
## 결과
- 장점: 의미 검색과 키워드 검색을 한 번의 Milvus 호출 경로로 결합할 수 있다.
- 단점: Milvus 스키마가 dense+sparse+ranker를 지원해야 하며, 임베딩·토큰화 품질에 따라 튜닝이 필요하다.
## 근거 코드
- `search_app/utils/milvus.py:16-77` (`hybrid_search`)
## 대안
- dense-only ANN + 서비스 측 재정렬만 사용 (인덱스 단순, 키워드 recall은 별도 처리 필요)
- 외부 검색엔진(Elasticsearch 등)으로 이전 (운영 스택 증가)
모든 결정을 ADR로 남길 필요는 없다.
보통 아래 수준이면 작성 가치가 높다.
즉:
“나중에 왜 그랬는지 다시 물어볼 가능성이 높은 결정”
이면 ADR 대상이다.
Kafka 사용 결정
이건 ADR이 아니다.
중요한 건:
이다.
ADR은 논문이 아니다.
길고 자세한 문서는 결국 읽히지 않는다.
보통:
정도가 가장 현실적이다.
상황은 바뀐다.
예를 들어:
등으로 인해 과거 결정이 더 이상 최선이 아닐 수 있다.
그래서 ADR은 “불변의 진리”가 아니라:
당시 기준의 합리적 의사결정 기록
으로 보는 것이 중요하다.
GitHub Engineering Blog에서는 ADR의 핵심 가치를 다음처럼 설명한다.

사람은 퇴사한다.
기억은 사라진다.
회의 내용도 잊힌다.
하지만 ADR은 남는다.
특히 규모가 커질수록:
의 가치가 매우 커진다.
즉 ADR은 단순 문서가 아니라:
“아키텍처의 Git Commit Message”
에 가깝다.
실무에서는 아래 방식이 가장 관리하기 편하다.
docs/adr/
0001-use-rabbitmq.md
0002-adopt-fastapi.md
0003-vector-db-milvus.md
번호를 붙이면 추적이 쉽다.
보통 아래 상태를 많이 쓴다.
| 상태 | 의미 |
|---|---|
| Proposed | 제안됨 |
| Accepted | 채택 |
| Deprecated | 폐기 예정 |
| Superseded | 대체됨 |
AI 시스템은 일반 서비스보다 변경 속도가 빠르다.
예:
이런 결정들은 몇 달 뒤 다시 검토될 가능성이 매우 높다.
ADR이 없으면:
문제가 자주 발생한다.
특히 데이터 사이언스/ML 플랫폼 팀에서는 ADR 가치가 상당히 크다.
ADR은 거창한 아키텍처 문서가 아니다.
오히려:
에 가깝다.
좋은 팀일수록:
ADR은 그 기억을 남기는 가장 현실적인 방법 중 하나다.
- ⭐ ADR은 “무엇을 만들었는가”가 아니라 “왜 그렇게 결정했는가”를 기록하는 문서다.
- ⭐ 시간이 지나며 사라지는 의사결정 맥락(Context)을 보존해 중복 논의를 줄이고 온보딩을 빠르게 만든다.
- ⭐ 특히 AI/데이터 시스템처럼 구조 변화가 잦은 프로젝트에서 ADR의 가치가 매우 크다.