•
서버의 사전적 의미 : 서버는 사용자(클라이언트)의 요청에 의하여 서비스를 하는데 이와 같이 구성된 시스템을 클라이언트-서버 시스템이라고 하며, 이는 하나 이상의 응용 프로그램을 상호 협력적인 환경에서 운용하는 분산처리 형태를 의미한다. 즉, 서비스를 요청하는 클라이언트와 클라이언트의 요청을 처리하는 서버와의 협동작업을 통해서 사용자가 원하는 결과를 얻는 처리방식이 클라이언트-서버 시스템이다.
•
클라이언트 → 서버 : 요청
•
서버 → 클라이언트 : 응답
•
서버의 한줄 요약
서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
•
내가 만약에 gloriouscoding.com 을 방문한다고 가정하면 방문자가 서버에 요청을 하고 glorioucoding 서버 측에서는 방문자에게 홈페이지 자료를 띄우는 작업을 한다.
•
어플리케이션도 마찬가지다.
•
서버라고 해서 요청에 대한 응답만 하는 것은 아니다.
•
다른 서버에 요청을 보낼 수도 있다.
서버는 클라이언트의 요청에 대해 응답을 한다.
•
응답으로 항상 Yes를 해야 하는 것은 아니고, No를 할 수도 있다.
•
여러분이 어떤 사이트로부터 차단당했다면 그 사이트의 서버는 여러분의 요청에 매번 No를 응답
•
Node는 JS Program이 Server로서 기능하기 위한 도구를 제공하므로 Server 역할을 수행할 수 있다.
Node JS = 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”