길벗·이지톡

도서 IT전문서/IT입문서 프로그래밍/오픈소스

실무에 가까운 웹 애플리케이션 프로젝트, 명확하고 간결한 실전 코틀린 코드로 도전하라.

실무에 가까운 웹 애플리케이션 프로젝트, 명확하고 간결한 실전 코틀린 코드로 도전하라.

함수형 사고 방식, 함수형 프로그래밍 방법 및 좋은 관행, 코틀린 프로젝트까지 한 권으로 집약했다!

 

 

이 책은 애플리케이션을 밑바닥부터 최종 완료할 때까지 완성해나가는 모습을 단계별로 보여준다. 이렇게 구성한 이유는 첫째, 개발 과정 전체에 함수형 접근 방식을 어떻게 적용하는지 더 넓은 관점에서 보여주기 위해서다. 둘째, 직접 만들어봐야 실제 함수형 프로그래밍을 제대로 배울 수 있기 때문이다. 이 책의 프로젝트는 테스트, 도메인 탐색, 함수형 프로그래밍을 사용해 견고하고 유연한 소프트웨어를 빠르게 구축하는 것이 목표다. 애플리케이션 개발의 전 과정을 함수형 디자인에 따라 점진적으로 진행하면서 모나드, 애플리커티브, 프로펑터 같은 고급 개념도 자연스럽게 다룰 것이다. 이 책의 개념과 의도를 완전히 이해하려면 직접 손을 움직여 코드를 공부하고 연습 문제를 풀어야 한다. 함수형 프로그래밍은 그냥 코드를 읽는 것만으로는 배울 수 없다. 가장 좋은 방법은 연습하는 것이다. 매 장마다 제시한 연습 문제들도 깃허브에서 힌트를 제공하고 있으니 지나치지 말고 도전해보자.

 

목차

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 카테고리 이론

____책

____블로그

____비디오

 

 

찾아보기

 

더보기접기

저자&기여자

ㆍ지은이 우베르토 바르비니

소개
열정 넘치는 프로그래머로, 오래 전 Zx스펙트럼(ZxSpectrum, 싱클레어 리서치가 영국에 출시한 8비트 PC)에서 비디오 게임을 처음 만들면서 프로그래밍을 시작했다. 아주 큰 회사부터 아주 작은 회사에 이르기까지 다양한 조직에서 일하면서 팀이 효율적이고 지속가능한 방식으로 소프트웨어를 구축해 회사에 가치를 창출하도록 코치하는 일을 해 왔다. 다양한 함수형 언어(하스켈, 클로저, 스칼라)를 사용했고 현재는 코틀린의 단순함과 생산성에 푹 빠져 있다. 전 세계에서 열리는 코틀린과 자바 컨퍼런스에 강사로 자주 참가하며, 젊은 프로그래머들의 멘토가 되는 것을 즐긴다. • 트위터: https://twitter.com/ramtop • 미디엄: https://medium.com/@ramtop • 링크드인: https://www.linkedin.com/in/uberto • 마스토돈: https://mastodon.online/@ramtop

ㆍ옮긴이 오현석

소개
모빌리티42 이사로 일하면서 매일 고객의 요청에 따라 코드를 만드는 현업 개발자다. 『코틀린 함수형 프로그래밍』(에이콘, 2023) 등 코틀린 서적을 여러 권 번역했고, 코틀린 외에도 『실전 파이썬 핸즈온 프로젝트』(책만, 2022), 『읽고 나면 진짜 쉬워지는 자료 구조』(길벗, 2024) 등 다양한 프로그래밍 언어와 프로그래밍 기술에 대한 책을 번역했으며, 『핵심 코틀린 프로그래밍』(에이콘, 2023) 책을 쓴 저자이기도 하다.

보도자료

저작권 안내

모든 자료는 저작권법의 보호를 받는 저작물로, 허락 없이 편집하거나 다른 매체에 옮겨 실을 수 없습니다.
인공지능(AI) 기술 또는 시스템을 훈련하기 위해 자료의 전체 내용은 물론 일부도 사용하는 것을 금지합니다.

All materials are protected by copyright law and may not be edited or reproduced in other media without permission.
It is prohibited to use all or part of the materials, including for training artificial intelligence (AI) technologies or systems, without authorization.

연관 프로그램

아래 프로그램은 길벗출판사가 제공하는 것이 아닙니다.
무료로 사용할 수 있는 정보를 안내해 드리니, 지원이 필요하면 해당 프로그렘 제작사로 문의해 주세요.