2018년 3월 25일 일요일

Node.js - 스터디 1주차

https://opentutorials.org/course/2136/
생활코딩 강의를 이용해 진행하는 스터디 1주차.

이고잉님 짱..


3/25(일) :: 1강 '서버 측 자바스크립트와 nodejs 소개' 부터 4강 '모듈과 NPM'까지.

Node.js?

"Node.js = V8 + event-driven + non-blocking IO"

구글은 크롬 브라우저를 발표하면서 자바 스크립트 V8 엔진을 오픈 소스 형태로 함께 공개하였다. 구글이 공개한 V8 엔진의 성능은 매우 뛰어났는데, V8 엔진에서 가능성을 엿본 라이언 달은 이를 이용해 node.js라는 프레임워크를 개발하게 된다.

Node.js는 웹 브라우저를 벗어난 일반 os 환경에서도 자바스크립트를 사용할 수 있는 런타임 환경을 제공한다. 그리고 V8엔진과 더불어 event-driven, non-blocking 패러다임을 채택하여 자바스크립트의 약점으로 지적받는 성능 문제를 극복한다. 무엇보다 node.js가 갖는 가장 큰 장점은 하나의 언어를 이용해 완결된 웹-애플리케이션을 만들 수 있다는 것!




Module


require 키워드를 이용해 필요한 모듈을 가져올 수 있고, 모듈에서 제공하는 기능을 사용할 수 있다. 모듈엔 JavaScript가 제공하는 모듈, node.js에서 제공하는 모듈, 그리고 다른 개발자가 만들어 배포한 모듈로 구분된다. JavaScript, Node.js가 제공하는 모듈은 node.js 환경에서 기본적으로 사용할 수 있지만 다른 개발자가 만들어 배포한 모듈은 NPM(Node Package Manager)라 하는 패키지 매니저를 통해 가져와야 사용할 수 있다. NPM은 모듈에 대한 설치, 삭제, 업그레이드, 의존성 관리 기능을 지원한다.

ex) npm init // initial package.json을 만드는 과정. npm이 사실상 표준이기 때문에 package.json으로 node.js 프로젝트의 정보를 관리해 주는 것이 좋다.
npm install underscore // underscore 모듈을 설치.
npm install underscore --save // package.json의 'dependencies'에 underscore 모듈이 추가됨.


3/27(화) :: 5강 '콜백(callback) 함수' 부터 9강 'Express-간단한 웹애플리케이션 만들기'까지.


콜백


"콜백은 Caller가 Callee를 호출하는 것이 아니라 Callee가 Caller를 호출하는 것을 말한다."

콜백을 짚고 넘어가기 전에 자바스크립트의 타입 체계를 알 필요가 있는 것 같다. 자바스크립트의 기본적인 데이터 타입 체계는 다음과 같다.

기본 자료형 (Primitive)

1. Boolean - true / false
2. Null - 딱 한가지 값, null을 가질 수 있다. 의도적인 할당이라 보는 것이 맞을듯. typeof 값이 'object'인 것은 함정.
3. Undefined - 값을 할당하지 않은 변수
4. Number - 64비트 실수. 정수 표기 따로 없음. 기타 NaN, 무한대 표현이 있다.
5. String - 문자열, 변경 불가능(immutable)임.
6. Symbol (ECMAScript 6) - 일단 스킵..




객체 (참조 타입)

- 객체 - 식별자로 참조할 수 있는 메모리에 있는 값.
1. Object - 키와 값의 매핑.
2. Array - 일련의 값들을 표현하기 위한 오브젝트
3. Function - 일반 오브젝트에서 호출 가능한 특성을 추가한 오브젝트.
4. Dates, 기타 잡 컬렉션 - 이것도 스킵..

특징은 함수를 걍 객체처럼 다룰 수 있다는 것이다. 함수를 함수의 파라미터로 전달하거나 반환받을 수 있고, 변수에 저장할 수도 있다. 여기에서 오는 편리함이 상당한데 그래서인지  자바스크립트에선 함수의 파라미터로 함수를 지정한다든가 하는 콜백 형태를 많이 볼 수 있다.


