장바구니 담기 close

장바구니에 상품을 담았습니다.

객체에서 함수로

객체에서 함수로

  • 우베르토 바르비니
  • |
  • 길벗
  • |
  • 2024-12-20 출간
  • |
  • 544페이지
  • |
  • 183 X 235 X 22mm
  • |
  • ISBN 9791140712052
판매가

38,000원

즉시할인가

34,200

배송비

무료배송

(제주/도서산간 배송 추가비용:3,000원)

수량
+ -
총주문금액
34,200

※ 스프링제본 상품은 반품/교환/환불이 불가능하므로 신중하게 선택하여 주시기 바랍니다.

출판사서평

객체 지향에서 함수형으로!
더 빠르고 안전하게, 적은 코드로 더 나은 결과를 얻어라!

객체 지향에 함수형 프로그래밍을 더하라!
객체 지향 프로그래밍 지식이 탄탄하고 기술적으로도 숙련된 개발자가 함수형 프로그래밍을 배우는 것은 뇌를 다시 배선하는 것과 같다. 결코 쉽지 않은, 어려운 작업이지만 보상은 매우 크다. 더 적은 노력으로 더 나은 코드를 작성할 수 있기 때문이다.

함수형 프로그래밍을 더한다면 코틀린으로 하라!
함수형 프로그래밍과 객체 지향 프로그래밍의 장점을 함께 누릴 수 있는 언어가 있다. 바로 코틀린이다. 배우기 쉽고, 간결하고 안전하며, 자바와 상호 운용하거나 자바 라이브러리와 통합하기도 쉽다. 또한 코틀린 타입 시스템은 자바 타입 시스템보다 함수형 프로그래밍에 더 친화적이며, 생산성도 매우 높다. 혹시 코틀린을 모른다면 이 책을 통해 코틀린도 배우자. 자바나 C# 같은 언어를 알고 있다면 수월하게 코틀린을 배울 수 있다.

목표는 함수형+코틀린으로 더 나은 소프트웨어를 작성하는 것이다!
이 책은 1장부터 12장까지 함수형 디자인을 따라 애플리케이션을 점진적으로 구축하는 방법을 보여준다. 점진적으로 진행하지만, 애플리케이션을 구축하면서 모나드, 애플리커티브, 프로펑터 같은 고급 개념도 다룰 것이다. 각 장을 순서대로 읽으면 완전한 애플리케이션을 구축하는 과정을 잘 이해할 수 있도록 구성했다. 마지막 13장은 여러 서비스를 아우르는 완전한 소프트웨어 아키텍처를 함수형 접근 방식을 사용해 디자인하고 구축하는 방법에 관해 설명했다. 이 책을 통해 함수형 개념을 점진적으로 도입하는 방법은 물론, 고급 개념을 사용해보면서 실제로 도움이 되는 효과적인 코딩 방법을 배워 보자!


[지은이 서문]
이 책의 핵심 목표는 일상 업무에서 함수형 사고를 쉽게 배우고 사용할 수 있는 방법을 보여주는 것이다. 함수형 프로그래밍 자체가 궁극적인 목표가 아니라 견고하고 적응가능한 소프트웨어를 빠르게 구축하는 것이 목표이며, 이를 달성하는 가장 좋은 도구는 테스트 및 도메인 탐색, 함수형 프로그래밍이라고 믿는다. 그럼에도 함수형 프로그래밍 자체만을 추구하지는 않는다. 부분적인 함수형 해법이 순수 함수형 해법보다 더 나은 성능을 발휘한다면, 나는 주저하지 않고 전자를 제안할 것이다. 코틀린을 몰라도 자바, C# 등의 유사한 언어를 알고 있다면 충분하다. 이 책은 중고급 프로그래머를 대상으로 한다.
• 객체 지향 프로그래밍에 탄탄한 배경 지식을 가진 숙련된 개발자로, 함수형 프로그래밍과 이점에 대해 더 알고 싶은 개발자
• 고전적인 교과서 예제를 전체 애플리케이션으로 변환하는 데 어려움을 겪는 함수형 프로그래밍 초보자
• 함수형 프로그래밍에 능숙하며 코틀린에 관심이 있는 프로그래머


