지은이 : 유인동
마플코퍼레이션의 CTO이자 22년 차 소프트웨어 엔지니어. 카카오와 엔씨소프트 오픈마루팀에서 개발자로 근무했으며 넥슨, 네이버, 카카오 등 국내 주요 IT 기업의 개발자를 대상으로 기술 교육을 진행한 경험이 있다.타입스크립트, 오브젝티브-C, 자바, Node.js, PostgreSQL, 클로저, 루비 온 레일즈 등 다양한 언어와 기술을 다루며 폭넓은 소프트웨어 개발 노하우를 쌓고 있다. 또한 객체지향 프런트엔드 개발 라이브러리인 rune-ts와 데이터베이스 쿼리 빌더 FxSQL을 직접 개발하고 함수형 라이브러리 FxTS 설계에도 참여하는 등 다양한 오픈소스 프로젝트에 기여했다. 최근에는 소프트웨어 공학을 사랑하는 온라인 커뮤니티 마플개발대학의 교수로 활동하며 지식을 공유하고 있다.
1장 멀티패러다임이 현대 언어를 확장하는 방법
1.1 객체지향 디자인 패턴의 반복자 패턴과 일급 함수
__1.1.1 GoF의 반복자 패턴
__1.1.2 ArrayLike로부터 Iterator 생성하기
__1.1.3 ArrayLike를 역순으로 순회하는 이터레이터 만들기
__1.1.4 지연 평가되는 map 함수
__1.1.5 멀티패러다임의 교차점: 반복자 패턴과 일급 함수
1.2 명령형 프로그래밍으로 이터레이터를 만드는 제너레이터 함수
__1.2.1 제너레이터 기본 문법
__1.2.2 제너레이터로 작성한 reverse 함수
1.3 자바스크립트에서 반복자 패턴 사례: 이터레이션 프로토콜
__1.3.1 이터레이터와 이터러블
__1.3.2 언어와 이터러블의 상호작용
__1.3.3 제너레이터로 만든 이터레이터도 이터러블
1.4 이터러블을 다루는 함수형 프로그래밍
__1.4.1 forEach 함수
__1.4.2 map 함수
__1.4.3 filter 함수
__1.4.4 고차 함수 조합하기
__1.4.5 재미난 filter
1.5 이터러블 프로토콜이 상속이 아닌 인터페이스로 설계된 이유
__1.5.1 Web API의 NodeList도 이터러블
__1.5.2 상속이 아닌 인터페이스로 해결해야 하는 이유
__1.5.3 인터페이스와 클래스 상속
1.6 요약 정리
2장 함수형 프로그래밍과 타입 시스템 그리고 LISP
2.1 타입 추론과 함수 타입 그리고 제네릭
__2.1.1 타입 추론
__2.1.2 함수 타입과 제네릭
2.2 멀티패러다임 언어에서 함수형 타입 시스템
__2.2.1 이터레이션 프로토콜과 타입 다시 보기
__2.2.2 함수형 고차 함수와 타입 시스템
__2.2.3 함수 시그니처와 중첩된 함수들의 타입 추론
2.3 멀티패러다임 언어와 메타프로그래밍 - LISP로부터
__2.3.1 Pipe Operator
__2.3.2 클래스와 고차 함수, 반복자, 타입 시스템을 조합하기
__2.3.3 LISP(클로저)에서 배우기 - 코드가 데이터, 데이터가 코드
__2.3.4 클로저에서 map이 실행될 때
__2.3.5 멀티패러다임 언어에서 사용자가 만든 코드이자 클래스를 리스트로 만들기
__2.3.6 LISP의 확장성 - 매크로와 메타프로그래밍
__2.3.7 런타임에서 동적으로 기능 확장하기
__2.3.8 언어를 확장하는 즐거움
2.4 요약 정리
3장 코드 : 객체 : 함수 = Generator : Iterator : LISP = IP : OOP : FP
3.1 코드가 곧 데이터 - 로직이 담긴 리스트
__3.1.1 [for, i++, if, break] - 코드를 리스트로 생각하기
__3.1.2 현대 언어에서 리스트 프로세싱 - 클로저, 코틀린, 스위프트, 스칼라, C#, 자바
__3.1.3 언어를 넘어 적용 가능한 개념, 패러다임
3.2 하스켈로부터 배우기
__3.2.1 하스켈의 함수와 함수 시그니처
__3.2.2 언어 차원에서 지원하는 커링
__3.2.3 main 함수와 IO
__3.2.4 head, map, filter, foldl 함수 시그니처
__3.2.5 함수 합성 - . 연산자와 $ 연산자
__3.2.6 sumOfSquaresOfOddNumbers 함수
__3.2.7 파이프라인 스타일 - &
__3.2.8 Either를 통한 에러 처리
__3.2.9 패턴 매칭
3.3 지연 평가 자세히 살펴보기
__3.3.1 중첩된 이터레이터의 실행 순서 - 제너레이터로 확인하기
__3.3.2 자세히 살펴보기
__3.3.3 이터레이터로 직접 살펴보기
__3.3.4 단순화해서 살펴보기
3.4 Generator :Iterator :LISP - 지연 평가와 안전한 합성
__3.4.1 find 함수 시그니처
__3.4.2 하스켈에서 find 함수와 안전한 합성
__3.4.3 find 함수로 생각하는 지연 평가와 리스트 프로세싱
__3.4.4 타입스크립트에서의 안전한 합성
__3.4.5 every 함수
__3.4.6 some 함수
__3.4.7 지연 평가에 기반한 break 로직 끼워 넣기
__3.4.8 every와 some 함수의 공통 로직을 함수형으로 추상화하기
__3.4.9 concat으로 더하기
3.5 요약 정리
4장 비동기 프로그래밍
4.1 값으로 다루는 비동기
__4.1.1 Promise __4.1.2 new Promise( )를 직접 사용해본 적 있는가
__4.1.3 Promise.race
__4.1.4 IO 작업에 타임아웃 설정하기
__4.1.5 응답 속도에 따라 다른 전략으로 UI 렌더링하기
__4.1.6 Promise.all
__4.1.7 Promise.allSettled
__4.1.8 Promise.any
4.2 지연성으로 다루는 비동기
__4.2.1 Promise 실행을 지연하려면
__4.2.2 챗GPT가 명령형으로 구현한 동시성 핸들링 함수
__4.2.3 함수형으로 구현한 동시성 핸들링 함수
__4.2.4 효과적인 비동기 핸들링으로 가는 계단 - 지연성
4.3 타입으로 다루는 비동기
__4.3.1 AsyncIterator, AsyncIterable, AsyncGenerator 프로토콜
__4.3.2 AsyncIterable을 다루는 고차 함수
__4.3.3 동기와 비동기를 동시에 지원하는 함수로 만드는 규약 - toAsync
__4.3.4 타입 시스템 + 비동기 함수형 함수 + 클래스
4.4 비동기 에러 핸들링
__4.4.1 여러 이미지를 불러와서 높이 구하기
__4.4.2 개선된 비동기 로직
__4.4.3 에러가 제대로 발생되도록 하는 것이 핵심
__4.4.4 안정적인 소프트웨어와 비동기 프로그래밍
4.5 요약 정리
5장 실전 함수형 프로그래밍
5.1 실전 데이터 다루기
__5.1.1 2차원 배열에서 숫자 다루기
__5.1.2 농구팀 데이터 다루기
__5.1.3 커머스 데이터 다루기
__5.1.4 커머스 데이터 다루기 2
__5.1.5 일관된 접근 방식으로 문제 해결하기
5.2 더 많은 문제에 적용하기
__5.2.1 pipe 함수
__5.2.2 pipe와 비동기 함수 합성
__5.2.3 zip 함수
__5.2.4 인덱스가 값으로 필요할 때
__5.2.5 콜라츠 추측 - 1이 될 때까지 세기
__5.2.6 break를 대신하는 take, takeWhile, takeUntilInclusive
__5.2.7 함수의 조합으로 만들어내는 로직
5.3 백엔드 비동기 프로그래밍
__5.3.1 커머스 플랫폼의 결제 프로세스 문제
__5.3.2 결제 내역 동기화 스케줄러 만들기
__5.3.3 해시 기반 접근으로 시간 복잡도 최적화
__5.3.4 안정적인 비동기 작업 간격 유지
__5.3.5 최대 요청 크기 제한을 효과적으로 처리하기
__5.3.6 사전 카운트로 효율 높이기
__5.3.7 병렬성으로 효율 높이기
__5.3.8 리스트 프로세싱 기반 비동기/동시성 프로그래밍
5.4 리스트 프로세싱 패턴화
__5.4.1 변형-누적 패턴
__5.4.2 중첩-변형 패턴
__5.4.3 반복자-효과 패턴
__5.4.4 필터-중단 패턴
__5.4.5 무한-중단 패턴
__5.4.6 분할-평탄 패턴
__5.4.7 변형-평탄 패턴
__5.4.8 결합-누적 패턴
__5.4.9 해시-매치 패턴
__5.4.10 리스트 프로세싱 함수 유형별 개념 정리
5.5 요약 정리
6장 멀티패러다임 프로그래밍
6.1 HTML 템플릿 엔진 만들기
__6.1.1 Tagged Templates
__6.1.2 리스트 프로세싱으로 구현하기
__6.1.3 push를 concat으로
__6.1.4 XSS 공격 방지
__6.1.5 중첩 데이터 처리로 컴포넌트 방식 개발 지원하기
__6.1.6 구조의 문제는 객체지향으로, 로직의 문제는 함수형으로 해결하기
__6.1.7 배열로부터 html 문자열 만들기
__6.1.8 객체를 함수형으로 더하기
__6.1.9 배열 처리를 클래스 내부로 이동하여 편의성 높이기
__6.1.10 고차 함수로 추상화하기
__6.1.11 작은 프런트엔드 개발 라이브러리 만들기
__6.1.12 멀티패러다임 언어가 제시하는 기회
6.2 멀티패러다임을 활용한 동시성 핸들링
__6.2.1 executeWithLimit 다시 보기
__6.2.2 챗GPT가 명령형으로 구현한 동시성 핸들링 함수
__6.2.3 멀티패러다임으로 구현한 동시성 핸들링 함수
__6.2.4 동시성(부하) 크기를 동적으로 변경할 수 있도록 확장하기
__6.2.5 무한 반복되는 작업의 부하 조절하기
__6.2.6 runAllSettled 추가하기
6.3 요약 정리
7장 객체지향 프런트엔드 개발 그리고 멀티패러다임적 접근과 응용
7.1 Setting 앱 만들기
__7.1.1 SwitchView
__7.1.2 SettingItemView
__7.1.3 SettingListView
__7.1.4 SettingPage
__7.1.5 전체 토글 기능 추가하기
__7.1.6 객체 간 통신과 커스텀 이벤트 디스패치
__7.1.7 이벤트가 자꾸 루프에 빠지고 부수 효과가 발생하는 이유
__7.1.8 타입 안전한 커스텀 이벤트 통신 패턴
__7.1.9 재사용 가능한 컴포넌트 SwitchView
__7.1.10 패러다임이 만드는 리액티브한 코드
7.2 Todo 앱 만들기
__7.2.1 CheckView
__7.2.2 추상 클래스와 상속
__7.2.3 Headless UI
__7.2.4 TodoItemView
__7.2.5 계층적 캡슐화를 통한 도메인과 UI 명명 불일치 관리
__7.2.6 TodoListView
__7.2.7 제네릭 클래스로 추상화
__7.2.8 TodoPage
__7.2.9 인터페이스에 기반한 객체 간 통신으로 중복 제거하기
__7.2.10 GoF의 디자인 패턴 관점으로 보기 - 전략 패턴
__7.2.11 일급 함수를 활용한 객체 간 통신 - 콜백 인젝션 패턴
__7.2.12 멀티패러다임적인 코드 설계
7.3 Todo 앱 만들기 2
__7.3.1 데코레이터로 코드를 간결하게
__7.3.2 TextSubmitView
__7.3.3 ListView에 헬퍼 메서드 추가하기
__7.3.4 새로운 Todo 생성하기
__7.3.5 SegmentControlView
__7.3.6 휴리스틱 기반 Diff로 DOM 업데이트 최적화
7.4 Todo 앱 만들기 3
__7.4.1 상태 패턴으로 유연하게 만들기
__7.4.2 상태 패턴 적용의 이점
__7.4.3 런타임에서도 변경 가능한 코드와 소프트웨어 동작
__7.4.4 상태 객체로 더 확장하기
__7.4.5 멀티패러다임 객체지향 설계
7.5 비동기와 UI, Promise와 Class
__7.5.1 Promise를 활용한 alert, confirm
__7.5.2 값으로서의 Promise, 컴포넌트 간 통신 매개
__7.5.3 그룹 채팅에 참여할 친구 선택하기
도서 DB 제공 - 알라딘 인터넷서점 (www.aladin.co.kr)