소프트웨어 설계는 마법이 아니지만, 잘 하면 마법처럼 느껴질 수 있다
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 초보 개발자 및 경험 많은 개발자 모두에게 유용
- 난이도: 중간 (기본적인 설계 원칙을 설명하지만, 실제 코드 구조에 대한 이해 필요)
핵심 요약
- 소프트웨어 설계는 "스토리텔링"이 아니라 "시스템 구축"이며, 모듈화된 구성 요소로 이루어져야 함
- 모듈 경계는 상태 누수, 무분별한 메서드 호출, 복잡한 로직 침투를 방지하는 핵심 원칙
- 저결합(Loose Coupling)과 높은 응집도(High Cohesion)는 시스템의 유지보수성과 확장성에 직접적인 영향을 미침
섹션별 세부 요약
1. "스토리텔링" 대신 "시스템 구축"
- 설계 부채(design debt)는 기능 개발 과정에서 무시된 설계 결함으로, 추후 유지보수에 큰 부담을 유발
- 모듈화는 재사용성, 테스트 용이성, 확장성을 높이기 위해 필수적
- "기능이 드라마처럼 전개되지 않도록" 하기 위해 책임 분리와 경계 설정이 중요
2. 함수의 "개인 공간" 존중
- 모듈 경계는 코드 내부의 상태 누수를 방지하고, 다른 모듈의 로직을 무분별하게 호출하는 것을 막음
- 예: React 컴포넌트, Express 라우트 핸들러, 서비스 클래스 등은 각각의 책임을 명확히 정의해야 함
- 캡슐화는 API 사용 시 내부 구현을 숨기고, 입력/출력만 정의하는 방식으로 구현
3. "독한 관계"의 코드베이스
- 결합도(Coupling)는 모듈 간 의존성 강도, 응집도(Cohesion)는 모듈 내부의 기능 집중도를 의미
- 고결합은 한 메서드에서 여러 기능(예: 점수 업데이트, 사운드 재생, 로그 기록 등)을 동시에 처리하는 방식으로, 유지보수 시 극심한 문제를 유발
- 고응집도는 인증 모듈 내에서 비밀번호 해싱, 인증 체크, 토큰 생성 등 관련 기능이 모두 모여 있는 것을 의미
4. 설계의 이터레이션적 접근
- 실제 개발에서는 "MVP → 기능 추가 → 재구성" 과정을 반복하며 설계가 진화
- 하드코딩 → 유틸리티 함수 → 헬퍼 모듈 → 재사용 가능한 서비스와 같은 진화 경로 예시
- "두 번 이상 재사용된 코드는 즉시 리팩토링"해야 설계 패턴을 효과적으로 활용 가능
결론
- 모듈 경계 설정과 저결합/고응집도 원칙을 적용하면 유지보수성과 확장성이 크게 향상
- "설계는 단일 작업이 아니라 습관"으로, 코드 재사용 시 즉시 리팩토링을 수행하는 것이 핵심
- "시스템은 처음부터 완벽하게 설계될 필요가 없지만, 이터레이션을 통해 점차 개선"해야 한다는 점을 기억해야 함