[Node.js] Node.js란?

초이지수·2022년 8월 9일
0

Node.js

목록 보기
1/7
post-thumbnail

노드란 무엇인지, 어떤 특징을 갖고 있는지 왜 사용하는지 알아봅시다!


☄️ 1. Node.js 란?

Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임입니다.

  • JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램

  • 구글 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경
    런타임 : 특정 언어로 만든 프로그램을 실행할 수 있는 환경

  • 서버사이트 스크립트 언어가 아님!!!!!

Node.js는 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를
브라우저 이외의 환경에서도 동작할 수 있도록 자바스크립트 엔진을 브라우저에서 독립시킨 자바스크립트 실행 환경


☄️ 2. Node.js 의 구조

V8과 더불어 libuv라는 라이브러리를 사용
V8과 libuy는 C와 C++로 구현되어 있다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.


☄️ 3. Node.js 의 특징

  1. Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 Request 처리 성능을 갖고 있다.

  2. 모든 API가 비동기 방식으로 동작

  3. 단일 스레드 이벤트 루프 모델을 사용함으로써 보다 가벼운 환경에서도 높은 요청 처리 성능을 보여줌

  4. 데이터를 실시간 처리하는 SPA에 적합
    단, CPU 사용률이 높은 어플리케이션에는 권장하지 않음

  5. Socket.io라는 실시간 통신 라이브러리를 사용하여 대량의 데이터 처리와 실시간 통신 모두 구현 가능


☄️ 4. node를 사용하는 이유

  • JavaScript는 C/C++, Java 와 같은 프로그래밍 언어지만 독립적인 언어가 아닌 스크립트 언어이다.

  • 스크립트 언어는 특정한 프로그램 안에서 동작하기 때문에 웹 브라우저 프로그램 안에서만 동작함

  • node.js를 설치하게 되면 터미널프로그램에서 node.js를 입력해 브라우저 없이 바로 실행할 수 있다. => 자바스크립트 실행기


⚡️ 이벤트 기반

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식. (클릭이나 네트워크 요청 등이 이벤트에 해당)
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록하는데, 이것을 이벤트 리스너에 콜백 함수를 등록한다고 표현함.

  1. 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록
  2. 이후 이벤트가 발생하면 리스너에 등록해둔 콜백 함수를 호출
  3. 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기
  • 노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
  • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.

⚡️ 이벤트 루프

여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할 지 이벤트 루프가 판단함.
이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복해 루프라고 부름.

  1. 노드는 JavaScript 코드의 맨 위부터 한 줄씩 실행한다.
  2. 함수 호출 부분을 발견하면 호출한 함수를 호출 스택(call stack)에 넣고 다음 코드를 확인하여 호출 스택을 쌓아간다.
  3. 함수는 실행되는 동안 호출 스택에 머물러 있고, 실행이 완료되면 호출 스택에서 지워진다.
  4. 컨텍스트(global context)까지 모두 실행 완료 되면 호출스택은 비워짐.
    (컨텍스트란 함수가 호출되었을 때 생성되는 환경을 의미)

⚡️ 논 블로킹 I/O모델

  • 논 블로킹 : 이전 작업이 완료될 때까지 대기하는 것이 아니라 다음 작업을 바로 수행하는 것
  • 블로킹 : 이전 작업이 반드시 끝나야 다음 작업을 수행 하는 것

논 블로킹으로 수행하기 위해서는 모두 동시에 처리될 수 있는 작업이어야 한다.

이벤트 루프를 활용하면 작업 시간이 긴 것도 효율적으로 처리가 가능하다.
기본적으로 JavaScript상에서 돌아가는 것은 동시에 실행될 수 없지만 I/O 작업은 동시에 처리 가능하다.

  • I/O 작업 : 파일 시스템 접근(파일 읽기, 쓰기, 폴더 생성), 네트워크를 통한 요청 작업

⚡️ 싱글 스레드

