Files
2nd/10_Wiki/Topics/Software Maintenance & Evolutionary Design.md
T

4.0 KiB

Software Maintenance & Evolutionary Design (소프트웨어 유지보수 및 진화적 설계)

📌 Brief Summary

소프트웨어 유지보수(Software Maintenance)는 시스템 배포 이후 발생하는 결함 수정, 성능 개선, 환경 변화에 대한 적응을 포함하는 소프트웨어 생명주기의 가장 긴 단계이자 핵심 과정입니다 [1]. 현대 소프트웨어 공학에서는 이를 단순한 수리를 넘어 **진화적 설계(Evolutionary Design)**의 과정으로 보며, 개발자가 기존 시스템의 **멘탈 모델(Mental Model)**을 구축하고 가설을 검증하며 지식을 확장해 나가는 인지적 활동으로 정의합니다 [1-3].

📖 Core Content

1. 유지보수의 4대 범주 (Maintenance Categories)

  • 교정형 (Corrective): 발견된 결함(Bugs)을 수정하여 시스템을 정상화하는 작업입니다.
  • 적응형 (Adaptive): 운영 체제, 하드웨어, 라이브러리 등 환경 변화에 대응하여 시스템을 수정하는 작업입니다.
  • 완전형 (Perfective): 시스템의 기능을 개선하거나 성능을 최적화하여 가치를 높이는 작업입니다.
  • 예방형 (Preventive): 잠재적 결함을 예방하고 유지보수성을 높이기 위해 리팩토링 등을 수행하는 작업입니다.

2. 기술 부채 (Technical Debt)

  • 개념: 빠른 배포를 위해 타협한 설계적 결정이 시간이 지남에 따라 복잡성과 비용을 증가시키는 현상입니다.
  • 관리 지표 (Behavioral Analysis): 단순한 코드 스캔을 넘어 Git 히스토리를 분석하여 자주 수정되고 복잡도가 높은 **'핫스팟(Hotspots)'**과 **'코드 건강도(Code Health)'**를 추적함으로써 부채의 우선순위를 결정합니다 [1, 2, 5].

3. 클린 vs. 추적 가능성 (Clean vs. Traceable Code)

  • 딜레마: 고도의 추상화와 결합도 제거를 추구하는 '클린 아키텍처'는 개별 모듈의 이해도를 높이지만, 실행 흐름을 파악하기 위해 수많은 모듈을 넘나들어야 하므로 시스템 전체의 '추적 가능성'을 저해하고 **외부적 인지 부하(Extraneous load)**를 가중시킬 수 있습니다 [3, 4].

⚠️ Trade-offs & Caveats

  • 부분 이해의 효율성: 거대 시스템에서 모든 코드를 완벽히 파악(Full Understanding)하려는 시도는 비효율적입니다. 목적에 맞는 특정 영역의 **'부분적 이해(Partial Understanding)'**를 극대화하는 기회주의적 전략이 필요합니다 [14].
  • 부채의 임계치: 기술 부채가 특정 임계치(코드 건강도 6점 이하)를 넘어서면 새로운 기능 개발보다 결함 수정에 더 많은 비용이 발생하는 '기술적 파산' 상태에 이를 수 있습니다.

🔗 Knowledge Connections

  • Program Comprehension Strategies: 유지보수를 위해 코드를 읽고 멘탈 모델을 구축하는 구체적인 기법입니다.
  • Cognitive Load & Mental Models: 유지보수 작업 중 발생하는 작업 기억의 한계와 복잡성 관리 전략을 다룹니다.
  • Legacy Systems: 문서화되지 않은 의존성과 부채가 누적된 시스템을 다루는 전략입니다.

Deeper Research Questions

  • 자동화된 품질 게이트(Quality Gates)가 팀의 기술 부채 인식과 상환 의지에 실질적으로 어떤 심리적/구조적 영향을 미치는가?
  • 마이크로서비스 환경에서 파편화된 기술 부채가 시스템 전체의 신뢰성(Systemic Reliability)에 미치는 파급 효과를 어떻게 측정할 것인가?

Practical Application Contexts

  • Operation: CodeScene 등의 도구를 도입하여 커밋 빈도와 복잡도가 결합된 핫스팟을 시각화하고 우선 리팩토링 대상을 선정합니다 [5].
  • Implementation: 기존 동작을 보존하기 위한 단위 테스트를 먼저 구축한 후, 기능적 훼손 없이 단계적으로 부채를 상환합니다 [4].

Last updated: 2026-05-02