SlideShare a Scribd company logo
1 of 8
Week 1 - node.js의 역사와 발전
Node.js란 무엇인가?

1. 노드는 서버사이드 자바스크립트다.

 Node.js(이하 “노드”)는 자바스크립트를 통해 네트워크 어플리케이션을 작성할 수 있는 플랫폼이다.
 간단히 말하면 서버사이드 자바 스크립트라고 할 수 있다.

 서버사이드 자바스크립트는 과거에도 많은 시도가 있었고, 실제로 사용되는 기술 도 있다.
 노드는 그동안 발전해 온 서버사이드 자바스크립트의 완성형에 가깝다고 볼 수 있다.

 지금까지의 서버 사이드 자바스크립트는 그 기반이 자바스크립트임에도 불구하고,
 자바스크립트 다운 느낌이 없었다.

 반면 노드는 웹 브라우저에서 사용하던 자바스크립트를 서버사이드에서도
 그대로 사용할 수 있게 만들었다. 이는 웹 브라우저에서 얻은 자바스크립트의 경험과 지식을
 노드에서도 그대로 사용할 수 있음을 뜻한다.

 즉, 자바스크립트를 사용할 줄 안다면 이미 노드 프로그래밍을 할 준비가 되었고 원하는
 프로그래밍을 작성할 수 있다는 것이다.

 반대로..자바 스크립트를 모른다면 그럴 수 없다는 의미가 되지만…
 (“시그에서는 자바스크립트와 노드를 병행해서 하는 것이 어떨까 합니다!”)
Node.js란 무엇인가?

2. Common JS 알아보기

 노드를 구체적으로 살펴보기 전에 CommonJS를 알아야 한다. CommonJS는 케빈 댕구어가 2009년 1월에 시작한
 프로젝트로 SErverJS라는 이름으로 시작했다고 한다.
 CommonJS공식 홈페이지에 가보면 “자바스크립트는 더 이상 브라우저만을 위한 기술이 아니다”라는 문구가 있는데
 이처럼 자바스크립트를 웹브라우저 밖에서 사용하기 위한 표준이 바로 CommonJS라고 할 수 있다.

 보통 웹브라우저는 HTML파일에서 <script>라는 태그로 자바스크립트를 호출한다.
 이렇게 로딩된 자바스크립트는 서로 참조하거나 호출할 수 있다.

 하지만 웹 브라우저가 아닌 환경은 HTML파일이 존재하지 않는다. 그러므로 자바스크립트를 모듈화하기 위한 방법이
 필요하고, 여러 파일로 나눠져있는 JS코드들이 서로 호출하고 참조하는 방법도 필요하게 된다.

 CommonJS는 이런 방법을 논의하고 표준하는 프로젝트고, W3C같은 공식적인 표준화 조직은 아니지만,
 여러 개발자들 사이에서 표준처럼 이용되고 있다.

 우리에게 중요한 것은 “노드”가 바로 이 표준을 따르고 있다는 것 이다.
 그렇다고 CommonJS의 모든 표준을 알 필요는 없다. 단지 노드가 CommonJS을 따르고 있다는 것만 기억하면 된다.
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 안정버전이 나온다는
 사실도 기억해야 한다.
Node.js란 무엇인가?

4. 노드의 탄생 배경

 역사는 항상 그 시작이 중요하다. 도대체 라이언이라는 사람은 왜 노드를 만들었던 것일까?
 참고로 이 내용은 라이언이 직접 밝힌 내용에 기반을 두고 작성한다.

 라이언은 다른 프로그래밍 언어나 플랫폼에 잘못된 점이 있다는 생각을 했다. 구체적으로 말하면 I/O를 다르게
 사용해야 한다고 생각했다.
 여기서 I/O는 키보드로 입력받는 내용, 파일, 읽고 쓰기, 데이터베이나 네트워크의 사용 등 입출력과 관련된
 모든 것을 의미 한다. 그 간단한 예는 아래 코드로 살펴보자.

 Var result = db.query(‘select * from table;);

 데이터베이스에 쿼리로 테이블을 조회하는 코드를 간략히 나타냈다. I/O를 사용할 때 일반적으로 이처럼
 작성한다. 즉 데이터베이스에 쿼리를 수행한 결과를 변수에 할당 하고 그 다음 줄 부터 변수를 사용한다.

 이 코드의 수행방식을 살펴보면 I/O를 요청하고 결과를 받을 때 까지 스레드는 아무 일도 안하는 상태로 대기한다.
 그리고 결과가 돌아오면 이어서 다음 코드를 처리한다.

 즉, IO를 동기방식으로 수행하기 때문에 수행이 끝날 때 까지 스레드는 블록킹이 되면서 다른 어떠한 것을 수행할 수 없다

  데이터베이스, 파일시스템 등의
  외부시스템
                          데이터베이스 조회                      파일 읽기

  싱글 스레드의 처리영역

      코드 실행                                      코드 실행           코드 실행
Node.js란 무엇인가?

