# 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

### Related Concepts
- [[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*
