소프트웨어 설계의 중요성
개념을 깊이 이해하려면 한발 물러서야 한다. 처음엔 보이지 않던 연결고리를 통해 소프트웨어에 대해 많은 것을 배울 수 있다.
건축과 소프트웨어의 유추
집 짓기에서 얻은 통찰
- 집을 구입하며 작고 사소해 보이는 디테일들이 얼마나 중요한지 체감
- 콘센트 위치, 조명, 타일, TV 배치(설거지 중 스트리밍 가능한 위치) 등 모든 것이 중요
- 건설 현장에서 인치 단위까지 따지는 정밀함을 보며 자신의 작업에 충분한 주의를 기울이고 있는지 반문
계획 없는 시공 = 무모함
- 리팩토링과 재작성은 불가피하다는 통념 → 디테일에 신경 쓸 필요가 없다는 안일함으로 이어짐
- “설계도 없이 벽돌을 쌓기 시작하는 건 애자일이 아니라 무모함이다”
- 너무 자주, 너무 서둘러, 제약이나 설계 없이 개발을 시작 → 아키텍처가 개발 진행 중에 즉흥적으로 형성됨
소프트웨어 설계란 무엇인가
논리를 넘어선 창의성과 아름다움
- 집의 본질은 큰 사각형 구조물이지만, 내부 배치는 무수히 창의적인 방식으로 구성 가능
- 서비스의 본질은 JSON을 반환하는 엔드포인트지만, 아키텍처는 얼마든지 다양하게 설계 가능
- 집에서 침실의 전망, 잘 갖춰진 주방, 넓은 거실을 원하듯 → 소프트웨어에도 미적·기능적 설계 가치가 존재
소프트웨어 설계의 핵심 목표
| 목표 | 설명 |
|---|---|
| 명확한 경계와 책임 | 모듈 간 역할 분리로 응집도 높은 구조 |
| 확장성 | 변경 영향 최소화, 기능 추가 용이 |
| 테스트 가능성 & 예측 가능성 | 안정적인 동작 보장 |
| 생산적인 개발 경험 | 기술 부채 관리가 아닌 창의적 작업 가능 |
- 모든 컴포넌트를 단일 파일에 넣을 수도 있지만 → 그렇게 하지 않는 이유는 명확한 규칙으로 통신하는 모듈 기반 구조를 원하기 때문
설계는 복잡성과의 싸움
- 명확한 변수명 → 모호함 감소
- 범용 함수와 추상화 → 재사용성 향상
- 모듈/클래스 내부에 복잡성 숨기기 → 외부 단순성 확보
누구나 소프트웨어 제품을 만들고 떠날 수 있다. 하지만 지속적으로 확장되고 수정될 무언가를 만들려면 신중함과 배려가 필요하다.
- 소프트웨어 설계에 집중하면 아키텍처 문제를 사전에 파악하여 준비 없이 맞닥뜨리는 상황을 방지
- 좋은 아키텍처는 우연히 만들어지지 않는다 — 의도적인 사고와 행동이 필요
설계는 개발자만의 문제가 아니다
제품과 비즈니스에도 직결
- 성공적인 소프트웨어 프로젝트는 긴 수명을 가지며 지속적으로 변화하고 진화
- 아키텍처가 이를 뒷받침하지 못하면:
- 제품 개발 전체가 고통받음
- 개발자들이 우회책을 찾아 헤맴
- 새 기능마다 대규모 기술 부채 누적
핵심 명제
“무엇을 만드는가” 만큼 “어떻게 만드는가”가 중요하다.