자바스크립트 패턴과 테스트
견고한 코딩 기술을 배우자!
자바스크립트는 이제 단순 작업을 넘어 엔터프라이즈 애플리케이션 개발, 웹 서비스, 모바일 서비스 등 다양한 분야에서 사용하는 주류 언어가 되었다. 하지만 과거 웹 개발을 하듯 혹은 C/C++/자바에서 하듯 개발한다면 그 프로그램은 문제를 일으키고 말 것이다.
이 책은 자바스크립트만의 독특한 문법 구조를 이해하고 견고한 프로그램을 개발하는 데 필요한 기술과 원리를 설명한다. 콜백 패턴, 프라미스 패턴, 싱글톤 패턴, 장식자 패턴 같은 패턴과 단위 테스팅을 활용해서 오류 없고 견고한 프로그램을 개발하는 방법을 예제와 함께 보여준다.
이 책을 읽고 나면 패턴과 테스트는 물론 SOLID, DRY 같은 소프트웨어 공학 원칙과 테스트 주도 개발(TDD) 철학에 대한 통찰도 얻게 될 것이다.
«자바스크립트 패턴과 테스트»는 1~6장까지 공개합니다.
전자책 구입
목차
- 제1부 | 기초 다지기
- 1장. 좋은 소프트웨어 만들기
- 1.1 바르게 시작하는 코드 작성하기
- 1.1.1 자바스크립트 특성을 완벽히 섭렵하라
- 1.1.2 대규모 시스템에서 자바스크립트 함정을 피하라
- 1.1.3 소프트웨어 공학 원칙을 적용하라
- 1.2 바르게 유지되는 코드 작성하기
- 1.2.1 단위 테스트는 미래에 대비한 투자다
- 1.2.2 테스트 주도 개발을 실천하라
- 1.2.3 테스트하기 쉬운 코드로 다듬어라
- 1.3 정리하기
- 2장. 도구 다루기
- 2.1 테스팅 프레임워크
- 2.1.1 잘못된 코드 발견하기
- 2.1.2 테스트성을 감안하여 설계하기
- 2.1.3 꼭 필요한 코드만 작성하기
- 2.1.4 안전한 유지 보수와 리팩토링
- 2.1.5 실행 가능한 명세
- 2.1.6 최신 오픈 소스 및 상용 프레임워크
- 2.1.7 재스민 들어가기
- 2.2 의존성 주입 프레임워크
- 2.2.1 의존성 주입이란?
- 2.2.2 의존성을 주입하여 믿음직한 코드 만들기
- 2.2.3 의존성 주입의 모든 것
- 2.2.4 사례 연구: 경량급 의존성 주입 프레임워크 개발
- 2.2.5 의존성 주입 프레임워크 활용
- 2.2.6 최신 의존성 주입 프레임워크
- 2.3 애스팩트 툴킷
- 2.3.1 사례 연구: AOP 있는/없는 캐싱
- 2.3.2 사례 연구: Aop.js 모듈 개발
- 2.3.3 다른 AOP 라이브러리
- 2.3.4 결론
- 2.4 코드 검사 도구
- 2.4.1 린팅 도구로 믿음직한 코드 만들기
- 2.4.2 JSHint 들어가기
- 2.4.3 JSHint 대체 도구
- 2.4.4 엄격 모드
- 2.5 정리하기
- 3장. 객체를 바르게 만들기
- 3.1 원시형
- 3.2 객체 리터럴
- 3.3 모듈 패턴
- 3.3.1 임의 모듈 생성
- 3.3.2 즉시 실행 모듈 생성
- 3.3.3 모듈 생성의 원칙
- 3.4 객체 프로토타입과 프로토타입 상속
- 3.4.1 기본 객체 프로토타입
- 3.4.2 프로토타입 상속
- 3.4.3 프로토타입 체인
- 3.5 new 객체 생성
- 3.5.1 new 객체 생성 패턴
- 3.6 클래스 상속
- 3.6.1 고전적 상속 흉내 내기
- 3.6.2 반복이 캥거루 잡네
- 3.7 함수형 상속
- 3.8 멍키 패칭
- 3.9 정리하기
- 제2부 | 패턴을 응용한 코드 테스팅
- 4장. 패턴이 좋은 점
- 4.1 사례 연구
- 4.2 어휘력을 늘려 더 멋진 코드 만들기
- 4.3 잘 다듬고 테스트한 블록을 쌓아 믿음직한 코드 작성하기
- 4.4 정리하기
- 5장. 콜백 패턴
- 5.1 단위 테스트
- 5.1.1 콜백 함수를 사용한 코드의 작성과 테스팅
- 5.1.2 콜백 함수의 작성과 테스팅
- 5.2 문제 예방
- 5.2.1 콜백 화살 눌러 펴기
- 5.2.2 this를 조심하라
- 5.3 정리하기
- 6장. 프라미스 패턴
- 6.1 단위 테스트
- 6.1.1 프라미스 사용법
- 6.1.2 프라미스 생성과 반환
- 6.1.3 XMLHttpRequest 테스팅
- 6.2 프라미스 체이닝
- 6.3 프라미스 래퍼
- 6.4 상태와 숙명
- 6.5 표준 프라미스가 제이쿼리 프라미스와 다른 점
- 6.6 정리하기
- 7장. 부분 적용 함수
- 7.1 단위 테스트
- 7.2 부분 적용 함수 만들기
- 7.3 부분 적용 함수와 커링 구별하기
- 7.3.1 커링
- 7.3.2 부분 적용 함수
- 7.4 정리하기
- 8장. 메모이제이션 패턴
- 8.1 단위 테스트
- 8.2 AOP로 메모이제이션 추가하기
- 8.2.1 메모이제이션 애스팩트 생성하기
- 8.2.2 returnValueCache 애스팩트를 restaurantApi에 적용하기
- 8.3 정리하기
- 9장. 싱글톤 패턴
- 9.1 단위 테스트
- 9.1.1 객체 리터럴로 싱글톤 공유 캐시 구현하기
- 9.1.2 모듈로 싱글톤 공유 캐시 구현하기
- 9.2 정리하기
- 10장. 팩토리 패턴
- 10.1 단위 테스트
- 10.2 팩토리 패턴 구현
- 10.3 다른 팩토리 유형
- 10.4 정리하기
- 11장. 샌드박스 패턴
- 11.1 단위 테스트
- 11.1.1 위젯 샌드박스 만들기
- 11.1.2 샌드박스 도구 생성과 테스팅
- 11.1.3 샌드박스에서 쓸 함수 만들기
- 11.2 정리하기
- 12장. 장식자 패턴
- 12.1 단위 테스트
- 12.1.1 장식된 객체의 모의체 작성
- 12.1.2 에러 패스-스루 테스팅
- 12.1.3 아무것도 하지 않는 장식자 작성
- 12.1.4 장식자에 패스-스루 기능 추가
- 12.1.5 성공 패스-스루 확인
- 12.1.6 장식자 특성 추가
- 자바스크립트 패턴과 테스트
- 12.2 정리하기
- 13장. 전략 패턴
- 13.1 단위 테스트
- 13.1.1 전략 패턴 없이 transportScheduler 구현하기
- 13.1.2 전략 패턴을 사용하여 transportScheduler 구현하기
- 13.2 정리하기
- 14장. 프록시 패턴
- 14.1 단위 테스트
- 14.2 정리하기
- 15장. 체이너블 메서드
- 15.1 단위 테스트
- 15.2 체이닝 덴
- 15.3 정리하기
- 제3부 | 자바스크립트 고급 특성을 응용한 테스팅과 코딩
- 16장. 인터페이스 없는 언어에서 인터페이스에 맞추기
- 16.1 인터페이스가 좋은 점
- 16.2 인터페이스 분리 원칙
- 16.3 TDD 방식으로 규약 레지스트리 생성하기
- 16.3.1 규약 정의
- 16.3.2 규약을 지키는지 판단
- 16.3.3 규약을 지킨다고 단언
- 16.3.4 규약 적용하지 않기
- 16.3.5 애스팩트를 만들어 반환(생성) 객체에 규약 적용하기
- 16.4 정리하기
- 17장. 인자 타입 확실히 하기
- 17.1 자바스크립트는 인자 타입이 따로 없다!
- 17.2 ContractRegistry를 확장하여 인자 체크하기
- 17.2.1 작업 범위
- 17.2.2 모든 변수가 규약을 지키는지 판단
- 17.2.3 모든 변수가 규약을 지킨다고 단언
- 17.2.4 인자 체크 기능을 애스팩트로 묶음
- 17.3 규약 라이브러리 지원
- 17.4 모두 합치기
- 17.4.1 규약 모듈 생성하기
- 17.4.2 애플리케이션 수준의 ContractRegistry 생성하기
- 17.4.3 출시할 제품에서 규약 없애기
- 17.5 애스팩트 지향 솔루션 vs 정적 솔루션
- 17.5.1 타입스크립트의 장점
- 17.5.2 애스팩트의 장점
- 17.6 정리하기
- 18장. call, apply, bind 삼인방
- 18.1 this 바인딩 원리
- 18.1.1 기본 바인딩
- 18.1.2 암시적 바인딩
- 18.1.3 new 바인딩
- 18.1.4 명시적 바인딩
- 18.2 call, apply, bind를 응용한 코드의 작성과 테스팅
- 18.2.1 call과 apply
- 18.2.2 Array.prototype.forEach 폴리필 제작하기
- 18.2.3 bind
- 18.3 정리하기
- 19장. 메서드 빌림
- 19.1 빌리는 객체가 알맞은가?
- 19.1.1 빌린 함수가 빌리는 객체를 검증하다
- 19.1.2 빌린 객체에 애스팩트를 붙임
- 19.1.3 borrow() 메서드
- 19.1.4 객체 검사기를 ContractRegistry에 추가하기
- 19.2 빌리는 객체에 미치는 부수 효과
- 19.2.1 분리된 함수에서 비롯된 부수 효과
- 19.2.2 다른 함수를 호출하는 함수에서 비롯된 부수 효과
- 19.3 빌려주는 객체에 미치는 부수 효과
- 19.4 정리하기
- 20장. 믹스인
- 20.1 믹스인 만들어 쓰기
- 20.1.1 재래식 믹스인 만들어 쓰기
- 20.1.2 함수형 믹스인 만들어 쓰기
- 20.2 정리하기
- 21장. 고급 프로그램 아키텍처 테스팅
- 21.1 관찰자 패턴
- 21.1.1 관찰자 패턴이란?
- 21.1.2 더 믿음직한 관찰자 패턴 구현하기
- 21.2 중재자 패턴
- 21.2.1 중재자 패턴이란?
- 21.2.2 더 믿음직한 중재자 기반 코드 구현하기
- 21.3 정리하기
- 제4부 | 고급 테스팅
- 22장. DOM 접근 테스팅
- 22.1 UI 단위 테스팅
- 22.1.1
- 22.1.2 UI 컴포넌트 개발
- 22.2 프로파일러로 코드 최적화
- 22.2.1 비효율적인 부분 감지하기
- 22.2.2 섣부른 최적화는 금물
- 22.3 정리하기
- 23장. 표준에 맞추기
- 23.1 ESLint
- 23.1.1 ESLint 설치하기
- 23.1.2 ESLint 실행하기
- 23.1.3 ESLint로 코딩 표준에 맞추기
- 23.2 아키텍처 틀에 맞추기
- 23.2.1 가족 기밀 기법
- 23.2.2 아로새김 기법
- 23.2.3 미션 임파서블 기법
- 23.2.4 마법의 지팡이 기법
- 23.2.5 호출 스택 기법은 사용하지 마라
- 23.2.6 다른 기법
- 23.2.7 다른 아키텍처
- 23.3 정리하기
- 제5부 | 총정리
- 24장. 테스트 주도 개발 원칙 정리
- 24.1 TDD의 의미를 다시 음미하자
- 24.2 TDD 실천
- 24.2.1 단위 테스트할 수 있는 코드를 작성하라
- 24.2.2 TDD 원리를 깨우쳐라
- 24.2.3 패턴 테스팅
- 24.3 정리하기
- 25장. 자바스크립트 관용 구문 정리
- 25.1 객체
- 25.1.1 객체 프로퍼티는 추가/삭제를 할 수 있다
- 25.1.2 객체를 딕셔너리처럼 쓸 수 있다
- 25.2 변수
- 25.2.1 변수 선언부는 끌어올려진다
- 25.2.2 변수는 함수 스코프를 가진다
- 25.3 함수
- 25.3.1 함수는 객체다
- 25.3.2 함수 정의부는 끌어올려진다
- 25.3.3 함수에 반환 타입 따위는 없다
- 25.3.4 이름 없는 함수도 있다
- 25.3.5 함수는 중첩 가능하다
- 25.3.6 함수 인자는 몇 개라도 좋다
- 25.3.7 함수를 즉시 실행할 수도 있다
- 25.4 불 연산
- 25.4.1 동등 비교를 할 때는 타입을 강제 변환한다
- 25.4.2 모든 값은 Truthy 아니면 Falsy다
- 25.5 정리하기