Node.js-개념, 동작원리
node.js란?
- 자바스크립트는 원래 브라우저에서 동작하는 언어였다.
- 근데 node.js에선 브라우저 밖에서도 javascript를 사용할 수 있다.
- 크롬의 v8 엔진을 이용하기 때문
- node.js는 이벤트기반의 비동기 I/O프레임워크이다.
- 클라이언트가 node.js서버에 요청을 보내면 node.js는 이 요청을 이벤트라고 하는 것으로 만들어서 이벤트 큐에다가 차곡차곡 쌓아놓는다.
- 그리고 이벤트 루프가 이벤트 큐에 쌓아져있는 이벤트들을 하나하나 실행한다. (이벤트 루프가 싱글 쓰레드이다.)
- 그리고 그 실행처리 결과를 다시 클라이언트에게 응답해주는 형식이다. / 여기까지가 ‘이벤트기반’을 설명해준다.
- 보통은 이벤트루프가 각각의 이벤트들을 실행하는데 디스크에서 파일을 읽어온다든든지 네트워크통신을 한다든지의 작업은 오랜 시간이 걸릴 수도 있다. 또한 javascript는 한줄한줄 코드를 읽어내리는 interpreter언어이기에 중간에 있는 저런 시간이 오래 걸리는 작업을 마쳐야 그 뒤 코드가 실행이 된다. (그 뒤 코드가 아무리 가볍고 쉽고 빠른 코드라 할지라도)
- 이러한 무거운 작업은 non-blocking worker라는 쓰레드로 이벤트루프가 위임하여 실행이 된다.
- 이렇게 위임받아서 작업이 완료된 이벤트를 다시 이벤트큐로 콜백시킨다. 그럼 이벤트루프가 콜백된 작업을 처리하여 클라이언트에게 보내준다. 이 방식을 비동기I/O프레임워크라고 한다.
- 브라우저에선 모듈을 사용하려면 윈도우 컨텍스트나 의존성 로더를 사용해야하지만 node.js에선 파일 형태로 모듈을 관리할 수 있는 CommonJs로 모듈을 구현한다.
- fs나 http같이 노드 다운받을 때 내장으로 들어있는 기본 모듈도 있고 우리가 직접 만들어서 module.exports{}로 내보내고 써드파티 모듈로서 사용할 수도 있다.
- 자바나 php와 node.js가 다른 점? node.js는 비동기처리방식의 코드가 굉장히 많다!!
- 동기 처리 console.log(“1”); const data = fs.readFileSync(“./data.txt”, “utf8”); console.log(data); console.log(“2”);
- 비동기 처리
console.log(“1”);
fs.readFile(“./data.txt”, “utf8”, function(err, data){
console.log(data);
}) console.log(“2”); - 동기 처리에선 1출력하고 파일을 읽고 그 파일 내용을 출력하고 2를 출력한다.
- 하지만 비동기 처리에선 1을 출력하고 파일을 읽고 출력하는 일을 non-blocking worker에 위임해놓고 먼저 2를 출력한다. 그리고 위임했던 일이 끝나면 function(err, data){…} 콜백함수를 다시 이벤트 큐에 넣어 이벤트 루프가 처리한다.
javascript와 web browser와 node.js 관계
- 위 그림과 같이 js라는 언어를 알게 되면 한국말을 알았을 때 병원에서 의사소통가능하고 법원에서도 가능하듯이 웹 브라우저나 서버 둘 다를 제어할 수 있음 → 아주 매력적
서버동작
- 클라이언트
- 사용자, 고객, 갑, 요청
- 웹브라우저가 설치되어있는 컴퓨터가 클라이언트
- 사용자가 웹브라우저에다 주소를 치고 엔터를 치면
- 클라이언트컴퓨터가 서버에 접속해서 어떠한 정보를 요청
- 서버
- 클라이언트가 필요한 걸 제공하는 을, 응답&제공
- 요청받은 정보를 웹브라우저에게 제공, 응답, 제공
- ip
- www.naver.com과 같은 도메인네임은 그냥 기억하기쉽게하는 이름이고
- 실제로 접속하는 건 그 이름에 해당되는 구체적인 주소인 ip를 통해서 접속한다.
- 도메인네임은 주소록에 저장된 이름이고 ip주소는 실제 전화번호이다.
- 주소록에서 이름을 찾아 전화버튼을 누르면 자동으로 그 번호로 전화를 거는 것과 같은 이치이다.
- 포트
- 서버쪽 컴퓨터에 여러 서버어플리케이션들(웹서버, 게임서버, 데이터베이스서버 등등)이 설치되어 있을 수 있다.
- 과연 www.naver.com를 클라이언트에서 치고 들어왔을 때 서버컴퓨터에선 어떤 서버 어플리케이션을 연결해줘서 그게 응답할 수 있게 하느냐가 매우 중요
- 컴퓨터엔 0~65535개의 포트가 있다. 그 중 80번 포트에 웹서버를 연결시켜놓고 웹서버가 80번포트를 리스닝하게한다. 웹서버가 80번포트를 듣고있는거
- 사용자가 이 서버에 접속할 때 주소칠 때에는 포트넘버를 생략한다. http://naver.com:80
- http를 통해서 접속한 경우에는 80번 포트를 쓰자라는 약속이 되어있기 때문에 생략가능
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
- nodejs를 이용해서 웹서버를 만들고 그 웹서버가 3000번 포트를 리스닝라게 하는거
- 그리고 127.0.0.1로 접속한 클라이언트에 대해서 응답하라는 명령어이다.
- 그 응답결과는 hello world라는 텍스트를 응답하라는 게 전체적인 이 코드의 취지
댓글남기기