1. 객체지향 디자인과 시간이 주는 시련
- 객체지향은 프로그래밍은 객체지향 언어를 사용하는것이 아닌 객체지향언어를 잘 활용하는것
- 객체지향 언어를 사용할때 떠올리는 질문들
- 이 구현이 충분히 단순한가? 더 우아한 추상화는 없을까?
- 이 클래스는 생명주기상 여러 상태를 가짐, 어떻게 일관성 있는 상태를 유지하도록 보장할까?
- 외부 시스템과 상호작용시 어떻게 모델링해야 할까?
- 이 클래스가 다른 클래스에 의존재도 좋을까?
- 원서의 제목은 단순한 객체지향 디자인(Simple Object Oriented Design)
- 단순한 객체지향 디자인은 항상 유지보수 하기 쉽게 만듦
2. 단순한 객체지향 시스템 디자인
- 복잡성을 줄이거나 그대로 유지하기 위한 작업을 수행하지 않으면 소프트웨어 시스템은 시간이 지남에 따라 복잡성이 증가한다.
- 시간을 투자해서 복잡성 증가를 억게하는것이 중요
- 단순한 객체지향 디자인이란?
- 단순한 코드
- 일관성 있는 객체
- 잘못된 요청 거부(유효성 검사)해서 일관성 유지?
- 적절한 의존성 관리
- 좋은 추상화
- 외부 의존성과 인프라를 적절히 다룸
- 인프라에 대한 세부사항을 도메인으로 부터 분리
- 잘 모듈화된 구조
- 시스템을 작은 컴포넌트로 나누면 이해하기 쉬워짐
- 본 책에서는 위 주제들을 살펴보며 디자인을 단순화하게 만들고 유지하는것을 살펴봄
3. 일상적인 활동으로서의 단순한 디자인
- 시스템을 진화시키면서 단순하게 유지하기 위해서는 지속적으로 개선하고 단순화해야함
- 복잡성을 줄이기는 개인 위생과 비슷
- 복잡성이 필요할 수도 있지만 영구적이어서는 안됨
- 지속적으로 복잡성을 해결하는 것은 비용 효율적
- 고품질 코드는 좋은 실무 프랙티스를 촉진
- 복잡성 통제는 생각보다 어렵지 않음
- 디자인을 단순하게 유지하는 것은 개발자의 책임
4. 정보 시스템의 아키텍처에 대해 간한히 살펴보기
- 용어 정의
- 프론트엔드: 웹페이지로 구현됨
- 백엔드
- 비즈니스 로직이 존재
- MVC(Model-View-Controller) 프레임워크를 사용
- 컨트롤러: 사용자 요청을 받고 커맨드로 변환
- 엔티티, 서비스, 리포지도리, DTO, 유틸리티 클래스
- 데이터베이스
- 클린아키텍처, DDD, 다른 계층형 아키텍처 등이 익숙하다면 컴포넌트들을 어떻제 조직화해야하는지 나름의 의견을 가지고 있을것
5. 예제: 피그플로우!
- 이 책의 전반에 걸쳐 디자인 패턴을 설명하기 위한 백엔드 시스템
- 직원 관리 시스템
- 구성요소
- 교육(교육과정)
- 직원
- 등록
- 강사
- 보고서
- 관리자
- 피그플로우! 구축팀은 현재 유지보수 문제에 직면
- 버그가 발생하고 있음
- 변경 요구사항을 완료하는데 며칠씩 걸림
6. 연습문제
7. 요약
- 유지보수성을 위해서는 좋은 객체지향이 필요, 이때 핵심 요소는 단순성
- 비즈니스의 복잡성으로 디자인을 단순하게 유지하는것은 쉬운일이 아님, 복잡성 관리를 잘해야함
- 단순하고 유지보수 가능한 객체지향 디자인 특징의 여섯가지
- 단순한 코드
- 일관성 있는 객체
- 적절한 의존성 관리
- 좋은 추상화
- 적절히 다룬 인프라
- 잘 모듈화된 구조
- 복잡성, 디자인을 단순하게 유지하는것은 매일 주의를 기울여야하는 지속적인 과정
- 기존 코드가 이미 좋으면 당연히 좋은 코드를 작성하기 쉬움
- 생상전 증가, 이는 비즈니스 가치를 더 빠르게 창출시킴