동기 vs 비동기 (Synchronous vs Asynchronous)


동기 : 순차 처리 방식. 동기 방식으로 동작하는 API를 호출했다면 작업이 끝날 때까지 기다려야 한다.
비동기 : 일종의 위임 모델인데 일을 던져놓고, 일이 끝나면 통지를 받는 방식.

기본적으로 node.js 시스템은 비동기 방식으로 동작한다.
* 처리 결과에 대한 통지는 어떻게 받는가? 앞서 배운 콜백 형태로 결과를 통지 받는다.
node.js가 제공하는 기본적인 API는 파라미터로 콜백을 전달받는 형태의 비동기 방식으로 정의되어 있는 것을 볼 수 있다.

비동기 버전의 파일 읽기.
fs.readFile('sample.txt', { encoding: 'utf8' }, (err, data) => { console.log(data); });

동기 버전의 파일 읽기.
var data = fs.readFileSync('text.txt', { encoding: 'utf8' });
// sample.txt를 읽는데 10분이 걸린다고 하면 10분간 blocking 된다. 다중 사용자의 요청을 처리하는 웹서버에 이런 로직이 넣으면.. 음 쫓겨난다.


Express (expressjs.com/ko/)

"Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크"

설치 (expressjs.com/ko/starter/installing.html)

ㄴ npm init // 프로젝트 설정
ㄴ npm install express --save // 프로젝트에 express 모듈 종속성 추가.


간단한 웹애플리케이션 만들기

앱 루트의 GET 메소드에 대한 라우팅을 다음과 같이 지정할 수 있다.
라우팅은 애플리케이션의 엔드 포인트(URI)가 클라이언트 요청에 응답하는 방식을 나타낸다.



3/28(수) :: 10강 '연결성' 부터 11강 'Express-정적파일을 서비스하는 법' 까지.


정적 파일을 서비스하는 법

Express가 제공하는 static 미들웨어를 사용하면 된다. static 미들웨어는 Express 기반 애플리케이션의 정적 자산을 제공하는 역할을 한다.

express.static(root, [options])
root; 정적 자산을 제공할 루트 디렉토리를 지정한다.
options; express.static 미들웨어가 제공하는 옵션을 지정할 수 있다. (etag, extentions 등)

하나의 앱은 2개 이상의 정적 디렉토리를 가질 수 있는데 그냥 디렉토리 목록을 순차적으로 선언해주면 된다.
app.use(express.static('public'));
app.use(express.static('uploads'));

미들웨어에 대해서 좀 더 알아보면. 미들웨어는 요청-응답 과정에서 공통적으로 수행될 수 잇는 로직을 수행하기 위해 필요한 개념으로 보면 될 것 같다. Java의 어쩌구저쩌구 Filter와 비슷한 개념인데. 동일하게 Chaining 형태로 구성되기 때문에 선언한 순서대로 동작한다. 따라서 미들웨어를 'use'하는 순서가 중요할 수 있다.

Express에서는 logger, json, urlencoded, bodyParser, cookieParser등 기본적인 웹 애플리케이션을 만들 때 필요한 대부분의 기능을 제공한다. 물론 사용자가 미들웨어를 작성할 수 있다. 주의할 부분은 미들웨어의 끝엔 next()를 반드시 호출해주어야 한다는 점이다. next()를 호출해서 그 다음 실행될 미들웨어 함수에 제어권을 전달해야 하기 때문인데, 그렇게 하지 않으면 사용자의 요청은 정지된 채로 방치(hang)된다.

아래는 요청 시간을 기억하게 해주는 미들웨어 함수 예제이다.
var requestTime = function (req, res, next) {
    req.requestTime = Date.now();
    next(); // next naming은 관례.
};

app.use(requestTime);

app.get('/', function (req, res) {
    // req.requestTime 프로퍼티를 사용할 수 있다.
});




댓글 없음:

댓글 쓰기