이펙티브 소프트웨어 설계 (실수와 트레이드오프로부터 배우는 현명한 소프트웨어 설계 가이드)

이펙티브 소프트웨어 설계 (실수와 트레이드오프로부터 배우는 현명한 소프트웨어 설계 가이드)

$33.81
Description
소프트웨어 개발의 난제, 트레이드오프 관점에서 해법을 찾다!
《이펙티브 소프트웨어 설계》는 애플리케이션 설계, 계획, 구현에 관한 더 나은 의사결정을 내리는 방법을 알려준다. 잘못된 트레이드오프 결정이 내려진 실제 시나리오를 분석하고, 어떻게 다르게 결정할 수 있었는지 설명한다. 이 책은 다양한 접근 방식의 장단점을 제시하고 소프트웨어 설계에 언제나 유효한 패턴을 탐구한다.

코드 중복이 시스템의 결합도와 진화 속도에 어떤 영향을 미치는지, 단순해 보이는 요구사항에 날짜나 시간 정보와 관련해 어떤 숨겨진 뉘앙스가 존재하는지 이해할 수 있다. 80/20 파레토 원칙에 따라 최적화 범위를 효율적으로 좁히고 분산된 시스템에서 일관성을 보장하는 방법을 살펴보자. 저자가 힘들게 얻은 경험을 여러분의 프로젝트에도 적용해 실수를 미연에 방지하고 의사결정 과정에서 신중한 접근 방식을 취할 수 있을 것이다.

★ 이 책에서 다루는 내용 ★

◎ 직관적이고 더 나은 설계 결정을 내릴 수 있도록 시스템에 대해 추론하기
◎ 트레이드오프의 균형을 맞추는 방법과 트레이드오프의 추이를 이해하기
◎ 문제에 적합한 라이브러리 고르기
◎ 서비스의 전체 의존성을 철저하게 분석하기
◎ 전송 의미론과 이러한 의미론이 분산된 아키텍처에 미치는 영향을 이해하기
◎ 핫 코드 경로를 감지하고 시스템 SLA를 검증하기 위해 성능 테스트를 설계하고 수행하기
◎ 근본 원인을 대상으로 최적화에 초점을 맞추기 위해 핫 코드 경로를 감지하고 최적화하기
◎ 날짜/시간 처리에 적합한 데이터 모델을 결정해 일반적인 (그러나 미묘한) 실수를 방지하기
◎ API 클라이언트의 예상치 못한 문제를 방지하기 위해 호환성과 버전 관리에 대해 추론하기
◎ 긴밀한 결합과 느슨한 결합 개념과 함께 이런 개념이 팀 사이의 작업 조정에 미치는 영향을 이해하기
◎ 정확하고 쉽게 구현되고 쉽게 테스트될 때까지 요구사항을 명확하게 만들기
◎ 친숙한 사용자 경험을 위해 API를 최적화하기
저자

토마스레렉,존스키트

