Search

240605_0929_[Node] Server 그리고 Node JS

서버의 사전적 의미 : 서버는 사용자(클라이언트)의 요청에 의하여 서비스를 하는데 이와 같이 구성된 시스템을 클라이언트-서버 시스템이라고 하며, 이는 하나 이상의 응용 프로그램을 상호 협력적인 환경에서 운용하는 분산처리 형태를 의미한다. 즉, 서비스를 요청하는 클라이언트와 클라이언트의 요청을 처리하는 서버와의 협동작업을 통해서 사용자가 원하는 결과를 얻는 처리방식이 클라이언트-서버 시스템이다.
클라이언트 → 서버 : 요청
서버 → 클라이언트 : 응답
서버의 한줄 요약

서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

내가 만약에 gloriouscoding.com 을 방문한다고 가정하면 방문자가 서버에 요청을 하고 glorioucoding 서버 측에서는 방문자에게 홈페이지 자료를 띄우는 작업을 한다.
어플리케이션도 마찬가지다.
서버라고 해서 요청에 대한 응답만 하는 것은 아니다.
다른 서버에 요청을 보낼 수도 있다.

서버는 클라이언트의 요청에 대해 응답을 한다.

응답으로 항상 Yes를 해야 하는 것은 아니고, No를 할 수도 있다.
여러분이 어떤 사이트로부터 차단당했다면 그 사이트의 서버는 여러분의 요청에 매번 No를 응답
Node는 JS Program이 Server로서 기능하기 위한 도구를 제공하므로 Server 역할을 수행할 수 있다.

Node JS = Javascript 런타임

Node.js 사이트로 접속하면 Node.js를 ‘ Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.’ 라고 소개하고있다.
런타임은 특정 언어로 만든 프로그램을 실행하는 환경

노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.

쉽게 말해 노드는 자바스크립트 실행기
자바스크립트는 Node.js 선행으로 학습해야 할 선행 공부이다.

자바스크립트는 맨 처음에는 웹에서만 쓰였다.

자바스크립트 프로그램을 웹 브라우저 위에서만 실행할 수 있었다.
브라우저는 자바스크립트 런타임을 내장하고 있으므로 자바스크립트 코드를 실행할 수 있었다.
브라우저 외의 환경에서 자바스크립트를 실행하기 위한 여러 시도가 있었으나 속도가 느려서 안 쓰였다.
하지만 2008년 구글이 V8 엔진을 사용하여 크롬을 출시하였다.
상당수 브라우저가 JavaScript 코드를 해석하기 위해 JavaScript Engine을 내장하고 있습니다. Chrome은 V8, Firefox는 SpiderMonkey, Safari는 Webkit 등.
V8 엔진은 다른 자바스크립트 엔진과 달리 매우 빨랐기에 속도 문제가 해결되자 라이언 달(Ryan Dahl)은 2009년 V8 엔진 기반의 노드 프로젝트를 시작했다.
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
우리가 코딩한 자바스크립트 코드는 노드가 알아서 V8과 libuv에 연결해준다.
libuv 라이브러리는 노드의 특성인
이벤트 기반?
논 블로킹 I/O 모델?
을 구현하고 있다.

이벤트 기반(event-driven) : 사용자가 이벤트를 발생할 때 미리 지정해둔 작업을 수행하는 방식

예를들면 클릭을 하는 행위, 네트워크 요청 등이 있다.
이벤트를 미리 등록을 해야하기 때문에, 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다고 표현
버튼을 클릭할 때 로그인창을 띄우도록 설정하는 것을 예

노드도 이벤트 기반 방식으로 동작하므로, 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출

발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다음 이벤트가 발생할 때까지 대기
이벤트 기반 모델에서는 이벤트 루프(event loop)라는 개념이 중요하다.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다.
노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행한다.
함수 호출 부분을 발견했다면 호출한 함수를 호출 스택(call stack)에 넣는다.
다음 코드가 콘솔에 실행되는 결과를 확인해 보자. (구글크롬 f12 버튼의 console 창에서 테스트)
function first() { second(); console.log('첫 번째'); } function second() { third(); console.log('두 번째'); } function third() { console.log('세 번째'); } first();
JavaScript
복사

실행결과

함수가 쌓이는 방식은 아래와 같다.
anonymous -> first() -> second() -> thrid()
JavaScript
복사
실행은 이 순서이다.
thrid() -> second() -> first() -> anonymous
JavaScript
복사
anonymous 함수는 처음 실행 시의 전역 컨텍스트(global context)다.
컨텍스트는 함수가 호출되었을 때 생성되는 환경
자바스크립트 코드는 실행 시 기본적으로 전역 컨텍스트 안에서 돌아간다
함수는 실행되는 동안 호출 스택에 머물러 있다가 실행이 완료되면 호출 스택에서 지워진다.
anonymous 컨텍스트까지 실행이 모두 완료되었다면 호출 스택은 비어 있게 됩니다.

다음예제

function run() { console.log('3초 후 실행'); } console.log('시작'); setTimeout(run, 3000); console.log('끝');
JavaScript
복사
실행화면
순서가 이렇게 나오는 이유는 setTimeout 이라는 함수는 스레드 풀에 들어가서 대기한 다음 출력되는 형태로써 단일스레드라는 노드JS 특성과 이해하기 혼돈할 점이 많지만 스레드풀에 있는 4개의 스레드와 같이 병행하며 작업한다는 점을 잊지말자.
호출 스택에서 setTimeout 함수의 콜백 결과인 run이 호출 스택에 언제 들어기는지에 대해서는 선행 학습 내용이 필요하다.
이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다.
백그라운드: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 된다. 여러 작업이 동시에 실행될 수 있다.
태스크 큐: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.

안녕하세요

한국전자기술연구원 김영광입니다.
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.

Hello

I'm Yeonggwang Kim from the Korea Electronics Research Institute.
For technical and business inquiries, please contact me at “glory@keti.re.kr”