[옮긴이 서문]
현재는 함수형 프로그래밍의 장점에 대해 많은 사람들이 동의하고 있다. 상태가 없는 순수 함수를 파라미터로 받는 여러 고차 함수를 사용해 컬렉션을 조작하는 스타일의 코딩은 이제 객체 지향 개발자들이 사용하는 컬렉션 라이브러리에도 깊이 침투해 있고, 리액트나 컴포즈 등의 UI 프레임워크는 함수 컴포넌트를 통해 상태 관리와 UI 구성을 분리함으로써 좀 더 깔끔한 관심사의 분리를 지원한다.
그럼에도 불구하고 실무에서 함수형 프로그래밍을 적용할 때는 컬렉션 처리나 함수 안에 한정된 로직 등의 작은 단위에 함수형 프로그래밍 방식을 적용하고, 커다란 단위에서는 객체 지향 프로그래밍 등을 사용해 프로젝트를 진행하는 경우가 많다. 하지만 상태를 사용하는 참조 투명하지 않은 코드인 액션은 전염성이 있기 때문에 프로그램에서 액션과 계산, 데이터를 잘 분리하지 않으면 액션이 전파되면서 전체 프로그램이 함수형 프로그래밍과는 거리가 먼, 상태 관리를 중심으로 하는 프로그램이 되기 쉽다. 복잡하고 커다란 프로젝트에서는 데이터베이스 등의 상태 관리가 필수적인데, 대부분의 개발자는 전통적인 객체 지향 방식에 익숙하고 큰 시스템에서 좀 더 함수적으로 액션과 계산을 분리해 프로그램을 깔끔하게 작성하는 방법을 잘 모르는 경우가 많다. 이 책이 많은 개발자들이 프로젝트를 더 깔 끔하게 설계하고 유지하는 데 도움이 되길 빈다.

목차

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 카테고리 이론
____책
____블로그
____비디오

찾아보기

교환 및 환불안내

도서교환 및 환불
  • ㆍ배송기간은 평일 기준 1~3일 정도 소요됩니다.(스프링 분철은 1일 정도 시간이 더 소요됩니다.)
  • ㆍ상품불량 및 오배송등의 이유로 반품하실 경우, 반품배송비는 무료입니다.
  • ㆍ고객님의 변심에 의한 반품,환불,교환시 택배비는 본인 부담입니다.
  • ㆍ상담원과의 상담없이 교환 및 반품으로 반송된 물품은 책임지지 않습니다.
  • ㆍ이미 발송된 상품의 취소 및 반품, 교환요청시 배송비가 발생할 수 있습니다.
  • ㆍ반품신청시 반송된 상품의 수령후 환불처리됩니다.(카드사 사정에 따라 카드취소는 시일이 3~5일이 소요될 수 있습니다.)
  • ㆍ주문하신 상품의 반품,교환은 상품수령일로 부터 7일이내에 신청하실 수 있습니다.
  • ㆍ상품이 훼손된 경우 반품 및 교환,환불이 불가능합니다.
  • ㆍ반품/교환시 고객님 귀책사유로 인해 수거가 지연될 경우에는 반품이 제한될 수 있습니다.
  • ㆍ스프링제본 상품은 교환 및 환불이 불가능 합니다.
  • ㆍ군부대(사서함) 및 해외배송은 불가능합니다.
  • ㆍ오후 3시 이후 상담원과 통화되지 않은 취소건에 대해서는 고객 반품비용이 발생할 수 있습니다.
반품안내
  • 마이페이지 > 나의상담 > 1 : 1 문의하기 게시판 또는 고객센터 1800-7327
교환/반품주소
  • 경기도 파주시 문발로 211 1층 / (주)북채널 / 전화 : 1800-7327
  • 택배안내 : CJ대한통운(1588-1255)
  • 고객님 변심으로 인한 교환 또는 반품시 왕복 배송비 5,000원을 부담하셔야 하며, 제품 불량 또는 오 배송시에는 전액을 당사에서부담 합니다.