4. 노드의 탄생 배경

 위 그림에서 싱글 스레드 처리영역이라고 표시된 부분이 스레드가 직접 계산하고 처리하는 영역이다.
 데이터베이스나 파일 시스템 같은 I/O에 요청을 보내면 I/O가 결과를 돌려줄 때까지 스레드는 더 이상
 진행하지 않고 멈춘다.

 그래서 I/O를 요청한 순서대로 결과를 돌려받는 동기 구조가 되는 것 이다.
 멀티스레드에서는 여러 개의 스레드가 동시에 동작할 수 있는데 메모리 등 시스템 자원을 많이 차지하기
 때문에 무한대로 생성할 수는 없다. 그리고 멀티스레드의 경우 여러 스레드가 동시에 같은 자원을 요청했을 때
 데드락에 빠질 수 있으므로 이런 부분을 신경 써서 프로그래밍 해야한다.

 또한 외부 시스템에 요청을 보내는 I/O는 외부 시스템의 상황에 따라 응답시간이 달라진다.
 네트워크도 마찬가지다. 서버의 상황에 따라 0.1초만에 응답이 올 수도 있지만, 1초, 혹은 아예 응답이 오지
 않는 경우도 발생한다.

 그래서 라이언은 싱글 스레드 기반의 이벤트 루프가 효율적인 방법이라고 생각했다.
 이벤트 루프를 이용해 I/O를 비동기 방식으로 사용하면 싱글 스레드만으로 뛰어난 성능을 가질 수 있다는 생각이였다.

 이벤트 루프라는 것 역시 우리가 자주 봐왔던 방식이고 이를 한방에 이해하는 법은 바로 아래 코드에 있다.

 db.query(‘select * from table’){

 };

 바로, 콜백 패턴이다. 쿼리를 조회하면서 동시에 콜백 함수를 전달한다. 그리고 스레드는 결과를 기다리지 않고
 이어진 코드를 처리하다가 조회가 끝이 나면 콜백함수를 처리하므로써 I/O에 요청을 보낸 후에도 다른 작업을
 계속 수행할 수 있게 되는 것이다.
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);
 });
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주 뒤 우리는 어떤 어플리케이션을 만들 수 있을까?”

More Related Content

What's hot

스레드
스레드스레드
스레드
xxbdxx
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
OnGameServer
 
Mongo DB 활용가이드 Tip 35 ~ 41
Mongo DB 활용가이드 Tip 35 ~ 41Mongo DB 활용가이드 Tip 35 ~ 41
Mongo DB 활용가이드 Tip 35 ~ 41
cosmosyc
 
Node.js 리뷰
Node.js 리뷰Node.js 리뷰
Node.js 리뷰
Ray Park
 
04 자바 네트워크
04 자바 네트워크04 자바 네트워크
04 자바 네트워크
arahansa yong
 

What's hot (20)

Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
스레드
스레드스레드
스레드
 
7가지 동시성 모델-2장
7가지 동시성 모델-2장7가지 동시성 모델-2장
7가지 동시성 모델-2장
 
함수형사고 3장 양도하라
함수형사고 3장 양도하라함수형사고 3장 양도하라
함수형사고 3장 양도하라
 
Mongo db 2.x to 3.x
Mongo db 2.x to 3.xMongo db 2.x to 3.x
Mongo db 2.x to 3.x
 
웹 서버 실행 환경
웹 서버 실행 환경웹 서버 실행 환경
웹 서버 실행 환경
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
Node
NodeNode
Node
 
Rust
RustRust
Rust
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차
 
Mongo DB 활용가이드 Tip 35 ~ 41
Mongo DB 활용가이드 Tip 35 ~ 41Mongo DB 활용가이드 Tip 35 ~ 41
Mongo DB 활용가이드 Tip 35 ~ 41
 
Database
DatabaseDatabase
Database
 
Multi thread
Multi threadMulti thread
Multi thread
 
Node.js 리뷰
Node.js 리뷰Node.js 리뷰
Node.js 리뷰
 
Bacchus server overview
Bacchus server overviewBacchus server overview
Bacchus server overview
 
Network 초보자를 위한 Netty
Network 초보자를 위한 NettyNetwork 초보자를 위한 Netty
Network 초보자를 위한 Netty
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)
 
Mongodb cluster
Mongodb clusterMongodb cluster
Mongodb cluster
 
04 자바 네트워크
04 자바 네트워크04 자바 네트워크
04 자바 네트워크
 
Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기Node.js 자바스크립트로 서버사이드 개발하기
Node.js 자바스크립트로 서버사이드 개발하기
 

Similar to Node week1

Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
Daum DNA
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 

Similar to Node week1 (20)

Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용 Nodejs발표자료 - 팀 세미나용
Nodejs발표자료 - 팀 세미나용
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기
 
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Softcon_하재권_Only javascript의 하이브리드 앱서버 도전기
Softcon_하재권_Only javascript의 하이브리드 앱서버 도전기Softcon_하재권_Only javascript의 하이브리드 앱서버 도전기
Softcon_하재권_Only javascript의 하이브리드 앱서버 도전기
 
Nodejs 발표자료
Nodejs 발표자료Nodejs 발표자료
Nodejs 발표자료
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 

More from 은석 김은석 (6)

Hanoi2
Hanoi2Hanoi2
Hanoi2
 
Subversion
SubversionSubversion
Subversion
 
How to build a web server on Linux.
How to build a web server on Linux.How to build a web server on Linux.
How to build a web server on Linux.
 
Kinect Lab Pt.
Kinect Lab Pt.Kinect Lab Pt.
Kinect Lab Pt.
 
Kinect
KinectKinect
Kinect
 
Kinect
KinectKinect
Kinect
 

Node week1

  • 1. Week 1 - node.js의 역사와 발전
  • 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주 뒤 우리는 어떤 어플리케이션을 만들 수 있을까?”