모든게 복잡도 관리다

1. 객체지향 디자인과 시간이 주는 시련

  • 객체지향은 프로그래밍은 객체지향 언어를 사용하는것이 아닌 객체지향언어를 잘 활용하는것
  • 객체지향 언어를 사용할때 떠올리는 질문들
    • 이 구현이 충분히 단순한가? 더 우아한 추상화는 없을까?
    • 이 클래스는 생명주기상 여러 상태를 가짐, 어떻게 일관성 있는 상태를 유지하도록 보장할까?
    • 외부 시스템과 상호작용시 어떻게 모델링해야 할까?
    • 이 클래스가 다른 클래스에 의존재도 좋을까?
  • 원서의 제목은 단순한 객체지향 디자인(Simple Object Oriented Design)
  • 단순한 객체지향 디자인은 항상 유지보수 하기 쉽게 만듦

2. 단순한 객체지향 시스템 디자인

  • 복잡성을 줄이거나 그대로 유지하기 위한 작업을 수행하지 않으면 소프트웨어 시스템은 시간이 지남에 따라 복잡성이 증가한다.
  • 시간을 투자해서 복잡성 증가를 억게하는것이 중요
  • 단순한 객체지향 디자인이란?
    • 단순한 코드
      • 클래스와 메서드의 크기를 작게 유지
    • 일관성 있는 객체
      • 잘못된 요청 거부(유효성 검사)해서 일관성 유지?
    • 적절한 의존성 관리
      • 클래스간 의존성을 최소화
    • 좋은 추상화
      • 추상화를 통해 적절한 확장을 가능하게 함
    • 외부 의존성과 인프라를 적절히 다룸
      • 인프라에 대한 세부사항을 도메인으로 부터 분리
    • 잘 모듈화된 구조
      • 시스템을 작은 컴포넌트로 나누면 이해하기 쉬워짐
  • 본 책에서는 위 주제들을 살펴보며 디자인을 단순화하게 만들고 유지하는것을 살펴봄

3. 일상적인 활동으로서의 단순한 디자인

  • 시스템을 진화시키면서 단순하게 유지하기 위해서는 지속적으로 개선하고 단순화해야함
    • 복잡성을 줄이기는 개인 위생과 비슷
    • 복잡성이 필요할 수도 있지만 영구적이어서는 안됨
    • 지속적으로 복잡성을 해결하는 것은 비용 효율적
    • 고품질 코드는 좋은 실무 프랙티스를 촉진
    • 복잡성 통제는 생각보다 어렵지 않음
    • 디자인을 단순하게 유지하는 것은 개발자의 책임

4. 정보 시스템의 아키텍처에 대해 간한히 살펴보기

  • 용어 정의
    • 프론트엔드: 웹페이지로 구현됨
    • 백엔드
      • 비즈니스 로직이 존재
      • MVC(Model-View-Controller) 프레임워크를 사용
        • 컨트롤러: 사용자 요청을 받고 커맨드로 변환
        • 엔티티, 서비스, 리포지도리, DTO, 유틸리티 클래스
    • 데이터베이스
  • 클린아키텍처, DDD, 다른 계층형 아키텍처 등이 익숙하다면 컴포넌트들을 어떻제 조직화해야하는지 나름의 의견을 가지고 있을것

5. 예제: 피그플로우!

  • 이 책의 전반에 걸쳐 디자인 패턴을 설명하기 위한 백엔드 시스템
  • 직원 관리 시스템
    • 교육 과정을 통한 지구언의 성장 관리
  • 구성요소
    • 교육(교육과정)
    • 직원
    • 등록
    • 강사
    • 보고서
    • 관리자
  • 피그플로우! 구축팀은 현재 유지보수 문제에 직면
    • 버그가 발생하고 있음
    • 변경 요구사항을 완료하는데 며칠씩 걸림

6. 연습문제

7. 요약

  • 유지보수성을 위해서는 좋은 객체지향이 필요, 이때 핵심 요소는 단순성
  • 비즈니스의 복잡성으로 디자인을 단순하게 유지하는것은 쉬운일이 아님, 복잡성 관리를 잘해야함
  • 단순하고 유지보수 가능한 객체지향 디자인 특징의 여섯가지
    • 단순한 코드
    • 일관성 있는 객체
    • 적절한 의존성 관리
    • 좋은 추상화
    • 적절히 다룬 인프라
    • 잘 모듈화된 구조
  • 복잡성, 디자인을 단순하게 유지하는것은 매일 주의를 기울여야하는 지속적인 과정
  • 기존 코드가 이미 좋으면 당연히 좋은 코드를 작성하기 쉬움
    • 생상전 증가, 이는 비즈니스 가치를 더 빠르게 창출시킴