---
title: "소프트웨어 아키텍처의 최대 죄악: 상태의 불필요한 분산"
published: 2026-01-16T21:48:41.000Z
canonical: https://jeff.news/article/899
---
# 소프트웨어 아키텍처의 최대 죄악: 상태의 불필요한 분산

아키텍처 인터뷰 경험에서 도출한 핵심 교훈. 소프트웨어의 최악의 우발적 복잡성은 상태의 불필요한 분산, 복제, 재구조화임. 코드는 부채이고 데이터가 자산이므로, 상태를 최소화하고 정규화해서 한 곳에 잘 관리하라는 주장.

소프트웨어 아키텍처 인터뷰를 많이 해본 Samir Talwar가 내린 결론: 아키텍처의 최대 죄악은 **상태(state)의 불필요한 분산, 복제, 재구조화**라는 거임.

- 인터뷰 때 설계 문제가 생기면 대부분의 후보자가 본능적으로 "컴포넌트를 하나 더 추가하자"고 반응함. 단순화가 아니라 복잡화로 가는 거임
- 코드는 부채(liability)이고 데이터가 자산(asset)임. 레거시 코드는 짜증나는 수준이지만, 레거시 데이터는 재앙 수준이 될 수 있음
- "DB에 전 고객의 마지막 주소가 없으면... 영원히 없는 거다" — 데이터는 코드처럼 리팩터링으로 복구가 안 됨
- 실제 사례: 여러 MongoDB 인스턴스에 데이터가 흩어져 있고, 일부만 백업되고, 중복 저장된 조직에서 일해 봤는데, 새 기능에 필요한 데이터가 고객 50%분밖에 없는 상황이 벌어짐
- K8s 디버깅 사례도 나옴. Pod가 왜 재배포됐는지 알고 싶었는데, 쿠버네티스에는 정보의 단일 소스가 없어서 여러 곳을 교차 참조해도 결국 원인을 못 찾았다는 거임
- 상태를 최소화하는 핵심 원칙: 파생 가능한 데이터는 저장하지 말고 계산할 것. 예를 들어 합계를 저장하는 대신 매번 계산하면 됨
- 캐싱은 괜찮지만, 파생 데이터를 "저장"하는 순간 그건 고정된 상태가 되어버려서 스키마 변경 시 마이그레이션 대상이 됨
- 정규화(normalization)가 요즘 인기를 잃었지만, 데이터 중복을 없애고 단일 정본(canonical version)을 참조하게 만드는 가장 좋은 방법임

한 줄 요약: **"상태를 한 곳에 두고, 잘 관리해라(Put your state in one place, and make it good)."**

## 핵심 포인트

- 코드는 부채, 데이터는 자산 — 레거시 데이터는 재앙이 될 수 있음
- 인터뷰 후보자들이 본능적으로 컴포넌트 추가로 문제를 해결하려 함
- 파생 가능한 데이터는 저장하지 말고 계산할 것
- 정규화로 데이터 중복 제거하고 단일 정본을 참조하게 만드는 것이 핵심
- K8s처럼 정보 단일 소스가 없으면 디버깅 자체가 불가능해짐

## 인사이트

상태를 한 곳에 두고 잘 관리하라(Put your state in one place, and make it good). 캐싱은 괜찮지만 파생 데이터를 저장하면 마이그레이션 부채가 됨.
