Ch11. 시스템
레이 오지 (MS CTO) "복잡성은 죽음. 개발자에게서 생기를 앗아가며, 제품을 계획하고 제작하고 테스트하기 어렵게 만든다"
- 시스템 제작(construction) 과 사용(use) 을 분리하라
- S/W 시스템은 준비 과정 (app 객체 제작, 의존성 연결 등) 과 그 이후의 런타임 로직을 분리해야 한다
- 관심사 분리는 오래되고 중요한 설계 기법 중 하나. 대다수 app은 시작단계라는 관심사를 분리하지 않는다.
- Factory: 때론 객체가 생성되는 시점을 app이 결정할 필요도 생긴다.
- 의존성 주입 : 사용과 제작을 분리하는 강력한 메커니즘 중 하나
- 확장
- 의사결정을 최적화 : 모듈을 나누고 관심사를 분리하면 지엽적인 관리, 결정이 가능해진다
- 시스템은 도메인 특화 언어 (Domain-Specific Language,DSL) 가 필요하다.
결론
- 깨끗하지 못한 아키텍처는 도메인 논리를 흐리며 기민성을 떨어뜨린다.
- 모든 추상화 단계에서 의도는 명확히 표현해야 한다.
* 관심사 분리?
- 소프트웨어 개발에서 각각의 모듈이나 컴포넌트가 명확한 책임을 가지고 특정 관심사만 처리하도록 설계하는 원칙이며
- 이를 통해 코드의 가독성, 재사용성, 유지보수성을 높이는 것이 목표
관심사 (Concern)란?
- 소프트웨어에서 특정 기능, 역할, 혹은 책임을 의미. 예: 데이터베이스 접근, 사용자 인터페이스, 비즈니스 로직 등.
분리 (Separation)란?
- 서로 다른 관심사가 뒤섞이지 않도록 모듈화하거나 계층화하는 것.
- 각 모듈은 자신에게 주어진 역할만 수행하고 다른 관심사에는 의존하지 않도록 설계한다.
예시
- MVC 패턴 (Model-View-Controller)
- Model: 데이터 및 비즈니스 로직 관리.
- View: 사용자에게 데이터를 표시.
- Controller: 사용자의 입력을 처리하고 Model과 View를 연결. 관심사를 분리해 각 구성요소가 자신의 역할에만 집중하도록
- 레이어 아키텍처
- 프레젠테이션 계층: 사용자 인터페이스 처리.
- 애플리케이션 계층: 비즈니스 로직 수행.
- 데이터 계층: 데이터 저장 및 관리. 각 계층은 명확한 책임을 가지며, 다른 계층의 내부 구현에 의존하지 않는다.
- CSS와 JavaScript 분리
- HTML: 구조 정의.
- CSS: 디자인 및 스타일 정의.
- JavaScript: 동작 정의.
장점
- 가독성 향상: 각 모듈이 하나의 관심사에 집중하므로 코드가 명확해진다
- 유지보수 용이: 변경 사항이 생겼을 때 다른 부분에 미치는 영향을 최소화.
- 재사용성 증가: 관심사가 분리된 코드는 다른 프로젝트나 모듈에서도 쉽게 활용할 수 있다.
- 테스트 용이: 독립적인 관심사를 가진 모듈은 단위 테스트를 수행하기 쉽다
적용 시 주의점
- 과도한 분리: 지나치게 세분화하면 오히려 복잡성이 증가할 수 있다.
- 의존성 관리: 관심사를 분리했더라도 의존성이 얽히면 효과가 떨어질 수 있다.
- 명확한 경계 설정: 모듈의 책임과 역할을 명확히 정의해야 한다.
도메인 특화 언어 (Domain-Specific Language, DSL)
특정 도메인이나 문제 영역에 특화되어 설계된 프로그래밍 언어나 스크립트 언어를 의미
범용 프로그래밍 언어(General-Purpose Language, GPL)와 달리, 특정 작업을 더 간결하고 효율적으로 표현할 수 있도록 설계
DSL의 유형
- 내부 DSL (Internal DSL)
- 기존 범용 언어 위에서 DSL을 구축
- 예: Ruby의 RSpec, Python의 Flask 라우팅
- 외부 DSL (External DSL)
- 독립적인 언어로 설계되어, 별도의 파서와 인터프리터 또는 컴파일러가 필요
- 예: SQL, HTML, 정규표현식
'프로그래밍&IT > 학습, 책' 카테고리의 다른 글
[클린 코드] 7. 동시성, 개선, 휴리스틱 (0) | 2025.01.19 |
---|---|
[클린 코드] 6. 창발성 (0) | 2025.01.15 |
[클린 코드] 5. 오류처리, 경계, 단위테스트 (0) | 2025.01.12 |
[클린 코드] 4. 객체와 자료구조 (0) | 2025.01.09 |
[클린 코드] 3. 함수 / 주석 / 형식 맞추기 (0) | 2025.01.06 |