main-logo

Node.js 간략 소개와 이벤트 루프

설치 방법과 작동 원리에 대한 간략한 개념

profile
백내영
2024년 09월 01일 · 0 분 소요

들어가며

nodejs 에 대해 조금 알아두고 싶어서 영상 강의를 보게되었고, 관련해서 알게된 부분들을 공유하는 것도 좋을 것 같아 간략하게나마 글을 작성하게 되었습니다. 이후 알게되는 부분들이 있다면 초반 지식일 수 있겠지만 관련해서도 블로그를 작성해나갈까 합니다. 그럼 기본적으로 NodeJS 부터 소개하겠습니다.

NodeJS란?

Node.js 는 개발자가 웹 브라우저 또는 서버에서 자바스크립트를 실행할 수 있도록 해주는 자바스크립트 런타임 환경입니다. 빠르고 확장 가능한 웹 애플리케이션을 구축하는데 특히 유용하게 사용되고 있습니다. 그런 Node.js를 사용하려면 우선 설치를 해야겠죠.

설치를 해보자

https://nodejs.org/ 를 방문해서 본인에 구축하고자 하는 애플리케이션 사양에 맞는 버전의 Node 를 다운 받아 설치하시면 됩니다. 구축 시 사용할 라이브러리 등의 지원 버전 등이 다를 수 있기 때문에 무조건 최신 버전을 설치하기 보다는 환경에 맞게 설치를 진행하시면 됩니다. 저는 맥OS 기준으로 설치하여 진행하였습니다.

설치하신 후 node -v 와 npm -v 로 설치한 버전을 확인할 수 있습니다.

설치가 완료되었다면 vscode 에서 node 파일을 실행할 폴더를 생성 후 js 파일을 만들어줍니다. 저는 test-node.js 라는 이름의 파일을 만들어주었습니다.

해당 파일에 console.log("test Node.js!!") 라고 기본 콘솔 코드를 선언하고 터미널을 열어
node test-node.js 라고 명령어를 치면 터미널 상에서 콘솔에 선언했던 "test NodeJS!!" 가 출력되는 것을 확인할 수 있습니다.

콘솔이 아닌 파일의 결과를 볼 수도 있는데요
위 작업을 위해 노드의 핵심 모듈 중 하나인 fs 모듈을 가져와 사용할 수 있도록 선언해줍니다.

const fs = require('fs'); 

fs.writeFileSync('hello.txt', 'Hello Test Node.js')

위의 선언 후 아까와 동일하게 터미널을 열어
node test-node.js 라고 명령어를 치면 위에 선언해준 hello.txt 파일이 생성되면서 해당 파일 안에 선언해둔 "Hello Test Node.js" 라는 워딩이 터미널에 노출되는 것을 확인하실 수 있습니다.

단순한 사용 설명을 드렸는데요. 사용법 외에 node.js 가 어떻게 작동하는지, 작동 방식 중 중요 개념인 이벤트 루프에 대한 부분도 설명을 드려보려고 합니다.

Node.js 가 웹에서 작동하는 방법

단순 설명을 드리면, 노드 서버 생성 후 요청(request)이 서버에 도달하면 노드 코드를 실행 후 응답(response)을 전송해줍니다.

조금 더 풀어서 말씀드리자면, 사용자는 보통 브라우저를 사용하여 서버에 요청 즉, request를 날립니다.

그럼 server 에서 코드를 실행하고 해당 요청에 대한 응답을 html 파일로 response 해줍니다.

server는 일반적으로 성능이나 보안 상의 이유로 브라우저 내에서 할 수 없거나 원하지 않는 작업을 하는데, 데이터베이스에서 데이터를 가져오고 저장하거나, 사용자 인증을 하는데 사용자가 접근할 수 없는 곳에서만 하게 됩니다. 해킹 등을 피하기 위해서 입니다. 입력 유효성도 마찬가지입니다. 자바스크립트로만 진행되면 브라우저 쪽에서 코드를 바꿀 수 있기 때문에 언제든 속이거나 변경할 수 있지만 서버는 당연히 그런 정보들을 보호해야하니까요.

Node.js의 이벤트 루프 

이벤트 루프는 Node.js의 작동 방식 중 하나인데요. 

Node.js는 단일 스레드에서 실행됩니다. 즉, 한 번에 한 가지 작업만 수행할 수 있다는 말인데요. 그렇게되면 여러 요청을 받는 서버의 경우 요청을 한 번에 하나씩 처리하게 될테고, 결국 사용자에게 지연이 발생하게 되겠죠. 무한 로딩 또는 서버 다운 같은 일 말이죠. 그래서 Node.js는 이벤트 루프라는 것을 사용하여 사용자를 기다리지 않도록 여러 요청들을 효율적으로 처리할 수 있게 해줍니다. 그럼 작동 방식을 알아볼까요.

여러가지 요청 중 동기식으로 대응할 수 있는 작업과 비동기식으로 대응할 수 있는 작업이 있는데요. 비동기식의 작업을 예로 든다면 파일을 읽거나 인터넷에서 데이터를 가져오는 것과 같이 시간이 많이 걸릴 수 있는 작업이고, 동기식 작업은 단순하고 빠르게 처리할 수 있는 작업이라고 생각하시면 됩니다.

위와 같이 동기식 작업인 경우 작업이 빠르면 즉시 수행하겠지만, 작업에 시간이 걸리면 다음 작업으로 넘어간 후, 긴 작업이 완료되면 다시 이벤트 루프로 돌아와서 완료 시키는 것이죠.

파일을 읽고 데이터를 출력하는 순서의 코드 예시로 설명 드리겠습니다.

const fs = require('fs');

console.log('Start!!');

fs.readFile('big-data.txt', (err, data) => {
  if (err) throw err;
  console.log('file data:', data);
});

console.log('Reading!!');

위 코드를 실행하면 "Start!!" 가 바로 출력되고 readFile 실행이 아직 끝나지 않았다면 끝날 때까지 기다리는 것이 아니라 그 다음 코드를 먼저 실행하여 "Reading!!" 를 출력하고 파일 읽기가 완료되면 이벤트 루프가 다시 돌아와서 "file data:" 와 함께 파일 내용을 출력해주는 것입니다.

Node.js를 처음 접하는 작업자의 경우 이벤트 루프를 이해하면 Node.js가 속도 저하 없이 동시에 많은 요청을 처리할 수 있는 방법을 이해하는 데 도움이 되고, 채팅 앱이나 온라인 게임과 같은 실시간 애플리케이션을 구축하는 데 특히 유용하다고 하여, 알아두면 좋을 개념인 것 같아 설명드려보았습니다.

 

마치며

Node.js에 대해 두서없이 설명을 드린 것 같은데요.

설치 방법과 작동 원리에 대한 개념을 공유하고자 하였습니다. 이후 코드를 작성하는 부분에 대해서도 블로그를 작성하려고 하니, 이번 블로그는 기본적인 소개로 봐주시면 좋을 것 같습니다.

해당 글은 여기까지이며, 이후 내용이 추가나 수정이 필요한 부분이 있다면 언제든 알려주세요.
부족한 글 읽어주셔서 감사합니다. 🙇🏻‍♀️
그럼 안녕히…👋 -The End-

 

참고문서