본문 바로가기
기타

개발 전 ADR 작성하기

by yonikim 2024. 2. 28.
728x90

 

ADR 이란?


Architecture Decision Records (ADR) 는 소프트웨어 아키텍처와 관련된 중요한 결정 사항을 문서화하고 추적하는 방법으로 사용되는 기록 형식이다. ADR 에는 아키텍처의 주요 측면에 대한 의사 결정과 그 배경, 그리고 결정을 했던 이들의 이유 등을 문서화하여 기록한다.  

 

개발 전 ADR 을 작성하면, 프로젝트 초기에 팀원들 간의 공통된 이해를 형성하고 효과적인 아키텍처 결정을 내릴 수 있게 된다. 이는 향후의 개발 과정에서 일관성을 유지하고 더 나은 솔루션을 발전시킬 수 있도록 도움을 준다.

 

ADR 작성은 당신을 위한 것이 아니라, 미래의 당신을 위한 것

 

ADR 은 내가 내린 결정에 대한 반성 과정이 아니라, 지금부터 6~12개월 후에 이 아키텍처를 결정했을 때의 마인드셋을 기억하는데 도움이 된다. 

ADR 은 결정이 내려지는 시점을 포착하여 회의, 줌, 미팅, Slack, 코드에서 다뤄진 PoC 까지를 모두 포함한다. 

 

 

1. 의사 결정 투명성 강화

ADR 은 팀원들에게 아키텍처 결정에 대한 투명성을 제공한다. 팀원들은 왜 특정 아키텍처 결정을 내렸는지, 어떤 대안이 고려되었는지에 대한 이해를 갖게 되어 협업과 의사소통을 강화할 수 있다.

 

2. 향후 변경에 대한 준비 

ADR 은 향후에 시스템을 변경하거나 확장해야 할 때 유용하다. 왜 특정 아키텍처 선택이 이루어졌는지 문서로 남겨두면, 새로운 팀원이나 현재 팀원이 프로젝트에 참여하는동안 이전 결정을 이해하고 적절한 조치를 취할 수 있다.

 

3. 학습과 지식 공유

ADR 은 팀원 간 지식을 공유하고 향상시키는데 도움이 된다. 팀이 결정의 이유를 명확하게 이해하고 있으면, 팀원들은 더 나은 솔루션을 찾고 적용하는 방법에 대해 학습하게 된다. 

 

4. 의사결정 기록

ADR 은 프로젝트의 아키텍처 결정에 대한 기록을 남긴다. 프로젝트의 발전과 함께 ADR 을 통해 어떤 결정이 있었는지 추적할 수 있다. 이는 향후 프로젝트에서의 비슷한 결정에 대한 참고 자료로 활용될 수 있다.

 

5. 토론과 검토를 촉진

ADR 작성은 아키텍처 결정에 대한 토론과 검토를 유도할 수 있다. 팀원들간 의견을 모으고 각자의 관점을 제시하면서 더 나은 결정을 내릴 수 있도록 돕는다. 

 

ADR Template


ADR 형식은 정하기 나름이지만, 일반적으로 아래 항목들을 기재한다.

 

1. 제목(Title)

2. 상태(Status): 제안(Proposed), 채택됨(Accepted), 거부됨(Rejected), 대체됨(Superseded)

3. 컨텍스트(Context): 해결하고자 하는 문제를 정의한다.

4. 결정(Decision): 제안하고자 하는 내용 및 해당 결정의 이유에 대해 설명한다. 

5. 결과(Consequences): 결정을 통해 사용자가 받는 영향에 대해 정의한다.

 

Sample

 


 

좀 더 자세하게 작성해보기

 

0. 요약

저자 (Author)

  • 구성원 1

리뷰어 (Reviewer)

  • 구성원 1
  • 구성원 2

요약 

⚠️ 세 줄 요약

 

1. 문제 정의 (Problem Statement / As-Is)

배경 (Background)

⚠️ 현재 상황을 설명하고 개발자로써 어떻게 해결할 것인가?

필수 조건 (Requirements)

⚠️ 개발한 시스템의 성공 조건

