안녕하세요. 인포그랩 프로덕트 팀에서 백엔드 엔지니어로 근무하는 Andy입니다. 프로젝트를 진행하다 보면 여러 가지 이유로 기술 부채가 쌓이는데요. 기술 부채를 어감상 부정적으로 생각하기 쉽지만 모든 기술 부채가 나쁜 건 아닙니다. 이를 잘 관리하면 개발을 진전시키는 데 도움이 되죠. 그러나 기술 부채를 잘 관리하지 못하면 개발 생산성과 비즈니스에 부정적 영향을 미칠 수 있는데요. 따라서 평소 기술 부채 특징과 관련 모범 관행을 학습하는 건 매우 중요합니다. 이 글에서는 기술 부채 개념과 유형, 해결 방법을 살펴보고, 인포그랩 프로덕트 팀의 기술 부채 관리 방식을 소개하겠습니다.
기술 부채 개념과 유형
‘기술 부채(Technical Debt)’ 용어 정의는 1992년 컴퓨터 프로그래머 워드 커닝햄이 고안했습니다. 이 는 ‘시간이 더 걸릴 수 있는 더 나은 접근 방식을 취하는 대신 쉽지만 제한된 솔루션을 선택할 때 필요한, 향후 재작업의 암묵적 비용’입니다. 또는 ‘가장 효과적인 솔루션이 아닌 가장 빠른 솔루션을 선택하면서 발생한 추가 작업 비용’을 뜻하기도 하죠.
소프트웨어 엔지니어인 크리스 리코미니, 드미트리 리아보이는 『필독! 개발자 온보딩 가이드: 지속 가능한 소프트웨어와 원활한 협업 문화를 이해하는 프로페셔널 개발자의 탄생』에서 기술 부채를 이렇게도 설명합니다.
금융 부채와 마찬가지로 기술 부채에도 원금과 이자가 있다. 원금은 수정해야 할 원래의 단점을 의미한다. 이자는 본질적인 단점을 수정하지 않고 코드를 개선할 때 발생하는 비용을 뜻하며, 차선책을 택해 구현하면서 점차 복잡도가 올라가는 것을 의미한다. 이와 같은 차선책이 계속 복제되고 자리를 잡다 보면 이자도 더 늘어난다. 점점 더 많은 코드가 복잡해지고 결함도 생겨난다.
기술 부채 개념은 시간이 지나면서 더 구체화됐는데요. 2009년 소프트웨어 엔지니어 마틴 파울러는 기술 부채를 2차원 매트릭스로 설명하며, 아래 그림과 같이 유형을 구분했습니다.

위 그림을 보면 다음과 같은 기준이 있죠.
- Reckless(신중하지 못한), Prudent(신중한)
- Inadvertent(의도하지 않은), Deliberate(의도적인)
위 기준을 중심으로 4가지 기술 부채 유형을 자세히 알아보겠습니다.
1. 신중하고 의도적인 기술 부채(Prudent & Deliberate)
이는 팀이 부채를 지고 있다는 걸 알지만 ‘더 빠른 출시 보상이 부채 상환 비용보다 더 큰지’ 여부를 고려한 건데요. 이러한 기술 부채는 개발 속도와 출시일의 트레이드오프를 신중히 고려한, 실용적인 결과입니다. 보편적으로 발생하는 기술 부채 유형이기도 하고요. 신중하고 의도적인 기술 부채는 위 그림에서 “We must ship now and deal with consequences(지금 출시하고, 결과를 처리해야 한다)”에 해당합니다.
2. 신중하지 못하고, 의도적인 기술 부채(Reckless & Deliberate)
이는 좋은 설계 관행을 알고, 실천할 수 있지만 깔끔한 코드를 작성할 시간이 없어 ‘빠르고 지저분하게’ 진행하기로 한 결과인데요. 이러한 기술 부채는 팀이 출시일 압박을 받을 때 생기 고요. 고객의 긴급한 요구사항을 맞춰야 할 때, 예기치 못한 장애로 기능을 급히 수정해야 할 때 충분한 설계 없이 개발하다 이 부채가 발생할 수도 있습니다. 신중하지 못하고, 의도적인 기술 부채는 위 그림에서 “We don’t have time for design(설계할 시간이 없다)”에 해당합니다.
3. 신중하되, 의도하지 않은 기술 부채(Prudent & Inadvertent)
이는 좋은 소프트웨어를 개발했고, 코드도 깔끔했지만 시간이 지나서야 ‘설계가 어땠어야 한다’는 걸 깨달은 결과입니다. 이러한 기술 부채는 성장 과정에서 자연스럽게 나타나죠. 예를 들어, 웹 애플리케이션을 개발할 때, 초기 설계 단계에서 모든 데이터를 단일 데이터베이스(DB)에 저장하도록 구현했는데요. 당시에 최적의 선택이었더라도 나중에 DB 부하가 커져 분산 DB로 전환해야 하면 이 부채가 생긴 걸로 볼 수 있습니다. 신중하되, 의도하지 않은 기술 부채는 위 그림에서 “Now we know how we should have done it(‘우리가 어떻게 해야 했는지’ 이제 알겠다)”에 해당합니다.