6. (스팀 송금 서비스 제작을 목표로) Node.js란 무엇인가
스팀 송금 및 연동 서비스를 목표로 작성하는 글이며
이 글은 여러가지 검색을 통해 얻은 정보를 정리한 글입니다
틀린 정보가 있다면 댓글로 지적 부탁드립니다 감사합니다.
------------------------------------------------
1. 노드(Node.js)
: 자바스크립트를 이용해서 서버를 만들 수 있는 개발 도구입니다.
* 노드 제이에스라고 불러도 좋고 노드라고 불러도 좋습니다.
2.노드가 만들어진 이유
- 노드는 2009년 라이언 달이 만들었는데 그 당시 웹 서버에 파일을 업로드 할때 업로드가 완료되기 전까지 웹 서버에서 데이터를 조회한다거나 하는 등의 작업을 할 수 없었습니다. 이 문제를 해결하기 위해 새로운 방식의 서버 개발 도구를 만들기 시작했는데 그것이 노드입니다.
- 웹브라우저를 통해 내 PC에 있는 문서 파일 하나를 업로드하고 싶다면 먼저 웹 서버에 업로드를 요청해야 합니다.
- 이때 웹서버에는 파일 업로드 기능을 담당하는 핸들러(Handler)를 하나 만들어 둡니다. 그런데 파일 업로드를 완료하기 전에는 서버에 있는 다른 파일의 정보를 확인하거나 파일 업로드가 어떻게 진행디고 있는지 요청하는 것이 불가능해서
업로드가 완료될 때까지 대기해야 합니다. 지금은 이러한 문제를 해결할 방법이 있으나 당시에는 핸들러가 하나의 요청이 끝날때까지 다른 요청을 대기시켜 응답 시간이 길어지거나 서버에서 처리해야하는 요청의 수가 많아지면
CPU나 메모리 사용량도 크게 증가하는 문제가 많이 발생하였습니다.
3. 노드의 입출력 방식
- 이런 문제를 해결하기 위해 만든 게 노드입니다. 즉 하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(논블로킹 입출력, Non-Blocking IO)방식을 적용했습니다.
- 비동기 입출력 방식이 노드의 대표적인 특징입니다. 비동기 입출력 방식을 이해하려면 반대되는 의미의 동기 입출력(블로킹, BI○cking lO) 방식으로 파일을 읽는 과정을 먼저 알아야 합니다.
4.콜백함수
- 비동기와 동기를 나누는 함수로 변수에 함수를 할당할 수 있는 언어에서 다른 함수의 파라미터로 전달했을 경우 내부에서 호출하는것이 콜백함수이다
5. 이벤트 기반 입출력(Event driven I/O) 모델
파일 시스템이 이벤트와 함께 호출하는 방식이면 이벤트 기반 입출력(Event driven I/O) 모델이리고 부릅니다.
6. 자바스크립트
- 기존 한줄씩 해석하면서 실행하는 인터프리터(Interpreter)방싱글 사용하므로 속도가 느려 문제가 되곤 했다.
- 크롬의 V8 자바스크립트 엔진이 나오면서 해결되었다.
7.V8 엔진에서 노드가 동작할 수 있도록 만든 시스템 구조(아키텍처 , Architecture ) 를 보여 줍니디
노드를 설치한 다음 노드로 프로그램을 만들어 실행하면 크롬 V8 엔진 위에서 실행됩니다.
V8 엔진에는 필요한 기능을 병렬로 실행하는 스레드 풀과 이벤트를 받아 처리하는 ‘이벤트 루프' 등의 기본 기능이 있으며,
그 위에 네트워킹 기능을 담당하는 소켓(Socket), http 라이브러리들이 있습니다.
그리고 그 위에 표준 라이브러리가 구현되어 있습니다.
이런 라이브러리를 사용하고 싶다면 자바스크립트로 프로그램을 만들면 됩니다.
개발자들이 각자의 목적에 맞게 만든 노드 프로그램은 그 라이브러리 위에서 동작하게 됩니다.
8.기본기능 (http를 이용하여 웹 서버로 요청을 보내고 응답받는 코드
그러면 노드의 기본 기능인 http를 이용해 웹 서버로 요청을 보내고 응답을 벋는 코드의 일부를 살펴보겠습니다.
http.request(options, function(res) {
res.on('data',function(chunk){
console.log("Body : " + chunk);
});
});
9.http객체
- http 객체는 HTTP 프로토콜로 웹 서버에 데이터를 요청할 수 있는 기능이 있습니다 .request() 함수를 호출하여 웹서버에 데이터를 요청할 수 있고 응답을 받으면 콜백 함수가 자동으로 호출됩니다.
- 응답을 처리할 수 있는 콜백 함수는 res라는 이름의 객체를 전달받는데, 이 res 객체는 수신한 데이터를 이벤트 이름으로 구별할 수 있습니다.
10.바인딩
- Javascript 에서는 on() 메소드를 사용해 이벤트를 콜백 함수와 바인딩(Binding) 할 수 있습니다.
- 따라서 응답 객체인 res 객체의 on()메소드를 사용해 data 이벤트와 콜백 함수를 바인딩하면 data라는 이름의 이벤트를 받았을 때 등록한 콜백 함수가 실행됩니다.
*이벤트 바인딩 : 바인딩은 서로 묶어서 연결해 준다는 의미입니다. 에를 들어, 버튼이 하나 있고 이 버튼을 클릭하였을 때 Click이벤트가 발생한다고 가정하면 이벤트를 함수 각체와 바인딩하면 이 click이벤트가
발생했을때 등록한 함수 객체가 실행됩니다 즉 버트을 클릭하면 이 함수가 실행됩니다.
ex) [객체].on([이벤트이름],[함수객체]); -> res.on('data',function(){ });
11. 노드를 더 쉽게 사용할 수 있게 하는 모듈
- 필요한 기능을 별도의 자바스크립트로 만든 후 필요 할 대마다 불러올 수 있습니다. 다만 그 형태는 CommonJS표준 스펙을 따릅니다.
12. 모듈이란
- 메인이 되는 자바스키릅트 파일의 일부 코드를 떼어 별도의 파일로 만들 수 있는데 이를 모듈(Module)이라고 부릅니다.
- 코드의 일부를 떼어 module_1.js 라는 이름의 파일로 저장한다면 이 파일이 모듈입니다.
- 만약 이 모듈을 사용하고 싶다면 require() 함수로 모듈을 호출하면 됩니다. 이렇게 불러들인 파일은 자바스크립트 객체로 인식되며, 그 객체를 참조하여 파일에 넣어 둔 기능을 사용할 수 있습니다.
13.패키지
- 여러 개의 모듈을 합쳐 하나의 패키지(Package)로 만들어 두면, 다른 프로그래머들도 npm 프로그램으로 손쉽게 패키지를 설치하여 사용할 수 있습니다.