목표 (Goals)

  • 목표1
  • 목표2

목표가 아닌 것 (Non-Golas)

⚠️ 독자가 목표를 헷갈려 하는 경우를 대비해 목표가 아닌 것을 명시

평가 (Measurement)

⚠️ 시스템의 성공과 실패를 어떻게 평가할 것인가?
실험 지표(Metrics) 일 수도 있고, 개발완료/실패 혹은 일정 내 수행 등 Binary 일 수도 있다.

예상 트래픽 (Expected Traffic)

⚠️ 해당 기능의 타겟 유저수나 예상되는 인입 트래픽 기술

 

2. 해결 방안 (Proposed Solution / To-Be)

설계 (Architecture)

⚠️
- 이 프로젝트가 구현되는 전반적인 설계를 설명
- 세부 설계가 설명되어야 하며, 설계가 여러 프론트/백엔드 혹은 high/low 레벨로 나뉠 수 있다면 섹션을 나누고 명확하게 설명 (독자가 문서만 보고 온전히 이해할 수 있어야 함)
- 비쥬얼 다이어그램 첨부 필수

구현 (Implementation)

스택 (Tech Stack Choices)

⚠️ 어떤 언어, 오픈소스, 솔루션을 어느 코드베이스에서 사용할지, 왜 그렇게 선택했는지 간략하게 설명

 

테스트 (Testing)

  • Integration Tests
  • Unit Tests
  • Manual QA Tests

서버 간 호출 flow (API Call flow)

⚠️ 해당 기능을 호출하는 다른 서비스들의 API Endpoint 와 서버 간 다이어그램을 그리고 첨부

 

코드리뷰 (Reviews)

⚠️ 누가 이 프로젝트의 코드를 리뷰할 것인가?

서비스 수준 협약 (SLA)

⚠️ 이 시스템/서비스의 SLA 가 무엇인가?
  • 응답시간 혹은 가용시간 으로 측정 가능
    • uptime 99.99%
    • latency avg: 500ms, p95 - 2000ms 

경보/모니터링 (Alerts/Monitoring)

⚠️ 시스템/서비스가 fail 했을 경우 어떻게 알람을 받고, 어떻게 대응할 것인가?
슬랙 모니터링 채널의 exception 이름 혹은 grafana pannel alert 등 어떤 알람인지 구체적으로 구분 가능하도록 작성 

보안 (Security)

⚠️
- 유저의 개인정보를 노출하는가?
- API 가 FQDN 이 아닌 외부 도메인을 통해 호출 가능한가?
- 리소스 자원의 소유권 검사가 적절하게 이뤄졌는가? 

 

3. 런치 (Rollout)

계획 (Plan)

⚠️
- 어떻게 이 시스템/서비스를 적용할 것인가?
- 배포시 즉시 적용되는가?
- 어떤 실험/마이그레이션/테스팅이 필요한가?
- Feature 들을 단계적으로 배포하는가?
- 실험 혹은 Feature Flag 가 지정되어 있는가?
- 실험 혹은 Feature Flag 이름은 무엇인가? 

배포 (Deploy)

⚠️ 어떻게 배포할 것인가?

온콜 (Runbooks/Oncall)

⚠️ 온콜 엔지니어는 누구인가?
- 상황 발생시 문의/대응 하는 인력을 의미
- 온콜 시 대응 가능한 방안이 있다면 구체적으로 함께 기술

 

4. 타임라인 (Timeline)

로드맵 (Roadmap/Milestones)

⚠️ 단계적 마일스톤을 항목으로 표기

 

5. 대안 (Alternatives Considered)

⚠️ 구현을 위해 생각했던 대안 명시

 

6. 참조 (Additional Context)

⚠️ 참조한 자료들, 동료와의 대화들 등 기재

 

 

 

References 

https://github.blog/2020-08-13-why-write-adrs/

728x90

'기타' 카테고리의 다른 글

네이버 검색에서 티스토리 노출하기  (2) 2023.11.19
[Copilot] 이제 코딩도 AI  (0) 2021.07.20
[서비스] Airbyte 도입기  (0) 2021.04.22