싱글 스레드란 스레드가 하나뿐이라는 것.
프로세스는 스레드를 여러개 생성해 여러 작업을 동시에 처리할 수 있다.

  • 프로세스 : 운영체제에서 할당하는 작업 단위
    노드 or 웹 브라우저 같은 프로그램은 개별적인 프로세스.
    프로세스 간에는 메모리 등의 자원을 공유하지 않음.

  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위
    (작업을 처리하는 일손으로 보면 됨)


스레드는 부모 프로세스의 자원을 공유하고 같은 주소의 메모리에 접근이 가능! = 데이터를 공유할 수 있다.
노드를 실행하면 프로세스가 하나 생성되고, 그 프로세스에서 스레드를 생성할 때 내부적으로는 스레드를 여러개 생성함.


하지만 직접 제어가 가능한 것은 스레드 한 개라서 노드를 싱글 스레드라고 하는 것!

하나의 스레드만 제어가 가능하므로 많은 요청이 오면 하나씩 처리하고
논 블로킹 방식을 이용하여 대기 시간을 줄이는 것이다!

블로킹이 심하게 일어나는 작업이 아니면 스레드 하나로도 충분함.
블로킹이 발생할 것 같은 경우에는 논블로킹 방법으로 대기 시간을 최대한 줄임.


☄️ 5. 그래서 노드는요!

기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋고, CPU 부하가 큰 작업에는 적합하지 않다.
(작성한 코드가 모두 스레드 하나에서 처리되기 때문)

개수가 많고 크기가 작은 데이터를 실시간으로 주고받는데 적합함!

네트워크, 데이터베이스, 디스크 작업 같은 I/O 에 특화되어 있다.
(실시간 채팅 애플리케이션, 주식 차트)


⚡️ Express

node.js를 이용해 웹 애플리케이션을 만들기 위한 틀(Frame)을 제공하는 라이브러리의 집합(프레임워크)이다.
프레임워크 : 어떤 작업을 쉽게 완성하기 위한 라이브러리의 집합. 개발에 바탕이 되는 템플릿 및 클래스와 인터페이스의 집합체.

파이썬의 Django, 자바의 spring처럼 JS의 웹 프레임워크이다.


⚡️ 모듈

어플리케이션을 구성하는 개별적 요소

  1. 파일 단위로 분리
  2. 필요에 따라 명시적으로 로드
    어플리케이션에 분리되어 개별적으로 존재하다가 어플리케이션 로드에 의해 일원이 된다.
  3. 기능별로 분리되어 작성됨. = 개발효율성과 유지보수성의 향상

☄️ 6. CommonJS vs ES6(ES2015)

CommonJS는 브라우저뿐만 아니라 서버사이드 어플리케이션이나 데스크톱 어플리케이션에서도 사용하려고 조직한 자발적 워킹 그룹이다.

node.js는 100% 동일하지는 않지만 기본적으로 CommonJS 방식을 따름.
require, import


☄️ 8. 모듈화

  1. 스코프 (Scope) : 모든 모듈은 자신만의 독립적인 실행 영역이 있어야 함
    지역변수와 전역변수의 분리
  2. 정의 (Definition) : 모듈 정의는 exports 객체를 이용함.
  3. 사용 (Usage) : 모듈 사용은 require 함수를 이용함

☄️ 9. MVC

  • Models : 데이터를 저장하고 가져오는 역할
  • Views : 사용자가 보게 되는 화면을 책임짐
    html 자료에 올바른 내용을 랜더링해 사용자에게 보내는 역할
  • Controllers : 모델과 뷰 사이의 연결점. 작업할 모델과 렌더링 할 뷰를 정의하는 역할.
    모델과 함께 데이터를 저장하거나 저장 프로세스를 유발.
    뷰에서 가져온 데이터를 전달하는 것을 도움.

(routes : 어떤 경로에 따른 http 메서드에 따라 어떤 컨트롤러 코드를 실행할지 정의 )


참고했던 사이트 및 도서

https://urmaru.com/m/8

profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.

0개의 댓글