Node.js-개념, 동작원리

2 분 소요

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라는 언어를 알게 되면 한국말을 알았을 때 병원에서 의사소통가능하고 법원에서도 가능하듯이 웹 브라우저나 서버 둘 다를 제어할 수 있음 → 아주 매력적

서버동작

  1. 클라이언트
    1. 사용자, 고객, 갑, 요청
    2. 웹브라우저가 설치되어있는 컴퓨터가 클라이언트
    3. 사용자가 웹브라우저에다 주소를 치고 엔터를 치면
    4. 클라이언트컴퓨터가 서버에 접속해서 어떠한 정보를 요청
  2. 서버
    1. 클라이언트가 필요한 걸 제공하는 을, 응답&제공
    2. 요청받은 정보를 웹브라우저에게 제공, 응답, 제공
  3. ip
    1. www.naver.com과 같은 도메인네임은 그냥 기억하기쉽게하는 이름이고
    2. 실제로 접속하는 건 그 이름에 해당되는 구체적인 주소인 ip를 통해서 접속한다.
    3. 도메인네임은 주소록에 저장된 이름이고 ip주소는 실제 전화번호이다.
    4. 주소록에서 이름을 찾아 전화버튼을 누르면 자동으로 그 번호로 전화를 거는 것과 같은 이치이다.
  4. 포트
    1. 서버쪽 컴퓨터에 여러 서버어플리케이션들(웹서버, 게임서버, 데이터베이스서버 등등)이 설치되어 있을 수 있다.
    2. 과연 www.naver.com를 클라이언트에서 치고 들어왔을 때 서버컴퓨터에선 어떤 서버 어플리케이션을 연결해줘서 그게 응답할 수 있게 하느냐가 매우 중요
    3. 컴퓨터엔 0~65535개의 포트가 있다. 그 중 80번 포트에 웹서버를 연결시켜놓고 웹서버가 80번포트를 리스닝하게한다. 웹서버가 80번포트를 듣고있는거
    4. 사용자가 이 서버에 접속할 때 주소칠 때에는 포트넘버를 생략한다. http://naver.com:80
    5. 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라는 텍스트를 응답하라는 게 전체적인 이 코드의 취지

카테고리:

업데이트:

댓글남기기