Top

Redis와 Node.js를 사용한 웹 애플리케이션 개발 [클라우드 시대 웹 서비스의 확장성을 높이는]

  • 원서명Building Scalable Apps with Redis and Node.js (ISBN 9781783984480)
  • 지은이조슈아 조하난(Joshua Johanan)
  • 옮긴이김기성
  • ISBN : 9788960777293
  • 33,000원
  • 2015년 06월 30일 펴냄
  • 페이퍼백 | 360쪽 | 188*235mm
  • 시리즈 : acorn+PACKT, 웹 프로페셔널

책 소개

요약

이 책에서는 최근 많은 주목을 받고 있는 Node.js와 레디스(Redis)를 사용해 실제 웹 애플리케이션을 개발하기 위한 노하우를 전수하고 있다. 성공적인 웹 서비스를 개발하고 운영하기 위해 필수적인 운영 시스템의 확장성을 보장하기 위한 방법을 최신의 프레임워크인 Node.js를 사용해 웹 애플리케이션을 밑바닥에서부터 개발하는 실제 예를 통해 이슈와 해결 방법을 설명하고 있다. 또한 최근에 주목 받고 있는 메모리 기반 키-값 스토리지인 레디스에 대해서도 설명하고 있으며 이 외에도 웹 애플리케이션 개발에 필요한 여러 모듈과 툴을 소개하고 있다.

이 책에서 다루는 내용

■ 직접 익스프레스(Express) 모듈의 미들웨어 구축과 실행
■ Socket.IO와 익스프레스 모듈을 통합하고 동일한 인증 방식 사용
■ 비밀번호를 안전하게 로컬 스토어에 저장하는 방법
■ 메시지 큐를 사용해 애플리케이션을 여러 부분으로 나눠 관리
■ 레디스(Redis)로 서버들 간의 공유된 상태 만들기
■ 백본(Backbone)과 Socket.IO, 리액트(React)로 빠르고 동적인 실시간의 프론트엔드 구축
■ Grunt.js 태스크러너를 사용한 빌드 과정 자동화
■ 클라우드 서버로 애플리케이션을 실행하는 배치 스크립트 작성

이 책의 대상 독자

'확장성(scalability)'이라는 단어가 낯설게 들린다면, 이 책을 꼭 읽어보기 바란다. 프레임워크에 대한 설명은 사전지식을 요구하지 않기 때문에 Node.js를 사용해 본 적이 많지 않아도 상관 없다. 확장성 있는 Node.js 애플리케이션을 곧 만들게 될 것이다! 자바스크립트는 알고 있어야 한다.

이 책의 구성

1장, ‘익스프레스를 사용한 백엔드 개발’에서는 익스프레스를 사용해서 페이지를 보여 주는 것을 배운다. 익스프레스는 완전한 기능을 갖춘 웹 애플리케이션 프레임워크로 소량의 코드를 작성해도 여러 가지 기능을 쓸 수 있게 해준다. 또, 이를 확장해 만든 탄탄한 미들웨어 시스템도 갖추고 있다. 미들웨어는 템플릿과 세션뿐 아니라 폼 데이터도 작업할 수 있게 해준다. 1장에서 애플리케이션의 토대를 만들고, 2장부터는 활용할 것이다.

2장, ‘Socket.IO를 사용한 확장’에서는 웹소켓을 사용해 실시간 애플리케이션을 만드는 방법을 보여준다. 웹소켓은 사용자가 실시간으로 교신할 수 있게 해주는 동적 웹페이지 발전의 다음 단계다. 2장은 익스프레스 모듈로 만든 세션에 Socket.IO 모듈을 적용하는 예제를 보여준다.

3장, ‘사용자 인증’에서는 제대로 동작하는 로그인 페이지를 만드는 법을 보여 준다. 여기서 패스포트 프레임워크를 사용해 인증 함수를 만든다. 패스포트는 여러 프로바이더들과 연결할 커넥터를 만드는 데 주로 쓰인다. 커넥터들은 OAuth나 OAuth 2.0을 구현한다. 여러 OAuth 프로바이더들을 대상으로 커넥터를 직접 구현할 필요 없이 각 라이브러리가 처리한다. 로컬 패스워드를 안전하게 저장하는 방법도 알게 된다.

4장, ‘RabbitMQ로 메시지 큐잉하는 법’에서는 메시지 큐(Queue)를 다룬다. 메시지 큐는 확장성 있는 애플리케이션의 필수 사항으로, 애플리케이션을 분해해서 복잡성이나 스코프를 처리할 수 있게 해준다. 4장에서 이에 대한 예제를 다루게 된다. 또한 사용자 각자의 메시지 큐를 만들어서 함수에 연결하는 방법도 알려 준다.

