만들면서 배우는 클린 아키텍처

자바 코드로 구현하는 클린 웹 애플리케이션

우리 모두는 낮은 개발 비용으로 유연하고 적응이 쉬운 소프트웨어 아키텍처를 구축하고자 한다. 그러나 불합리한 기한과 쉬워보이는 지름길은 이러한 아키텍처를 구축하는 것을 매우 어렵게 만든다.

이 책에서는 전통적인 계층형 아키텍처(layered architecture) 스타일과 이 스타일의 단점을 논하는 것부터 시작해, 로버트 마틴(Robert C. Martin)의 클린 아키텍처(clean architecture)와 알리스테어 콕번(Alistair Cockburn)의 육각형 아키텍처(hexagonal architecture)에서 이야기하는 도메인 중심 아키텍처의 장점에 대해 이야기한다. 그러고 나서 실제 코드에서 어떻게 육각형 아키텍처를 구현하는지를 보여주기 위한 실습 단원으로 넘어가, 실습을 통해 육각형 아키텍처의 다양한 계층 간 매핑 전략들을 자세히 알아보고 아키텍처의 요소들을 어떻게 애플리케이션에 녹여낼 것인지 배운다. 이어지는 몇 개의 장에서는 아키텍처 경계를 강제하는 방법에 관해 살펴본다. 또, 어떤 지름길이 어떤 종류의 기술 부채를 만들고, 어떤 경우에 이러한 부채를 기꺼이 질 가치가 있는지 배운다.

이 책을 읽고 나면 육각형 아키텍처 스타일의 애플리케이션을 만드는 데 필요한 모든 지식을 알게 될 것이다.

톰 홈버그(Tom Hombergs)

10년이 넘는 세월 동안 다양한 업계의 고객들을 위해 수많은 소프트웨어 프로젝트를 진행한 전문적이고 열정적인 소프트웨어 엔지니어다. 주로 자바 생태계에서 소프트웨어 개발자, 아키텍트, 멘토로 일했다. 글을 쓰는 것이 배움의 가장 좋은 방법임을 발견하고, 혼란한 소프트웨어 개발의 세계에 구조를 부여할 수 있는 글을 쓰기 위해 소프트웨어 프로젝트에서 당면했던 주제들에 대해서 깊게 파고드는 것을 좋아한다. 자신의 블로그인 reflectoring.io에 정기적으로 글을 쓰고, 이따금 컨퍼런스에서 연사로 서기도 한다.

박소은

어제보다 나은 코드를 짜기 위해 노력하는 개발자

  • ▣ 01장: 계층형 아키텍처의 문제는 무엇일까?
    • 계층형 아키텍처는 데이터베이스 주도 설계를 유도한다
    • 지름길을 택하기 쉬워진다
    • 테스트하기 어려워진다
    • 유스케이스를 숨긴다
    • 동시 작업이 어려워진다
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 02장: 의존성 역전하기
    • 단일 책임 원칙
    • 부수효과에 관한 이야기
    • 의존성 역전 원칙
    • 클린 아키텍처
    • 육각형 아키텍처(헥사고날 아키텍처)
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 03장: 코드 구성하기
    • 계층으로 구성하기
    • 기능으로 구성하기
    • 아키텍처적으로 표현력 있는 패키지 구조
    • 의존성 주입의 역할
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 04장: 유스케이스 구현하기
    • 도메인 모델 구현하기
    • 유스케이스 둘러보기
    • 입력 유효성 검증
    • 생성자의 힘
    • 유스케이스마다 다른 입력 모델
    • 비즈니스 규칙 검증하기
    • 풍부한 도메인 모델 vs. 빈약한 도메인 모델
    • 유스케이스마다 다른 출력 모델
    • 읽기 전용 유스케이스는 어떨까?
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    • 의존성 역전
    •  
  • ▣ 05장: 웹 어댑터 구현하기
    • 웹 어댑터의 책임
    • 컨트롤러 나누기
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    • 의존성 역전
    •  
  • ▣ 06장: 영속성 어댑터 구현하기
    • 영속성 어댑터의 책임
    • 포트 인터페이스 나누기
    • 영속성 어댑터 나누기
    • 스프링 데이터 JPA 예제
    • 데이터베이스 트랜잭션은 어떻게 해야 할까?
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 07장: 아키텍처 요소 테스트하기
    • 테스트 피라미드
    • 단위 테스트로 도메인 엔티티 테스트하기
    • 단위 테스트로 유스케이스 테스트하기
    • 통합 테스트로 웹 어댑터 테스트하기
    • 통합 테스트로 영속성 어댑터 테스트하기
    • 시스템 테스트로 주요 경로 테스트하기
    • 얼마만큼의 테스트가 충분할까?
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 08장: 경계 간 매핑하기
    • ‘매핑하지 않기’ 전략
    • ‘양방향’ 매핑 전략
    • ‘완전’ 매핑 전략
    • ‘단방향’ 매핑 전략
    • 언제 어떤 매핑 전략을 사용할 것인가?
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    • 왜 조립까지 신경 써야 할까?
    •  
  • ▣ 09장: 애플리케이션 조립하기
    • 평범한 코드로 조립하기
    • 스프링의 클래스패스 스캐닝으로 조립하기
    • 스프링의 자바 컨피그로 조립하기
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    • 경계와 의존성
    •  
  • ▣ 10장: 아키텍처 경계 강제하기
    • 접근 제한자
    • 컴파일 후 체크
    • 빌드 아티팩트
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 11장: 의식적으로 지름길 사용하기
    • 왜 지름길은 깨진 창문 같을까?
    • 깨끗한 상태로 시작할 책임
    • 유스케이스 간 모델 공유하기
    • 도메인 엔티티를 입출력 모델로 사용하기
    • 인커밍 포트 건너뛰기
    • 애플리케이션 서비스 건너뛰기
    • 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?
    •  
  • ▣ 12장: 아키텍처 스타일 결정하기
    • 도메인이 왕이다
    • 경험이 여왕이다
    • 그때그때 다르다
  • 14쪽, 그림 2.1을 아래 그림으로 교체

    그림 2.1

  • 128쪽, 5번째 줄

    그림 10.2의

    ==>

    그림 10.3의

  • 128쪽, 밑에서 8번째 줄

    그림 10.2의

    ==>

    그림 10.3의

  • 129쪽, 첫 번째 줄

    그림 10.2는

    ==>

    그림 10.3은