소프트웨어 설계 5강. 아키텍처와 디자인 패턴
좋은 설계의 기준은 딱 두 낱말로 요약됩니다. 안은 단단하게, 밖과는 느슨하게. 시험은 이 두 낱말을 각각 일곱 단계로 쪼개 물어봅니다.
풀고 시작
응집도는 높이고 결합도는 낮춘다
모듈을 잘 나눴는지 재는 자가 둘 있습니다. 응집도(cohesion)는 한 모듈 안의 요소들이 얼마나 한 가지 일에 집중하는지이고, 결합도(coupling)는 모듈끼리 얼마나 얽혀 있는지입니다. 목표는 늘 같습니다. 응집도는 높이고 결합도는 낮추는 것이죠. 안이 단단해야 그 모듈만 이해하면 되고, 밖과 느슨해야 남을 고칠 때 나까지 부서지지 않습니다.
시험은 일곱 단계의 순서를 묻습니다. 표로 붙여서 보시면 방향이 눈에 들어옵니다.
| 응집도 (높은 쪽이 좋음) | 결합도 (낮은 쪽이 좋음) |
|---|---|
| 기능적 응집도 (가장 강함) | 자료 결합도 (가장 약함) |
| 순차적 응집도 | 스탬프 결합도 |
| 교환적 응집도 | 제어 결합도 |
| 절차적 응집도 | 외부 결합도 |
| 시간적 응집도 | 공통 결합도 |
| 논리적 응집도 | 내용 결합도 (가장 강함) |
| 우연적 응집도 (가장 약함) |
응집도의 최고는 기능적 응집도로, 모듈 안 요소가 모두 하나의 기능을 위해 존재합니다. 최악은 우연적 응집도로, 아무 관련 없는 것들이 그냥 한 파일에 모여 있는 상태죠. 흔히 보는 유틸리티 모음 파일이 여기 해당합니다.
결합도의 최악은 내용 결합도입니다. 다른 모듈의 내부 데이터를 직접 건드리는 것이라 상대를 조금만 고쳐도 무너집니다. 그 다음이 공통 결합도로, 전역 변수를 여럿이 함께 쓰는 상태입니다. 전역 변수를 쓰지 말라는 잔소리에는 이런 근거가 있습니다.
팬인(fan-in)과 팬아웃(fan-out)도 함께 나옵니다. 팬인은 나를 호출하는 모듈의 수, 팬아웃은 내가 호출하는 모듈의 수입니다. 팬인이 높으면 재사용이 잘 되고 있다는 뜻이라 좋고, 팬아웃이 높으면 내가 너무 많은 것을 지휘하고 있다는 뜻이라 줄이는 편이 좋습니다.
아키텍처 패턴은 건물의 뼈대입니다
소프트웨어 아키텍처는 시스템의 큰 뼈대와 구성 요소 사이의 관계를 정한 설계입니다. 필립 크루첸이 제안한 4+1 뷰는 이 뼈대를 다섯 시선으로 나눠 봅니다. 사용자 관점의 유스케이스 뷰가 가운데 있고, 그것을 논리 뷰, 구현 뷰, 프로세스 뷰, 배포 뷰가 둘러쌉니다.
자주 나오는 아키텍처 패턴은 넷입니다. 계층화(layered) 패턴은 표현, 업무 논리, 데이터 접근처럼 층을 쌓고 아래층만 부르게 합니다. 클라이언트-서버 패턴은 서비스를 주는 쪽과 받는 쪽을 나눕니다. 파이프-필터 패턴은 처리 단계를 필터로 만들고 데이터를 파이프로 흘려보냅니다. 유닉스 명령을 파이프로 잇는 그 방식이죠. MVC 패턴은 모델과 뷰와 컨트롤러로 나눠, 데이터와 화면과 제어를 분리합니다.
MVC에서 자주 틀리는 지점은 역할 배분입니다. 모델은 데이터와 업무 규칙, 뷰는 사용자에게 보이는 화면, 컨트롤러는 입력을 받아 모델과 뷰를 연결하는 중개자입니다. 화면에 보여 줄 데이터를 계산하는 일이 뷰가 아니라 모델의 몫이라는 점이 핵심입니다.
GoF 디자인 패턴 23가지, 세 무더기
1994년 네 명의 저자가 반복해서 등장하는 설계 해법 23가지를 정리한 책을 냅니다. 저자가 넷이라 GoF(Gang of Four)라고 불리죠. 패턴은 목적에 따라 셋으로 묶입니다.
생성 패턴은 객체를 어떻게 만드는가를 다룹니다. 다섯 가지로, 추상 팩토리, 빌더, 팩토리 메서드, 프로토타입, 싱글톤입니다. 싱글톤은 인스턴스가 딱 하나만 존재하도록 보장하는 패턴으로 시험 단골입니다.
구조 패턴은 클래스와 객체를 어떻게 조합하는가를 다룹니다. 일곱 가지로, 어댑터, 브리지, 컴포지트, 데코레이터, 퍼사드, 플라이웨이트, 프록시입니다. 어댑터는 호환되지 않는 인터페이스를 이어 주는 변환기이고, 프록시는 대리인을 세워 실제 객체 접근을 통제합니다.
행위 패턴은 객체 사이의 상호작용과 책임 분배를 다룹니다. 열한 가지로, 책임 연쇄, 커맨드, 인터프리터, 반복자, 중재자, 메멘토, 옵서버, 상태, 전략, 템플릿 메서드, 방문자입니다. 옵서버는 한 객체가 바뀌면 그것을 구독하던 객체들에게 자동으로 알리는 패턴입니다.
5-7-11이라는 개수만 외워 두셔도 절반은 맞힙니다. 어느 무더기에 속하냐를 묻는 문제가 가장 흔하거든요.
여기까지가 설계입니다. 다음 과목에서는 이 설계가 코드와 자료구조로 내려앉는 과정을 봅니다.
인출 문제
생각해볼 질문 (정답 없음)
패턴을 아는 것과 패턴을 쓰는 것은 다릅니다. 이름 붙은 해법을 먼저 떠올리는 습관이 설계를 돕는 순간과 방해하는 순간은 각각 어떤 때일까요.
이전: 4강 화면 설계와 UI · 다음: 2과목 1강 자료구조와 정렬·탐색