5장, ‘애플리케이션 데이터 저장소로 레디스 사용하기’에서는 레디스에 정보를 저장하고 회수하는 방법을 배운다. 레디스 데이터 스토리지 엔진은 관계형 데이터베이스와 다르기 때문에 꼭 배워야 한다. 관계형 데이터베이스처럼 생각하면 문제가 발생할 수 있다. 애플리케이션을 만들 때 주로 쓰는 커맨드뿐만 아니라 레디스가 메시지 큐를 수행하는 방법에 대해 배운다.

6장, ‘바우어를 사용한 프론트엔트 의존성 관리’에서는 애플리케이션의 프론트엔드 개발을 시작하는 방법을 배운다. 프론트엔드가 없는 애플리케이션은 없다. 여기서 쓸 프레임워크에 대해 알아보고 왜 그 프레임워크를 사용했는지 알게 될 것이다.

7장, ‘DOM 이벤트를 위한 백본과 리액트 사용’에서는 프론트엔드의 중추 역할을 하는 백본을 다룬다. 브라우저에서 자바스크립트를 수행할 때 중요한 것 두 가지는 DOM 조작과 이벤트 응답이다. 실시간 이벤트의 리스너를 만드는 방법과 페이지와 상호 작용하는 방법을 배운다. 백본과 리액트로 지속 가능한 코드를 만들어 이를 수행한다.

8장, ‘애플리케이션 개발을 위한 자바스크립트 사용 사례’에서는 더 나은 자바스크립트 코드를 작성하는 법을 배운다. 스크립트 언어인 자바스크립트는 실수를 많이 해도 실행이 되는데, 이는 장점이기도 하고 단점이기도 하다. 하지만 세미콜론을 빼먹거나 런타임 오류가 발생하는 것은 알아야 한다. 이는 반복되는 빌드 시스템을 만들어 해결한다. 여러 모듈들을 보고 어떤 모듈은 코드에 적용하지 않을지 배운다.

9장, ‘배치와 확장성’에서는 로컬호스트 주소를 삭제하는 방법을 배운다. 배치할 때 실수로 어떤 단계를 빠트리는 경우가 많기 때문에 배치 스크립트를 제대로 만드는 것이 중요하다. 한 개 이상의 서버에 배치하는 법과 배치할 수 있는 여러 환경을 만드는 법을 배운다. 서버가 여러 개 있으면 수평 확장이 가능하므로 서버를 추가하기 쉬운 장점이 있다.

10장, ‘디버깅과 문제 해결’에서는 함수 호출 상태를 알아보는 방법에 대해 설명한다. console.log() 함수를 여러 군데 사용해 디버깅하기는 어렵기 때문이다. 또한 프론트엔드와 백엔드에서 메모리 누수를 탐지하는 법을 배운다. 크롬에서 자바스크립트 디버깅을 해 봤다면 10장에서 도움을 많이 받을 것이다.

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.

저자/역자 소개

지은이의 말

