이미 소장하고 있다면 판매해 보세요.
|
0장 왜 함수형 프로그래밍인가?
0.1 왜 코틀린인가? 0.2 함수형 프로그래밍의 진정한 의미는 무엇인가? ____재사용은 정말 과대평가된 것인가? 0.3 객체 지향 프로그래밍 지식을 일부러 잊어버리기 ____대상과 동작에 집중하기보다 데이터 변환에 집중하기 ____메서드 없는 객체 생성하기 ____불필요한 인터페이스 피하기 ____복잡한 제네릭 타입을 두려워하지 말자 0.4 요약 1장 애플리케이션 준비하기 1.1 예제 애플리케이션 정의하기 ____새 제품 상상해보기 1.2 제타이: 혁신적인 할 일 목록 애플리케이션 ____사용자 스토리 정의하기 ____이벤트 스토밍을 통해 스토리 검증하기 ____목업 준비하기 ____요구 사항을 코드로 작성하기 1.3 테스트가 개발을 안내하게 하라 ____지속 가능한 페이스로 생각하기 ____디자인 방향을 이끌기 ____올바름 보장하기 ____여러 가지 유형의 테스트들 ____테스트에 대한 두 가지 학파 1.4 프로젝트 설정하기 ____테스트 라이브러리 1.5 단위 테스트를 함수형으로 만들기 ____첫 번째 단위 테스트 ____목을 사용하지 말라 1.6 요약 1.7 연습 문제 ____연습 문제 1.1: 슈퍼마켓 이벤트 스토밍 ____연습 문제 1.2: TDD로 할인 금액 계산하기 ____연습 문제 1.3: 1씩 더해가는 테스트 2장 함수로 HTTP 다루기 2.1 프로젝트 시작하기 ____작동하는 골격 2.2 HTML 페이지를 함수적으로 제공하기 ____함수로서의 웹 서버 ____Http4k 소개 ____스파이크: 첫 번째 웹 페이지 ____Http4k 도메인 특화 언어 ____위험 관리 2.3 제타이 시작하기 ____첫 번째 인수 테스트 ____유비쿼터스 언어 ____인수 테스트 실행 2.4 화살표로 디자인하기 ____여러 함수 결합하기 2.5 맵으로부터 목록 제공하기 ____응답 파싱하기 ____스토리 완성하기 2.6 요약 2.7 연습 문제 ____연습 문제 2.1: 함수 연쇄 호출 ____연습 문제 2.2: 함수형 스택 ____연습 문제 2.3: RPN 계산기 3장 도메인 정의 및 테스트 3.1 인수 테스트 개선하기 ____부정적 사례 테스트 ____시나리오 액터 ____애플리케이션 파사드 ____함수로 표현한 단계 3.2 고차 함수 사용하기 ____순수 고차 함수 3.3 인프라에서 도메인 분리하기 ____허브 ____허브를 제타이에 연결하기 3.4 도메인에서 테스트 구동하기 ____프로토콜 ____인수 테스트를 DDT로 전환하기 3.5 DDT를 Pesticide로 변환하기 ____시나리오 ____액션과 프로토콜 ____액터들 ____단계 ____Pesticide DDT로 전환하기 ____애플리케이션 호출하기 ____최종 테스트 3.6 요약 3.7 연습 문제 ____연습 문제 3.1: 계산원 DDT ____연습 문제 3.2: 할인 DDT ____연습 문제 3.3: 결과로 함수 반환하기 ____연습 문제 3.4: 템플릿 엔진 4장 도메인과 어댑터 모델링하기 4.1 목록을 수정하는 새 스토리 시작하기 ____진행 중인 작업 ____도메인 주도 테스트 과정 ____액터 단계 ____HTTP 액션 호출 ____다른 페이지 처리하기 ____CRUD 예제 ____항목을 추가하는 경로 4.2 함수적 의존관계 주입 사용하기 ____객체 지향 의존관계 주입과의 비교 ____부분 적용 ____허브에 항목 추가하기 ____호출 가능한 클래스로서의 함수 ____허브 밖에 목록 저장하기 ____음성(부정적인 경우) 검사하기 ____목록에 항목 추가하기 4.3 함수형 코드 디버깅하기 ____의심이 된다면 출력하라 4.4 함수형 도메인 모델링 ____낮은 카디널리티 ____오류를 나타내도록 널 반환하기 ____널의 문제 ____속성 테스트 ____타입 안의 널이 될 수 있는 필드 ____더 나은 HTML ____HTML 파싱하기 ____고차 함수 추출 4.5 요약 4.6 연습 문제 ____연습 문제 4.1: DiscardUnless ____연습 문제 4.2: 널이 될 수 있는 함수 연쇄 호출하기 ____연습 문제 4.3: 커링 ____연습 문제 4.4: 호출 가능 객체 5장 이벤트를 사용해 상태 수정하기 5.1 할 일 목록 만들고 표시하기 ____사용자 목록 페이지 만들기 ____HTTP DDT로 전환 ____도메인 전용 DDT 통과시키기 ____사용자의 할 일 목록 페이지 생성하기 5.2 변경된 상태 저장하기 ____이벤트 소싱 ____불변 데이터로 상태 변경하기 ____임시 가변성 ____변경 가능한 지역 변수 제거하기 5.3 재귀의 힘 활용하기 ____접을 수 있게 만들기 ____왼쪽 접기와 오른쪽 접기 5.4 이벤트 접기 ____유한 상태 기계 구현하기 ____유니언 타입 ____복합 타입의 카디널리티 계산하기 ____상태 변경 정의하기 5.5 모노이드 알아보기 5.6 요약 5.7 연습 문제 ____연습 문제 5.1: 재귀 ____연습 문제 5.2: 접기 ____연습 문제 5.3: 유니언 타입 ____연습 문제 5.4: 모노이드 6장 커맨드 실행해서 이벤트 생성하기 6.1 새 목록 만들기 ____새 목록을 만드는 DDT 추가하기 ____HTML UI에 버튼 추가하기 ____HTTP 핸들러에 경로 추가하기 6.2 커맨드를 사용해 상태 변경하기 ____커맨드에서 이벤트 생성하기 6.3 상태와 이벤트로 도메인 모델링하기 ____트랜잭션 엔티티 ____엔티티 상태 ____ToDoListEvent ____ToDoListState 6.4 함수형 상태 기계 작성하기 ____이벤트 스토어 6.5 허브 연결하기 ____읽기 모델 ____목록에 항목 추가하기 6.6 커맨드와 이벤트 더 잘 이해하기 ____변경 가능한 상태와 변경 불가능한 상태 ____정체성과 엔티티 ____이벤트 소싱 애플리케이션 지원 6.7 요약 6.8 연습 문제 ____연습 문제 6.1: 엘리베이터를 상태 기계로 모델링하기 ____연습 문제 6.2: 이벤트를 사용해 엘리베이터 상태 유지하기 ____연습 문제 6.3: 고장 상태 추가하기 7장 함수형으로 오류 처리하기 7.1 오류를 더 잘 처리하기 ____널로 오류 처리하기 ____오류 반환하기 ____예외를 예외적으로 유지하기 ____함수형 오류 처리 7.2 펑터와 카테고리 배우기 ____코드에서 카테고리 정의하기 7.3 코드에서 펑터 정의하기 ____제네릭스는 타입 빌더다 ____변환과 리프트 ____펑터의 법칙 ____펑터로 리스트 살펴보기 7.4 펑터를 사용해 오류 처리하기 ____유니언 타입으로 오류 처리하기 7.5 결과 다루기 ____실패 시 끝내기 ____더 정확한 오류 ____함수적 효과 ____코드 정리하기 ____결과 테스트하기 7.6 요약 7.7 연습 문제 ____연습 문제 7.1: 펑터 합성하기 ____연습 문제 7.2: 펑터 법칙 검증하기 ____연습 문제 7.3: 실패 변환하기 ____연습 문제 7.4: 예외 잡아내기 8장 펑터를 사용해 이벤트 투영하기 8.1 이벤트 투영하기 ____첫 번째 투영 정의하기 ____행 다루기 ____맵에서 이벤트 투영하기 ____첫 번째 투영 ____투영 질의하기 8.2 펑터에서 질의 실행하기 ____지연 계산 활용하기 ____결과를 하나로 합치기 ____fetcher 제거하기 8.3 펑터 관점에서 생각하기 ____‘다음에 할 일’ 페이지 만들기 8.4 커맨드와 질의 책임 분리(CQRS) 8.5 요약 8.6 연습 문제 ____연습 문제 8.1: 지연 계산 ____연습 문제 8.2: 상태가 있는 함수 ____연습 문제 8.3: 엘리베이터 투영 9장 모나드를 사용해 데이터를 안전하게 영속화하기 9.1 안전하게 영속화하기 ____데이터베이스의 종류 ____PostgreSQL과 통합 테스트하기 9.2 코틀린으로 데이터베이스에 연결하기 ____이벤트 스토어용 테이블 스키마 ____이벤트를 JSON으로 변환하기 ____투영을 위한 테이블 스키마 ____데이터베이스 준비 ____효과와 부수 효과 ____테이블에 읽고 쓰기 ____Exposed 확장 프로그램 9.3 함수형 방식으로 원격 데이터에 접근하기 ____컨텍스트 리더 ____데이터베이스에 투영 저장하기 9.4 모나드의 힘 살펴보기 ____엔도펑터 ____모나드란 무엇인가? ____모나드가 아닌 것 ____모나드 법칙 ____Outcome 모나드 ____리더 모나드 ____타입 클래스와 인터페이스 ____모나드에 대한 마지막 한마디 9.5 요약 9.6 연습 문제 ____연습 문제 9.1: ContextReader에 대한 모나드 법칙 ____연습 문제 9.2: join을 가지고 bind 구현하기 10장 커맨드 처리를 위해 컨텍스트 읽기 10.1 모나드로 데이터베이스에 접근하기 ____EventStreamer와 ContextReader ____인메모리 이벤트 스트리머 다시 작성하기 ____데이터베이스에 저장된 이벤트 스트림 10.2 컨텍스트 리더를 사용해 커맨드 처리하기 ____모나드 변환기 ____커맨드를 동시에 실행하기 ____모두 함께 엮기 10.3 데이터베이스에서 투영 질의하기 ____투영 영속화 ____데이터베이스에서 투영 갱신 ____unaryPlus 연산자를 사용한 DSL ____SQL로 질의 작성하기 ____질의 핸들러 작성하기 10.4 이벤트 소싱을 통한 도메인 모델링 ____상태 기계 정의하기 ____이벤트 마이그레이션과 버전 관리 10.5 요약 10.6 연습 문제 ____연습 문제 10.1: 로거 모나드 ____연습 문제 10.2: 콘솔 모나드 ____연습 문제 10.3: 콘솔 모나드 RPN 계산기 11장 애플리커티브로 데이터 검증하기 11.1 목록 이름 변경하기 ____목록 이름 변경 커맨드 ____목록 이름 변경 이벤트 ____이름 변경 이벤트 투영하기 ____잘못된 이름 변경 오류 ____DDT 통과시키기 11.2 파라미터가 두 개인 함수 변환 ____사용자 입력 검증 ____오류 수집 11.3 검증을 통한 유효성 검사 ____오류를 사용자에게 반환하기 ____비지역 반환 제거하기 11.4 애플리커티브 펑터 결합하기 ____순회 ____시퀀스 ____성능에 대한 경고 ____순차적 적용 ____중위 표기법 ____애플리커티브 법칙 ____모나드와 애플리커티브 ____커맨드를 처리하는 패턴 11.5 사용자 인터페이스 개선하기 ____함수형 템플릿 엔진 ____더 나은 검증 오류 표시 11.6 요약 11.7 연습 문제 ____연습 문제 11.1: 결과 축소하기 ____연습 문제 11.2: 애플리커티브 컨텍스트 리더 ____연습 문제 11.3: 목록 항목 편집하기 ____연습 문제 11.4: 목록 항목 삭제하기 12장 모니터링과 함수형 JSON 12.1 애플리케이션 모니터링하기 ____클라우드 모니터링 플랫폼 ____함수형 로깅 ____전통적인 로깅 ____페퍼다인의 로깅 법칙 ____테스트 주도 로깅 ____스트림에 로그 남기기 ____더 자세한 오류 ____함께 연결하기 ____되돌아보기 12.2 구조화된 로깅 ____LogEntry ____LogContext ____JsonLogger ____컨텍스트 전달하기 12.3 JSON을 함수형으로 만들기 ____KondorJson 라이브러리 ____JSON 변환기 ____12.4 프로펑터 소개 ____반공변 펑터 ____프로펑터 12.5 데이터베이스 호출 로깅 12.6 요약 12.7 연습 문제 ____연습 문제 12.1: 모니터링 개선 ____연습 문제 12.2: Klaxon 제거하기 ____연습 문제 12.3: 사용자가 항목 순서를 변경할 수 있게 하기 ____연습 문제 12.4: 새로운 목록 상태 도입 13장 함수형 아키텍처 디자인하기 13.1 단순성 추구 ____모듈과 하위 도메인 ____모듈로 빌드하기 ____함수형 모듈화 ____공유된 데이터 구조 ____동기적 프로토콜과 비동기적 프로토콜 13.2 전체 시스템 디자인하기 ____제타이 예제 사용하기 ____진화 ____멀티 모듈 애플리케이션 13.3 코드로 변환하기 ____모노리포 ____지속적 빌드와 통합 ____배포 단위 13.4 마지막 고려 사항 13.5 연습 문제 ____연습 문제 13.1: 최종 연습 문제 부록 A 함수형 프로그래밍이란 무엇인가? A.1 기원 ____람다 계산법 ____참조 투명성 ____카테고리 이론 A.2 참조 투명성 달성하기 ____함수를 순수하게 유지하라 ____가변 타입을 신뢰하지 마라 ____가능한 입력을 모두 고려하라 A.3 사상으로 생각하기 ____함수를 데이터로 취급하라 ____타입을 정확하게 정의하라 ____선언형 스타일을 선호하라 ____게으름을 피워라 A.4 요약 부록 B 함수형 코틀린에 대하여 B.1 코틀린 설정하기 ____그레이들 ____Hello World ____자동 변환기 B.2 코틀린 개론 ____임시 변수 ____함수 ____함수 타입 ____Unit ____Nothing ____람다 변수 ____확장 함수 ____새로운 함수 반환하기 ____영역 함수 ____클래스 ____객체와 동반 객체 ____데이터 클래스 ____위임을 통한 구현 ____위임 프로퍼티 ____타입 별명 ____내부 가시성 ____when ____봉인된 클래스 ____봉인된 인터페이스 ____tailrec 키워드 ____시퀀스 B.3 코틀린 타입 시스템 탐구 ____널이 될 수 있는 타입 ____중위 함수 ____연산자 부록 C 약간의 이론 C.1 카테고리 이론 ____집합과 함수 ____카테고리란 무엇인가? ____빈 카테고리 ____모노이드 ____Set 카테고리 ____컴퓨터 언어 카테고리 ____부분 카테고리 ____다이어그램 C.2 모든 것은 사상에 관한 것이다 ____동형사상 ____시작 대상과 끝 대상 ____반대 카테고리 C.3 타입에 대한 타입 ____곱 타입과 쌍대곱 타입 ____지수 타입 C.4 펑터는 매퍼다 ____딸림 펑터 ____엔도펑터 ____자연 변환 C.5 신비한 모나드 ____쌍대모나드(코모나드) ____클라이슬리 카테고리 C.6 요네다로 모든 것 연결하기 ____hom 펑터 ____반공변 펑터 ____요네다 보조정리 C.7 결론 부록 D 추가 자료 D.1 프로그래밍 ____코틀린 ____함수형 프로그래밍 ____TDD D.2 카테고리 이론 ____책 ____블로그 ____비디오 찾아보기 |
Uberto Barbini
오현석의 다른 상품
|
객체 지향에서 함수형으로!
더 빠르고 안전하게, 적은 코드로 더 나은 결과를 얻어라! 객체 지향에 함수형 프로그래밍을 더하라! 객체 지향 프로그래밍 지식이 탄탄하고 기술적으로도 숙련된 개발자가 함수형 프로그래밍을 배우는 것은 뇌를 다시 배선하는 것과 같다. 결코 쉽지 않은, 어려운 작업이지만 보상은 매우 크다. 더 적은 노력으로 더 나은 코드를 작성할 수 있기 때문이다. 함수형 프로그래밍을 더한다면 코틀린으로 하라! 함수형 프로그래밍과 객체 지향 프로그래밍의 장점을 함께 누릴 수 있는 언어가 있다. 바로 코틀린이다. 배우기 쉽고, 간결하고 안전하며, 자바와 상호 운용하거나 자바 라이브러리와 통합하기도 쉽다. 또한 코틀린 타입 시스템은 자바 타입 시스템보다 함수형 프로그래밍에 더 친화적이며, 생산성도 매우 높다. 혹시 코틀린을 모른다면 이 책을 통해 코틀린도 배우자. 자바나 C# 같은 언어를 알고 있다면 수월하게 코틀린을 배울 수 있다. 목표는 함수형+코틀린으로 더 나은 소프트웨어를 작성하는 것이다! 이 책은 1장부터 12장까지 함수형 디자인을 따라 애플리케이션을 점진적으로 구축하는 방법을 보여준다. 점진적으로 진행하지만, 애플리케이션을 구축하면서 모나드, 애플리커티브, 프로펑터 같은 고급 개념도 다룰 것이다. 각 장을 순서대로 읽으면 완전한 애플리케이션을 구축하는 과정을 잘 이해할 수 있도록 구성했다. 마지막 13장은 여러 서비스를 아우르는 완전한 소프트웨어 아키텍처를 함수형 접근 방식을 사용해 디자인하고 구축하는 방법에 관해 설명했다. 이 책을 통해 함수형 개념을 점진적으로 도입하는 방법은 물론, 고급 개념을 사용해보면서 실제로 도움이 되는 효과적인 코딩 방법을 배워 보자! [지은이 서문] 이 책의 핵심 목표는 일상 업무에서 함수형 사고를 쉽게 배우고 사용할 수 있는 방법을 보여주는 것이다. 함수형 프로그래밍 자체가 궁극적인 목표가 아니라 견고하고 적응가능한 소프트웨어를 빠르게 구축하는 것이 목표이며, 이를 달성하는 가장 좋은 도구는 테스트 및 도메인 탐색, 함수형 프로그래밍이라고 믿는다. 그럼에도 함수형 프로그래밍 자체만을 추구하지는 않는다. 부분적인 함수형 해법이 순수 함수형 해법보다 더 나은 성능을 발휘한다면, 나는 주저하지 않고 전자를 제안할 것이다. 코틀린을 몰라도 자바, C# 등의 유사한 언어를 알고 있다면 충분하다. 이 책은 중고급 프로그래머를 대상으로 한다. ㆍ 객체 지향 프로그래밍에 탄탄한 배경 지식을 가진 숙련된 개발자로, 함수형 프로그래밍과 이점에 대해 더 알고 싶은 개발자 ㆍ 고전적인 교과서 예제를 전체 애플리케이션으로 변환하는 데 어려움을 겪는 함수형 프로그래밍 초보자 ㆍ 함수형 프로그래밍에 능숙하며 코틀린에 관심이 있는 프로그래머 [옮긴이 서문] 현재는 함수형 프로그래밍의 장점에 대해 많은 사람들이 동의하고 있다. 상태가 없는 순수 함수를 파라미터로 받는 여러 고차 함수를 사용해 컬렉션을 조작하는 스타일의 코딩은 이제 객체 지향 개발자들이 사용하는 컬렉션 라이브러리에도 깊이 침투해 있고, 리액트나 컴포즈 등의 UI 프레임워크는 함수 컴포넌트를 통해 상태 관리와 UI 구성을 분리함으로써 좀 더 깔끔한 관심사의 분리를 지원한다. 그럼에도 불구하고 실무에서 함수형 프로그래밍을 적용할 때는 컬렉션 처리나 함수 안에 한정된 로직 등의 작은 단위에 함수형 프로그래밍 방식을 적용하고, 커다란 단위에서는 객체 지향 프로그래밍 등을 사용해 프로젝트를 진행하는 경우가 많다. 하지만 상태를 사용하는 참조 투명하지 않은 코드인 액션은 전염성이 있기 때문에 프로그램에서 액션과 계산, 데이터를 잘 분리하지 않으면 액션이 전파되면서 전체 프로그램이 함수형 프로그래밍과는 거리가 먼, 상태 관리를 중심으로 하는 프로그램이 되기 쉽다. 복잡하고 커다란 프로젝트에서는 데이터베이스 등의 상태 관리가 필수적인데, 대부분의 개발자는 전통적인 객체 지향 방식에 익숙하고 큰 시스템에서 좀 더 함수적으로 액션과 계산을 분리해 프로그램을 깔끔하게 작성하는 방법을 잘 모르는 경우가 많다. 이 책이 많은 개발자들이 프로젝트를 더 깔 끔하게 설계하고 유지하는 데 도움이 되길 빈다. |
|
이 책을 제대로 이해하려면 한 번만 읽어서는 안 됩니다. 한번쯤 함수형 프로그래밍을 해보고 싶다는 생각을 했다면 진지한 자세로 책을 끝까지 읽어야 합니다. 그저 단순한 웹 서비스를 만드는 것임에도 TDD를 필두로, 코틀린의 온갖 문법적 기능과 함께 함수형 프로그래밍은 이렇게 하는 것이라고 친절하게 설명합니다. - 윤병조 (소프트웨어 개발자, 동영상 서버 개발)
|
|
함수형 프로그래밍을 실무에 적용하려는 개발자들에게 매우 유용하리라 생각합니다. 체계적인 구성과 실질적인 예제, 풍부한 부록을 통해 함수형 프로그래밍의 진가를 제대로 느낄 수 있었습니다. - 이석곤 ((주)아이알컴퍼니, 14년 차 AI/빅데이터 개발자)
|
|
코틀린을 이용해 기존 객체 지향 언어로도 함수형 패러다임을 구현할 수 있다는 자신감을 심어줍니다. 구현체에 대해 정말 줄 단위로 설명을 해주므로, 실습 없이는 보기 힘든 책입니다. 꼭 컴퓨터와 함께 읽으세요! - 시한 (고려대 보안 석사 과정, 백엔드 개발자)
|
|
함수형 프로그래밍을 위해 반드시 새로운 언어를 배워야 하는 건 아니라고 하는 점이 좋았습니다. 특히 코틀린에 대해서 초급부터 중급을 넘어 고급까지 성장할 수 있는 좋은 책입니다. - 이종우 (페이민트, CTO)
|
|
코틀린의 객체가 아닌 함수를 이용해 개발하니 더욱 간편하게 작업할 수 있다는 것을 알게 되어 너무 좋았습니다. 특히 목(mock)을 이용해 테스트를 하는 방법에서 기존에 테스트 코드의 유지보수성에 대해서 생각하고 있던 찰나 이 글을 읽으니 해답을 얻은 듯했습니다. - 최윤정 (안드로이드 개발 취업 준비생)
|
|
기존에 객체 지향 프로그래밍을 통해 다년간 개발을 해오던 개발자에게 함수형 프로그래밍 관점에서 문제를 바라보고 어떤 식으로 해결할 수 있는지 구체적인 예시를 통해 알려주어 함수형에 입문하고, 실제 업무에 적용해보는 데 도움이 되는 책입니다. - 김건 (5년차 백엔드 개발자)
|
|
실무 개발자에게 꼭 필요한 개념과 실질적인 예제를 통해 깊이 있는 학습을 제공하는 훌륭한 책입니다. 예제를 여러 장에 걸쳐 만들고, 단순히 코드만 나열하는 것이 아니라, 실제로 동작하는 프로그램을 단계적으로 완성해가는 과정이 좋았습니다. - 곤 (스타트업, 백엔드 개발자)
|