2. Node.js란 무엇인가?
1. 노드는 서버사이드 자바스크립트다.
Node.js(이하 “노드”)는 자바스크립트를 통해 네트워크 어플리케이션을 작성할 수 있는 플랫폼이다.
간단히 말하면 서버사이드 자바 스크립트라고 할 수 있다.
서버사이드 자바스크립트는 과거에도 많은 시도가 있었고, 실제로 사용되는 기술 도 있다.
노드는 그동안 발전해 온 서버사이드 자바스크립트의 완성형에 가깝다고 볼 수 있다.
지금까지의 서버 사이드 자바스크립트는 그 기반이 자바스크립트임에도 불구하고,
자바스크립트 다운 느낌이 없었다.
반면 노드는 웹 브라우저에서 사용하던 자바스크립트를 서버사이드에서도
그대로 사용할 수 있게 만들었다. 이는 웹 브라우저에서 얻은 자바스크립트의 경험과 지식을
노드에서도 그대로 사용할 수 있음을 뜻한다.
즉, 자바스크립트를 사용할 줄 안다면 이미 노드 프로그래밍을 할 준비가 되었고 원하는
프로그래밍을 작성할 수 있다는 것이다.
반대로..자바 스크립트를 모른다면 그럴 수 없다는 의미가 되지만…
(“시그에서는 자바스크립트와 노드를 병행해서 하는 것이 어떨까 합니다!”)
3. Node.js란 무엇인가?
2. Common JS 알아보기
노드를 구체적으로 살펴보기 전에 CommonJS를 알아야 한다. CommonJS는 케빈 댕구어가 2009년 1월에 시작한
프로젝트로 SErverJS라는 이름으로 시작했다고 한다.
CommonJS공식 홈페이지에 가보면 “자바스크립트는 더 이상 브라우저만을 위한 기술이 아니다”라는 문구가 있는데
이처럼 자바스크립트를 웹브라우저 밖에서 사용하기 위한 표준이 바로 CommonJS라고 할 수 있다.
보통 웹브라우저는 HTML파일에서 <script>라는 태그로 자바스크립트를 호출한다.
이렇게 로딩된 자바스크립트는 서로 참조하거나 호출할 수 있다.
하지만 웹 브라우저가 아닌 환경은 HTML파일이 존재하지 않는다. 그러므로 자바스크립트를 모듈화하기 위한 방법이
필요하고, 여러 파일로 나눠져있는 JS코드들이 서로 호출하고 참조하는 방법도 필요하게 된다.
CommonJS는 이런 방법을 논의하고 표준하는 프로젝트고, W3C같은 공식적인 표준화 조직은 아니지만,
여러 개발자들 사이에서 표준처럼 이용되고 있다.
우리에게 중요한 것은 “노드”가 바로 이 표준을 따르고 있다는 것 이다.
그렇다고 CommonJS의 모든 표준을 알 필요는 없다. 단지 노드가 CommonJS을 따르고 있다는 것만 기억하면 된다.
4. Node.js란 무엇인가?
3. 노드의 역사와 발전
사실 노드는 라이언 달이라는 사람이 개인 프로젝트로 시작하면서 만들어졌다.
라이언은 구글 크롬 웹브라우저의 JS엔진인 V8을 이용해 이벤트 기반의 TCP라이브러리와 HTTP서버를
만드는 아이디어를 라이브저널에 올렸다.
그리고 2월 15일 깃허브에 저장소를 하나 만들고 노드를 만들기 시작한다. 그리고 2010년 노드가 본격적으로
인기를 얻기 시작했고, 클라우드 서비스를 제공하는 회사인 조이엔트가 자사의 클라우드 플랫폼 중 하나로
노드를 선택하면서 실제 공식 스폰서로 나선다.
그 후 노드는 제이쿼리와 레일즈를 제치고 2위를 차지했고, 현재 npm의 중앙저장소 등록 기준으로 5천여개의
확장 모듈이 등록되어있다.
(“물론 npm에서 찾는 것도 좋지만, http://startic.kr/njs 이곳을 추천합니다!!”)
그리고 노드에서 중요한 것을 하나 알아야 하는데, 0.3 버전 이후 부터 끝 자리가 홀수인 버전은 개발자 버전이고
짝수인 경우가 안정성이 확인 된 버전이다. 그리고 0.4.x라는 마이너 버전이 나오면, 그 다음은 0.6 안정버전이 나온다는
사실도 기억해야 한다.
5. Node.js란 무엇인가?
4. 노드의 탄생 배경
역사는 항상 그 시작이 중요하다. 도대체 라이언이라는 사람은 왜 노드를 만들었던 것일까?
참고로 이 내용은 라이언이 직접 밝힌 내용에 기반을 두고 작성한다.
라이언은 다른 프로그래밍 언어나 플랫폼에 잘못된 점이 있다는 생각을 했다. 구체적으로 말하면 I/O를 다르게
사용해야 한다고 생각했다.
여기서 I/O는 키보드로 입력받는 내용, 파일, 읽고 쓰기, 데이터베이나 네트워크의 사용 등 입출력과 관련된
모든 것을 의미 한다. 그 간단한 예는 아래 코드로 살펴보자.
Var result = db.query(‘select * from table;);
데이터베이스에 쿼리로 테이블을 조회하는 코드를 간략히 나타냈다. I/O를 사용할 때 일반적으로 이처럼
작성한다. 즉 데이터베이스에 쿼리를 수행한 결과를 변수에 할당 하고 그 다음 줄 부터 변수를 사용한다.
이 코드의 수행방식을 살펴보면 I/O를 요청하고 결과를 받을 때 까지 스레드는 아무 일도 안하는 상태로 대기한다.
그리고 결과가 돌아오면 이어서 다음 코드를 처리한다.
즉, IO를 동기방식으로 수행하기 때문에 수행이 끝날 때 까지 스레드는 블록킹이 되면서 다른 어떠한 것을 수행할 수 없다
데이터베이스, 파일시스템 등의
외부시스템
데이터베이스 조회 파일 읽기
싱글 스레드의 처리영역
코드 실행 코드 실행 코드 실행
6. Node.js란 무엇인가?
4. 노드의 탄생 배경
위 그림에서 싱글 스레드 처리영역이라고 표시된 부분이 스레드가 직접 계산하고 처리하는 영역이다.
데이터베이스나 파일 시스템 같은 I/O에 요청을 보내면 I/O가 결과를 돌려줄 때까지 스레드는 더 이상
진행하지 않고 멈춘다.
그래서 I/O를 요청한 순서대로 결과를 돌려받는 동기 구조가 되는 것 이다.
멀티스레드에서는 여러 개의 스레드가 동시에 동작할 수 있는데 메모리 등 시스템 자원을 많이 차지하기
때문에 무한대로 생성할 수는 없다. 그리고 멀티스레드의 경우 여러 스레드가 동시에 같은 자원을 요청했을 때
데드락에 빠질 수 있으므로 이런 부분을 신경 써서 프로그래밍 해야한다.
또한 외부 시스템에 요청을 보내는 I/O는 외부 시스템의 상황에 따라 응답시간이 달라진다.
네트워크도 마찬가지다. 서버의 상황에 따라 0.1초만에 응답이 올 수도 있지만, 1초, 혹은 아예 응답이 오지
않는 경우도 발생한다.
그래서 라이언은 싱글 스레드 기반의 이벤트 루프가 효율적인 방법이라고 생각했다.
이벤트 루프를 이용해 I/O를 비동기 방식으로 사용하면 싱글 스레드만으로 뛰어난 성능을 가질 수 있다는 생각이였다.
이벤트 루프라는 것 역시 우리가 자주 봐왔던 방식이고 이를 한방에 이해하는 법은 바로 아래 코드에 있다.
db.query(‘select * from table’){
};
바로, 콜백 패턴이다. 쿼리를 조회하면서 동시에 콜백 함수를 전달한다. 그리고 스레드는 결과를 기다리지 않고
이어진 코드를 처리하다가 조회가 끝이 나면 콜백함수를 처리하므로써 I/O에 요청을 보낸 후에도 다른 작업을
계속 수행할 수 있게 되는 것이다.
7. Node.js란 무엇인가?
4. 노드의 탄생 배경
이전 페이지를 읽고나면 이해도 안되고, 문득 이런 생각이 들었다.
“그럼 왜 모두가 Event Loop를 사용하지 않는가?”
이 문제에 대해서 Ryan Dahl은 문화적인(Cultural) 이유와 구조적(infrastructural)인 이유 2가지가 있다고 한다.
문화적인 이유는 우리가 프로그래밍을 배울때 인풋을 요청하면 요청한 인풋을 받을때까지 아무것도 하지 말라고
배웠기 때문이라고 말한다. 그 말인 즉, 아래와 같은 코드로 우리는 프로그래밍을 해왔다는 것 이다.
puts("Enter your name: ");
var name = gets();
puts("Name: " + name);
위 코드는 인풋을 받아 출력하는 익숙한 코드인데 인풋이 들어오기 전까지는 아무것도 행하지 않는다.
반면, 이벤트 루프방식인 아래와 같은 코드는 복잡하다는 이유로 학교에서 거부되었기 때문에
우리는 이벤트 루프방식에 약하고 생각하지 않는다는 것이 라이언의 설명이다.
puts("Enter your name: ");
gets(function(name) {
puts("Name: " + name);
});
8. Node.js란 무엇인가?
5. 정리
1. 노드는 라이언 달이 만들었고 2009년 11월 처음 발표되었다.
2. 노드는 오픈소스로 개발되며 많은 개발자가 노드에서 사용할 수 있는 확장 모듈을 만든다.
3. 노드는 CommonJS의 표준을 따른다.
4. 노드는 싱글 스레드에 싱글 스택을 사용한다.
5. 이벤트 루프 기반으로 모든 I/O를 비동기로 사용한다.
6. 모든 I/O는 넌 블록킹 I/O이다.
7. 자바스크립트를 사용하고 그 엔진으로 구글 크롬 웹브라우저의 V*엔진을 사용한다.
6. 토론
• 토론 부분은 “노드에 대한 궁금점”을 주제로 각 자 자신의 생각을 이야기하는 시간으로 약 15분 정도
진행할 계획입니다.
• 토론에서 풀리지 않는 문제라던지, 궁금점은 국내 Node.js 첫 저자이신 outsider(변정훈)님께서
잘 안되는 부분의 경우 도와주신다고 하셨으니 꼭 매 주마다 준비를 해주셨으면 합니다!!
• Week 2 토론 주제
“Node.js로 16주 뒤 우리는 어떤 어플리케이션을 만들 수 있을까?”