Node.js는 확장성 있는 앱을 만들 때 시작하기 매우 좋은 도구다.
비동기 I/O 방식이기 때문에 서버(예를 들면, 아파치)를 블록킹하는 것보다 더 많은 요청들을 동시에 수행할 수 있고, 이는 비동기 이벤트로 처리할 수 있다. 함수 호출은 블록을 발생시키지만, Node.js는 콜백으로 응답한다. Node.js를 토대로 확장성 있는 애플리케이션을 만들도록 해 주는 라이브러리들을 사용할 수 있다.
레디스(Redis)는 확장성 있는 애플리케이션을 만드는 데 필요한 주요 빌딩블록이다. 레디스가 Node.js에만 특화된 것은 아니지만 Node.js를 매우 잘 지원한다. 레디스는 앱을 실행하는 웹 서버들 간의 공유 메모리 역할을 한다. 레디스는 각 프레임워크에 대한 바인딩이 있는데, 이는 본문에서 다룰 것이다. 바인딩은 각 프레임워크의 데이터 저장소를 만들 때마다 환경 및 시스템 관리 측면에서 오버헤드가 발생하는 문제를 해결해준다.
이 책에서는 레디스와 Node.js를 하나로 통합해서 이해하기 쉽고 직관적인 프로젝트 가이드를 제시해준다. 그리고 아이디어에서부터 배포하는 과정까지 애플리케이션을 처음부터 만드는 방법을 알려 준다. 1장부터 7장까지는 개발 도중에 생기는 구체적인 문제 사례나 이슈를 다룬다. 8장에선 개발을 최적화하는 방법을 배운다. 9장과 10장에서는 구축한 사이트를 아마존 웹 서비스에 배포하는 과정을 다룬다. 또한 애플리케이션에서 발생하는 문제를 해결하고 디버깅하는 방법도 다룬다. 본문에선 한 가지 프로젝트만 다루지만, 각 장은 특정 기능이나 특정 주제별로 분리돼 있으므로 원하는 장만 읽어도 상관 없다. 그렇지만 1장부터 읽는 것을 추천한다. 처음부터 하나의 사이트를 만들기 때문에, 각 장 간에 연결성이 있기 때문이다. 코드 샘플 대부분은 다른 상황에서도 활용 가능하다.
개인적으로 자바스크립트로 백엔드를 개발하는 것은 새롭게 느껴진다. 처음 Node.js에 대해 듣고, 백엔드에 자바스크립트를 쓴다고 했을 때 처음 내 반응은 “뭣 때문에 그렇게 해야 되지?”였다.
나는 서버쪽 언어의 대부분(PHP와 루비, 파이썬, C# 닷넷)을 썼다. 웹 서버도 여러 가지(아파치, IIS, 내장 서버, Unicorn, Gunicorn 등)를 써봤다. 모든 최신 웹 애플리케이션이 자바스크립트를 사용한다는 이유 때문에 문법이 다른 언어에 대한 경계심을 갖게 된다(예를 들어 루비와 자바스크립트를 비교해보라). Node.js는 자바스크립트 모드에서 벗어나지 않고, 기존과 같은 설계 패턴과 같은 툴을 쓰게 해준다. 설정할 것이 많지 않다는 사실에 기쁠 것이다. Node.js 앱을 만들고 실행하면 된다. 이런 특징들로 인해 Node.js가 최고의 웹 애플리케이션 및 프레임워크 서버이고 내가 좋아하는 이유이기도 하다.

지은이 소개

조슈아 조하난(Joshua Johanan)

현재 인디아나 주 사우스벤드에 거주 중인 웹 개발자이다. 5년의 웹 개발 경력이 있으며, PHP, 파이썬, 자바스크립트, C# 등으로 여러 사이트를 개발했고, 가장 선호하는 언어는 파이썬과 자바스크립트다. 이 언어들을 쓰면서, 젠드(Zend) 프레임워크, 장고(Django), 닷넷 MVC 등의 MVC 프레임워크를 사용하게 됐다.
이 책에서도 알 수 있듯이, 조슈아는 자바스크립트를 활용해, 백엔드에는 Node.js를 사용하고, 프론트엔드에는 백본(Backbone), 리액트(React), 제이쿼리(jQuery), 순수 자바스크립트 등 여러 가지 라이브러리를 사용했다. 현재 건강 보험 기관에서 C#으로 웹 사이트를 개발하는 일을 한다. 화려한 최신 브라우저 기술을 쓸 수는 없지만, 유지보수와 확장성에 관한 개발 능력은 요구된다.
이 책은 첫 번째 저서이지만 http://ejosh.co/de에서 조하난이 정기적으로 올리는 글을 볼 수 있다.

옮긴이의 말

성공적인 웹 서비스의 개발을 위해서는 서비스의 확장성이 매우 중요합니다. 서비스를 찾는 사람이 많아질수록 서버의 부담이 증가하게 되고 결국 웹 서버나 데이터베이스의 부담이 증가해 서비스 제공에 차질이 생기는 경우를 매우 많이 봐왔습니다. 최근 Node.js와 레디스에 대한 관심이 매우 커지고 있는 현재 상황은 이 기술들이 이와 같은 확장성 문제를 매우 훌륭하게 해결한 솔루션이라는 사실을 방증합니다. Node.js는 비동기적 이벤트 처리 방식을 사용해 웹 서버의 확장성을 획기적으로 개선했으며 개발자에게 친숙한 자바스크립트를 언어로 사용해 그 인기는 굳이 설명하지 않아도 될 것입니다. 또한 레디스 역시 데이터베이스 솔루션의 인지도를 반영해 순위를 발표하는 DB-Engines.com의 전체 데이터베이스 순위에서 10위(2015년 5월 기준)를 차지하고 있는 것을 보면 현재 레디스가 얼마나 주목을 받는 솔루션인지 알 수 있습니다. 따라서 이런 시점에서 이 책의 출판은 매우 반가운 일이 아닐 수 없습니다.
이 책은 웹 애플리케이션을 밑바닥에서부터 하나 하나 개발해 가는 과정을 통해 독자가 자연스럽게 확장성 있는 웹 애플리케이션의 개발을 위해 필요한 기술을 습득할 수 있도록 인도합니다. 많은 예제와 풍부한 설명을 통해 누구나 쉽게 내용을 이해하며 따라갈 수 있으며 웹 개발에 필요한 다양한 Node.js의 모듈과 관련 툴에 대해서도 배울 수 있습니다. 웹 애플리케이션 개발에 관심이 있는 사람이라면 이 책을 읽으며 개발 과정에 부딪힐 수 있는 여러 가지 이슈들과 이를 해결해나가는 여러 방법들을 접할 수 있는 소중한 경험이 될 것입니다.

옮긴이 소개

김기성

서울대학교 응용화학부를 졸업하고, 서울대학교 컴퓨터공학부 대학원에서 박사학위를 받았다. 2007년부터 2009년까지 티맥스소프트에서 근무하며, 티베로 관계형 데이터베이스 개발에 참여했다. 박사 과정 동안에는 대용량 그래프 데이터를 처리하는 기법을 연구했으며, 현재는 비트나인의 연구소장을 맡고 있으며 새로운 그래프 데이터베이스 엔진 개발에 몰두하고 있다. 에이콘출판사에서 출간한 『HBase 클러스터 구축과 관리』(2012)와 『정보 스토리지와 관리 Information Storage and Management』(2014)를 번역했다.

목차

목차
  • 1장 익스프레스를 사용한 백엔드 개발
    • Node.js와 노드 패키지 관리자
    • 노드에서 익스프레스 사용하기
    • 익스프레스에서 미들웨어 사용하기
      • 미들웨어 작성
    • 믹스에 템플릿 추가
      • 레이아웃
    • 익스프레스에서 세션 사용하기
      • 익스프레스에서 쿠키 사용하기
      • 세션 추가하기
      • 레디스를 세션 스토어로 사용하기
    • 폼 처리
      • CSRF
    • 매우 간단한 인증
    • 앱의 설정 파일 설정
      • 라우트 매핑
      • 설정을 사용하도록 앱 수정하기
    • 애플리케이션을 확장하는 방법
    • 요약

  • 2장 Socket.IO를 사용한 확장
    • 노드 패키지 버전
    • 간단한 Socket.IO 앱 만들기
      • 패키지 설치
      • 클라이언트 만들기
      • 파이썬을 사용해 사이트 서버 구축하기
      • 핑퐁
      • 상호 작용 만들기
      • 브라우저 부분 추가
      • 액크놀리지먼트
    • 메시지 브로드캐스팅
    • 디스컨넥트 이벤트 사용하기
    • 네임스페이스 만들기
      • 네임스페이스 클라이언트 만들기
    • 룸 추가
    • 네임스페이스 또는 룸 사용하기
      • 네임스페이스
        • 네임스페이스 찾기
      • 룸은 언제 사용하는가
      • 룸 찾기
    • 네임스페이스와 룸을 함께 사용하기
    • Socket.IO와 익스프레스를 함께 사용하기
      • 설정에 Socket.IO 추가하기
      • 당신은 누구인가
        • Socket.IO의 인증
    • 애플리케이션 이벤트 추가
    • Socket.IO의 저장소로 레디스 사용하기
    • Socket.IO 내부 동작
      • WebSocket
    • 2장에서 중요한 아이디어
    • 요약

  • 3장 사용자 인증하기
    • 노드 패키지 버전
    • 인증시스템 만드는 방법
    • 페이스북 애플리케이션 등록하는 방법
    • 페이스북을 인증하기 위해 Passport 모듈을 쓰는 방법
    • 구글로 인증하는 방법
    • 애플리케이션에 구글 인증 추가하기
    • 더 많은 OAuth 프로바이더 추가
    • 안전한 로컬 인증 추가
      • 등록 추가
      • 데이터베이스 추가하기
    • 패스워드 스토어 이론
    • OAuth 프로세스
    • 요약

  • 4장 RabbitMQ로 메시지 큐잉하는 법
    • 노드 패키지 버전
    • RabbitMQ 설치
      • Mac OS X에 인스톨하는 방법
        • RabbitMQ 관리 플러그인
      • 리눅스에 인스톨하는 방법
      • 윈도우에 인스톨하는 방법
    • 처음으로 만든 메시지 큐
      • 매니지먼트 인터페이스
      • 메시지 보내기
      • 메시지를 큐에 저장하기
      • 다른 워커 추가
    • 응답 메시지 보내기
      • StartServer 만들기
      • 워커 만들기
      • 실시간으로 카드 요금 청구 청구하기
    • PacktChat에 메시지 큐 추가
      • 토픽 익스체인지
      • 워커 만들기
    • RabbitMQ에서 큐에 메시지 저장
    • 요약

  • 5장 애플리케이션 데이터 저장소로 레디스 사용하기
    • 노드 패키지 버전
    • 레디스 설치하는 방법
      • Mac OS X에 설치하는 방법
      • 리눅스에 설치하는 방법
      • 윈도우에 설치하는 방법
    • 레디스에서 데이터 구조 사용하기
      • 간단한 레디스 애플리케이션 만드는 방법
    • 레디스 스키마
      • 해시 사용하기
      • 레디스에서의 키
    • 레디스의 지속성
      • 레디스 키 삭제하기
    • 메시지 큐로 레디스 사용하기
    • 레디스를 PacktChat에 추가하기
      • 레디스 구조 정하기
      • 레디스 함수 만들기
    • 레디스는 애플리케이션 상태를 위한 용도로 쓰인다
    • 요약

  • 6장 바우어를 사용한 프론트엔트 의존성 관리
    • 노드 패키지 버전
    • 바우어 설치와 사용
    • 리액트 소개
    • 백본 소개
      • 백본 모델 사용
      • 백본 컬렉션 사용
    • 요약

  • 7장 DOM 이벤트를 위한 백본과 리액트 사용
    • 바우어 패키지 버전들
    • Socket.IO 마무리
    • 리액트 컴포넌트 만들기
      • 리액트 요약
    • 백본 모델
      • 모델과 Socket.IO 동기화
      • 모델 생성
      • 컬렉션 생성
    • 백본 라우터
    • 컬렉션과 뷰 합치기
    • CSS와 레이아웃 수정
    • 새 워커 등록
    • 애플리케이션 사용 시도
    • 요약

  • 8장 애플리케이션 개발을 위한 자바스크립트 사용 사례
    • 노드 패키지 버전
    • 테스트 환경 설정
      • 코드 커버리지에 이스탄불 응용
    • 다양한 환경 설정
      • 투웰브 팩터 앱
      • config 파일 수정하기
      • 환경 파일 생성
      • 추가 환경 설정
    • 그런트 소개
      • 기본 그런트 파일 빌드
      • 테스트 자동화
      • 파일 전처리
      • 그런트를 사용한 폴더 비우기
      • 소스파일 JSHinting
      • 코드 통합
      • 코드 축소
      • 그런트 요약
    • 정적 파일과 CDN
      • S3 버킷 생성
      • 파이썬과 가상환경 설치
    • 새로운 툴 스크립트 생성
    • 요약

  • 9장 배치와 확장성
    • EC2 서버 생성
      • AWS EC2 요약
    • 앤서블은 무엇인가
      • 앤서블 설치
      • 앤서블 롤 사용
        • RabbitMQ 설치
        • 애플리케이션 설치
        • 코드 배포
        • 다중 애플리케이션 서버 로드 밸런싱
        • 롤 자동화
      • 앤서블 요약
      • 새로운 환경 생성
    • 확장성
      • 확장성의 여러 가지 타입
        • 수평 확장
        • 수직 확장
    • 요약

  • 10장 디버깅과 문제 해결
    • 노드 패키지
    • 크롬 개발자 도구 사용
      • 요소
      • 네트워크
      • 소스
      • 타임라인
      • 프로파일
      • 리소스
      • 감사
      • 콘솔
    • 요청 분석
    • 디버깅
      • 프론트엔드 디버깅
      • 백엔드 디버깅
      • 디버깅 요약
    • 애플리케이션 CPU 프로파일링
    • 힙 스냅샷 생성
      • 프론트엔드 메모리 누수
      • 메모리 누수 요약
    • 요약

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

2021-06-14

p.28. 아래서 9행

시스템에서 출동이 발생하는 것 → 시스템에서 충돌이 발생하는 것

2015-09-30

'

p57. 10행 / p58. 9행 / p65. 5행 / p103. 22행 / p107. 3행, 12행 / p110. 마지막행

Var → var

p83. "//script 태그 아래" 행 바로 위

var $sent = $('#sent'); 추가

p84 .7행

우리 리스트나 → 우리 리스트가

p84. 아래에서 5행

모든 사람에게 모낸다. → 모든 사람에게 보낸다.

p102. 아래에서 5행

npm.install → npm install

p104. 아래에서 8행

</scri pt> → </script>

p143. 2행

index.js → utilities.js

p183. 3행

않아 4장 → 않아 이전 장

p222. 12행

SimpleHTTPSever → SimpleHTTPServer