구글에서스태프개발자데브렐(DeveloperRelations)엔지니어로근무하고있으며,현재.NET을위한구글클라우드클라이언트라이브러리를개발하고있다..NET을위한노다타임(NodaTime)날짜및시간라이브러리(https://nodatime.org)를포함해오픈소스에기여하고있으며,스택오버플로에대한기여는아마도가장잘알려져있을것이다.매닝에서출간한《C#을다루는기술》(길벗,2021)의저자이며,《프로그래밍그루비》(인사이트,2009)와《Real-WorldFunctionalProgramming》에도기여했다.남들이보기에는특이하다고간주되는날짜와시간API와버전관리분야에관심이많다.

목차

▣01장:도입
1.1모든결정과패턴의결과
__1.1.1단위테스트결정사항
__1.1.2단위테스트와통합테스트의비율
1.2코드디자인패턴과그것이항상동작하지않는이유
__1.2.1코드측정하기
1.3아키텍처설계패턴이항상동작하지는않는이유
__1.3.1확장성과탄력성
__1.3.2개발속도
__1.3.3마이크로서비스의복잡성
요약

▣02장:코드중복대유연성-코드중복이항상나쁘지만은않다
2.1코드베이스사이의공통코드와중복
__2.1.1코드중복을요구하는새로운비즈니스요구사항추가
__2.1.2새로운비즈니스요구사항구현
__2.1.3결과평가
2.2라이브러리,그리고코드베이스사이에서코드공유
__2.2.1공유라이브러리의트레이드오프와단점평가하기
__2.2.2공유라이브러리생성
2.3독립적인마이크로서비스로코드추출
__2.3.1독립적인서비스의트레이드오프와단점살펴보기
__2.3.2독립적인서비스에대한결론
2.4코드중복으로느슨한결합향상시키기
2.5중복을줄이기위해상속을사용하는API설계
__2.5.1기초요청처리기추출
__2.5.2상속과강한결합을살펴보기
__2.5.3상속과합성사이의트레이드오프살펴보기
__2.5.4내재된중복과우연한중복살펴보기
요약

▣03장:코드에서신경써야할예외와오류처리패턴
3.1예외의계층구조
__3.1.1모든예외를잡는방식대더세분화된오류처리방식
3.2당신이소유한코드에서예외를처리하기위한우수사례
__3.2.1공개API에서확인된예외처리하기
__3.2.2공개API에서확인되지않은예외처리하기
3.3예외처리에서주의할안티패턴
__3.3.1오류가발생할경우자원닫기
__3.3.2애플리케이션흐름을제어하기위해예외를사용하는안티패턴
3.4타사라이브러리에서오는예외
3.5멀티스레드환경에서주의할예외
__3.5.1프라미스API를사용한비동기식작업흐름의예외처리
3.6Try로오류를처리하는함수형접근방식
__3.6.1실제양산서비스코드에서Try사용하기
__3.6.2예외를던지는코드와Try를섞어서사용하기
3.7예외처리코드의성능비교
요약

▣04장:유연성과복잡성사이의균형
4.1탄탄하지만확장성은떨어지는API
__4.1.1새로운컴포넌트설계
__4.1.2가장직관적인코드로시작
4.2클라이언트에게자신만의메트릭프레임워크를제공하게허용하기
4.3훅을통한API의확장성제공
__4.3.1훅API의예기치못한사용방어하기
__4.3.2훅API의성능영향
4.4리스너를통한API의확장성제공
__4.4.1리스너사용대훅사용
__4.4.2설계의불변성
4.5API의유연한분석대유지보수비용
요약

▣05장:섣부른최적화대핫코드경로의최적화-코드성능에영향을미치는의사결정
5.1섣부른최적화가나쁠때
__5.1.1계정처리파이프라인생성
__5.1.2잘못된가정에기반한처리최적화
__5.1.3성능최적화벤치마크
5.2핫코드경로
__5.2.1소프트웨어시스템컨텍스트에서파레토법칙이해하기
__5.2.2주어진SLA를위해동시사용자(스레드)숫자구성하기
5.3잠재적인핫코드경로가존재하는단어서비스
__5.3.1오늘의단어얻기
__5.3.2단어가존재하는지검증하기
__5.3.3HTTP서비스를사용해WordsService를외부에공개하기
5.4핫코드경로탐지
__5.4.1개틀링을사용해API성능테스트생성하기
__5.4.2MetricRegistry를사용해코드경로측정하기
5.5핫코드경로의성능개선
__5.5.1기존해법을위한JMH마이크로벤치마크생성
__5.5.2캐시를사용한word-exists최적화
__5.5.3더많은입력단어를받기위한성능테스트변경
요약

▣06장:API를유지보수하기위한비용대단순함
6.1다른도구에서사용되는기본라이브러리
__6.1.1클라우드서비스클라이언트만들기
__6.1.2인증전략탐색
__6.1.3구성메커니즘이해하기
6.2의존성라이브러리의설정을외부에직접공개하기
__6.2.1배치도구구성하기
6.3의존성라이브러리의설정을추상화하는도구
__6.3.1스트리밍도구구성하기
6.4클라우드클라이언트라이브러리를위해새로운설정추가하기
__6.4.1배치도구에새로운설정추가하기
__6.4.2스트리밍도구에새로운설정추가하기
__6.4.3UX친화성과유지보수성측면에서두해법을비교하기
6.5클라우드클라이언트라이브러리에서설정을더이상사용하지않기로결정하거나제거하기
__6.5.1배치도구에서설정제거하기
__6.5.2스트리밍도구에서설정제거하기
__6.5.3UX친화성과유지보수성측면에서두해법비교하기
요약

▣07장:날짜와시간데이터로효율적으로작업하기
7.1날짜와시간정보에대한개념
__7.1.1컴퓨터시간:인스턴트,에포크,시간간격
__7.1.2상용시간:달력시스템,날짜,시간,날짜간격
__7.1.3시간대,UTC,그리고UTC오프셋
__7.1.4머리가아파지는날짜와시간개념들
7.2날짜와시간정보로작업할준비
__7.2.1범위제한하기
__7.2.2날짜와시간요구사항을명확하게만들기
__7.2.3올바른라이브러리또는패키지사용하기
7.3날짜와시간코드구현하기
__7.3.1개념을일관성있게적용하기
__7.3.2기본값을피함으로써테스트가능성개선하기
__7.3.3텍스트에서날짜와시간값표현하기
__7.3.4주석으로코드설명하기
7.4명시하고테스트해야하는특이한경우
__7.4.1달력산술연산
__7.4.2자정에시간대변환
__7.4.3모호하거나건너뛴시간처리하기
__7.4.4진화하는시간대데이터로작업하기
요약

▣08장:컴퓨터에서데이터지역성과메모리활용하기
8.1데이터지역성이란무엇일까?
__8.1.1계산을데이터로옮기기
__8.1.2데이터지역성을사용한처리규모확장
8.2데이터파티셔닝과데이터나누기
__8.2.1오프라인빅데이터파티셔닝
__8.2.2파티셔닝대샤딩
__8.2.3파티셔닝알고리즘
8.3여러파티션에서가져온빅데이터집합을조인하기
__8.3.1동일물리컴퓨터내에서데이터조인하기
__8.3.2데이터이동이필요한조인작업
__8.3.3브로드캐스팅을활용한조인최적화
8.4데이터처리과정:메모리대디스크
__8.4.1디스크기반의처리과정
__8.4.2맵리듀스가필요한이유
__8.4.3접근시간계산하기
__8.4.4램기반의처리과정
8.5아파치스파크를사용한조인구현
__8.5.1브로드캐스트없이조인구현하기
__8.5.2브로드캐스트로조인구현하기
요약

▣09장:외부라이브러리-사용하는라이브러리가곧코드가된다
9.1라이브러리를임포트하고설정에대해완벽하게책임지기:기본값에주의하자
9.2동시성모델과확장성
__9.2.1비동기식API와동기식API사용하기
__9.2.2분산된확장성
9.3테스트가능성
__9.3.1테스트라이브러리
__9.3.2가짜객체(테스트더블)와목객체로테스트하기
__9.3.3테스트툴킷통합
9.4타사라이브러리의의존성
__9.4.1버전충돌회피하기
__9.4.2너무많은의존성
9.5외부의존성을선택하고유지관리하기
__9.5.1첫인상
__9.5.2코드재사용에대한다양한접근방식
__9.5.3공급업체종속
__9.5.4라이선스
__9.5.5라이브러리대프레임워크
__9.5.6보안과업데이트
__9.5.7의사결정을위한점검목록
요약

▣10장:분산시스템에서의일관성과원자성
10.1최소한한번이상데이터소스전송
__10.1.1노드하나짜리서비스사이의트래픽
__10.1.2애플리케이션호출재시도하기
__10.1.3데이터생성과멱등성
__10.1.4CQRS(CommandQueryResponsibilitySegregation)이해하기
10.2중복제거라이브러리의단순한구현
10.3분산된시스템에서중복제거를구현할때흔히저지르는실수
__10.3.1노드가하나만있는컨텍스트
__10.3.2다중노드컨텍스트
10.4경쟁조건을방지하기위해로직을원자적으로만들기
요약

▣11장:분산시스템에서의배송의미론
11.1이벤트주도애플리케이션의아키텍처
11.2아파치카프카에기반한생산자와소비자애플리케이션
__11.2.1카프카의소비자쪽살펴보기
__11.2.2카프카브로커설정이해하기
11.3생산자로직
__11.3.1생산자를위한일관성대가용성선택하기
11.4소비자코드와다양한배송의미론
__11.4.1수동으로소비자커밋하기
__11.4.2가장처음오프셋또는가장최신오프셋에서재시작하기
__11.4.3(사실상)정확히한번의미론
11.5내결함성을제공하기위해배송의미론을활용하기
요약

▣12장:버전과호환성관리하기
12.1추상적으로생각해보는버전관리
__12.1.1버전의속성
__12.1.2하위호환성과상위호환성
__12.1.3유의적버전관리
__12.1.4마케팅버전
12.2라이브러리를위한버전관리
__12.2.1소스코드,바이너리,그리고유의적호환성
__12.2.2의존성그래프와다이아몬드의존성
__12.2.3호환성에손상을가하는변경을처리하기위한기법
__12.2.4내부전용라이브러리관리하기
12.3네트워크API를위한버전관리
__12.3.1네트워크API호출이라는컨텍스트
__12.3.2고객친화적인명료함
__12.3.3일반적인버전관리전략
__12.3.4추가적인버전관리고려사항
12.4데이터저장소를위한버전관리
__12.4.1프로토콜버퍼에대한간략한소개
__12.4.2호환성이손상되는변경사항은무엇일까?
__12.4.3저장소내에서데이터이주하기
__12.4.4예상치못한상황을예상하기
__12.4.5API와저장소표현분리하기
__12.4.6저장소형식평가하기
요약

▣13장:최신유행을따르는방식대코드유지보수비용을줄이는방식
13.1언제의존성주입프레임워크를사용할까?
__13.1.1DIY(