티스토리 뷰

서버

Node.JS

김규현 2021. 9. 27. 16:09

생애 첫 면접을 보고 왔다.

 

 Node.JS를 이용해 서버를 구축하는 회사였다. 그래서 가장 첫 질문이 Node.JS에 대한 것이라고 예상을 했고, 그 예상은 정확하게 적중했다.

 

웹 어플리케이션 개발에 자주쓰이는 Node.JS에 대해 알아보겠다.

 

1. JavaScript

 우선, Javascript는 웹 브라우저에서 동작하도록 만들어진 언어이다. 자바스크립트는 이름에서 알 수 있듯이 스크립트 언어인데, 이는 프로그래밍언어의 한 종류로 이미 존재하는 소프트웨어(어플리케이션)을 제어하기 위한 용도로 쓰이는 언어이다. 즉 스크립트 언어인 자바스크립트는 웹 브라우저를 제어하는 언어라는 것이다. HTML에서 자바스크립트 파일을 실행시키려면 Script태그를 사용해야한다. 

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />
    <title>자바스크립트 페이지</title>
    <script type="text/javascript">
      document.write("<p>Hello World!</p>");
    </script>
  </head>
  <body>
    <noscript>
      <p>브라우저가 자바스크립트 기능을 지원하지 않거나 자바스크립트 기능이 꺼져 있습니다.</p>
    </noscript>
  </body>
</html>

위의 예시에서 보면 스크립트 태그부분에서 자바스크립트 언어를 사용해 해당 HTML파일을 제어하는 것을 볼 수 있다.

<script type="text/javascript">
  document.write("<p>Hello World!</p>");
</script>

HTML은 웹페이지를 그려주는 클라이언트에서 사용하는 언어이다. 그렇기 때문에 자바스크립트 또한 클라이언트에서만 사용하는 언어였다. 

2. Node.JS

 하지만 Node.JS가 나오고 나서는 자바스크립트로 서버프로그래밍이 가능해졌다. 그 이유는 Node.JS가 구글에서 만든 V8엔진과 비동기 I/O를 지원하는 libuv 라이브러리를 결합해 만들어졌기 때문이다. 

 V8엔진은 웹브라우저를 만드는 데 기반을 제공하는 자바스크립트 엔진이다. 이 엔진을 이용해 구글 크롬 브라우저를 만들었다. 자바스크립트는 웹브라우저에서 동작하는 언어이고, V8엔진은 웹브라우저를 만들 수 있는 엔진이기 때문에 자바스크립트역시 V8엔진을 기반으로 만들어진 Node.JS에서 동작하는 것이다. 

 

 Node.JS의 정의를 보면, '확장성 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼 이다. 작성 언어로 자바스크립트를 활용하며 논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.' 라고 되어있다. 

 확장성 있는 네트워크 어플리케이션은 웹 어플리케이션을 의미한다고 볼 수 있다. 논블로킹 I/O는 Input이 있을 때 Output이 나오지 않은 상태라도 멈추지 않는다는 의미이고 이는  단일 스레드 이벤트 루프와 함께 설명이 되어야 한다.

 

 구글이나 네이버같은 웹 사이트들에는 여러가지 작업을 할 수가 있다. 검색어를 입력하고 검색버튼을 누르면 검색 결과 페이지로 넘어간다. 이때 네트워크의 상황이 좋다면 1초도 안되는 시간안에 페이지가 전환될 것이다. 하지만 모종의 이유로 검색버튼을 눌러도 아직 전환되지 않았을 때 우리는 해당 화면에서 네이버 웹툰으로 이동하는 버튼을 누를 수가 있다. 만일 블로킹 I/O의 경우라면 검색버튼을 누르고 페이지가 전환되지 않는 상황에서 다른 작업을 할 수가 없다.

검색을 실행(Input)했고, 결과페이지(Output)가 나올 때 까지 그 어떤 작업도 Blocking되어 Input으로 들어갈 수 없기 때문이다.

실행의 문제가 아니라 페이지 자체가 멈춰서 사용자와의 상호작용이 불가능해 지는 것이다. 이런 상황에서 우리는 웹페이지가 잠시 멈춘것인지 고장이 난 것인지 모르기 때문에 낮은 사용자 경험을 하게 될 것이다. 

 

 하지만 Node.JS는 모든 작업들을 논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통해 처리하기 때문에 결과를 기다리는 중에도 여전히 상호작용할 수 있는 높은 사용자 경험을 하게 한다. 

출처 : https://yceffort.kr/2019/09/06/javascript-event-loop

 위 이미지는 이벤트루프를 시각적으로 표현한 자료이다. JS파일에서 함수가 실행되면 스택에 쌓인다. 함수가 실행되면서 콜백함수를 가지는 이벤트가 있으면 해당 이벤트를 webAPIs에서 찾아 실행시킨다. 실행이 완료되고 난 후 (예를들면, setTimeout의 경우 인자로 받은 시간이 지난 후에) 이벤트루프가 콜백함수를 콜백큐에 넣는다. 그리고 이벤트 루프는 스택이 비었는지를 확인하고, 비어있다면 콜백큐를 확인하여 대기중인 콜백함수를 스택에 넣어서 실행시킨다. 

 

 Node.JS의 이러한 특징으로 인한 높은 처리성능과 내장 HTTP 서버 라이브러리를 통해 서버 사이드 개발에 널리 이용되고 있다.

'서버' 카테고리의 다른 글

Redis 데이터 분산  (0) 2021.11.02
Redis 운영  (0) 2021.10.28
마이크로서비스 - 3  (0) 2021.10.13
마이크로서비스 - 2  (0) 2021.10.10
마이크로서비스  (0) 2021.10.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함