본문 바로가기
App 설계

DDIA - 신뢰성,확장성,유지보수성 - 유지보수성

by ocwokocw 2021. 10. 25.

- 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다.

- 개요

S/W 는 대부분 개발보다 유지보수를 할 때 많은 비용이 들어간다. 이런 유지보수에는 일반적으로 다음과 같은 항목들이 있다.

  • 버그 수정
  • 시스템 운영 유지보수
  • 신규플랫폼 적용
  • 기술채무 상환
  • 신규 기능 추가

유지보수의 고충을 최소화하기 위해서는 지켜야하는 설계 원칙이 있다.

  • 운용성: 운영팀이 시스템을 운영하기 쉽게 해야 한다.
  • 단순성: 복잡도를 최대한 제거하여 새로운 엔지니어가 최대한 이해하기 쉬워야 한다.
  • 발전성: 이후에 시스템을 쉽게 변경할 수 있어야 한다.

신뢰성과 확장성을 달성하는것은 그리 간단하지 않다. 그래서 위의 3 가지 항목을 염두해두면서 기본적으로 유지보수성을 달성하기위해 노력해야 한다.


- 운영성

좋은 운영팀은 일반적으로 아래와 같은 활동들을 수행한다.

  • 시스템 모니터링 중 상태가 좋지 않으면 빠르게 복원
  • 장애, 성능저하 원인 추적
  • 미래에 발생하능 문제를 예측해 발생전 해결(ex - 용량 문제)
  • 설정변경으로 생기는 시스템 보안 유지보수

운영성을 좋게하면 단순한 반복 Task 를 쉽게 수행하게 만들 수 있고, 운영팀은 고부가가치 활동을 할 수 있는 기회가 많아 진다.

  • 좋은 모니터링은 runtime 동작과 시스템 내부에 대한 가시성 제공
  • 표준도구를 통한 자동화와 통합을 위한 우수한 지원 제공
  • 좋은 문서와 이해하기 쉬운 운영모델(X를 하면 Y가 발생한다.)을 제공
  • 적절한 자기 회복기능

 


- 단순성(복잡도 관리)

복잡도가 증가하면 여러 가지 증상이 나타난다.

  • 상태공간 급증
  • 모듈 결합도 증가
  • 복잡한 의존성
  • 임시방편으로 문제를 해결하는 특수 사례 들의 등장

시스템을 단순화 한다는것은 기능을 줄인다는 의미가 아니라 우발적인 복잡도를 줄이는것을 의미한다. 우발적인 복잡도를 줄이는데에 가장 좋은 도구는 추상화이다.

 

우리가 흔히 사용하는 고수준의 언어들도 기계언어, CPU 레지스터, 시스템 호출을 숨기는 추상화라고 할 수 있으며, SQL 도 디스크에 기록하고 메모리에 저장된 복잡한 데이터구조를 추상화한것이라고 볼 수 있다.


- 발전성

시스템의 요구사항은 계속 변한다. 특이 케이스들이 등장하며 비즈니스의 우선순위가 변경되고, 새로운 기능 요청이 들어오면 이런 사항들에 대해 적절히 대응해야 한다.

 

애자일 작업패턴은 변화에 적응하기 위한 프레임워크를 제공한다. 또한 애자일 커뮤니티는 TDD, 리팩토링을 등을 개발한다. 하지만 이런 기법들은 규모가 매우 작고 로컬 규모에 초점이 주로 맞추어져 있다. 이 책에서는 대규모 데이터 시스템 수준에서 민첩성을 높이는 방법을 알아보도록 할 것이다.

댓글