앞서 웹이 어떻게 구성되는 지에 대한 기초를 배웠다.
이번 글 부터는 웹을 기능적으로 사용하기 위한 방법을 배워볼 것이다,
그래서 선택한 것이 바로
Node.js
앞으로 node.js에 대해 공부 해볼 것이다.
(앞으로 작성될 모든 Node.js글은 생활코딩의 WEB2-Node.js를 바탕으로 작성될 예정이다.)
Node.js 란?
Node.js는 Chrome V8 Javascript엔진으로 빌드된 Javascript 런타임이다.
풀어서 설명하면 Chrome 브라우저에서 사용되는 V8 Javascript엔진을 이용하며 빌드한 Javascript 실행환경을 말한다.
여기서 Javascript는 HTML에 자주 사용되는 언어로 HTML로 만들어진 웹페이지의 조작을 위해 사용한다.
보통 Javascript는 HTML조작을 위한 언어였기 때문에 브라우저에는 Javascript를 해석하는 엔진이 포함되어있었다.
2008년 구글에서 V8엔진을 이용하여 크롬을 출시하였다. 이때 V8의 성능이 어마어마했다.
오픈 소스코드로 공개된 V8을 이용하여 기능을 추가하여 새롭게
또한 브라우저가 아닌 다른 환경에서도 Javascript를 사용할 수 있게 해주는 node.js가 출시되었다.
즉, Node.js는 Javascript가 브라우저가 아닌 다른 환경에서도 작동하도록 하는 런타임 환경인 것이다.
Node.js - Single Thread
Node.js는 하나의 쓰레드로 모든 작업을 수행한다. 때문에 메모리 사용량과 시스템 리소스 변화량이 크지 않다.
때문에 대규모 네트워크 시스템을 구성하는데 유리하지만 쓰레드 하나가 무너지면 프로그램 전체에 문제가 생긴다.
멀티 쓰레드의 경우 Context Switching을 통해 구성이 가능하지만 Context Switvhing으로 인해 작업시간이 길어질 수 있다.
따라서 CPU사용률이 높은 프로그램에는 Node.js 사용이 권장되지 않는다.
Node.js - NonBlocking I/O
Node.js는 Single-Thread의 non-blocking I/O 이벤트 기반 비동기 방식을 사용한다.
싱글 쓰레드는 앞서 설명을 했고 뒷 부분에 대한 설명은 다음과 같다.
이벤트 기반 : 시스템에서 특정 이벤트가 발생할때 무엇을 진행할지 정해두고 이를 이벤트 리스터 콜백함수에 저장 후
이벤트가 발생하면 리스너에 저장한 콜백함수를 실행 한 후 이벤트가 끝나면 노드는 다음 이벤트 발생까지 대기한다.
이벤트 루프 : 여러 이벤트가 동시에 발생시 어떤 순서로 콜백함수를 호출할지는 이벤트 루프가 지정한다.
노드는 이벤트 처리를 위한 과정을 반복하기 때문에 이러한 과정을 loop 라고 한다.
NonBlocking I/O : 사용자가 서버에 특정 요청을 보내면 이벤트 루프는 해당 요청을 받고 알맞는 작업을 워커 쓰레드를
생성하여 실행한다. 이후 이벤트 루프는 쓰레드에 대한 응답을 기다리는 것이 아닌 다시 루프로 복귀하여 요청을 기다린다. 즉, 이벤트 루프는 요청이 들어오면 해당 요청에 대한 쓰레드 실행만 담당하고 쓰레드가 작업을 다 마치면
지정된 콜백함수를 이용하여 이벤트 루프에 응답, 이벤트 루프가 이를 실행하여 사용자에게 보여준다.
즉, 요청이 많은 프로그램에서 Node.js는 강한 모습을 보인다.
때문에 SNS또는 채팅 프로그램, 주식 프로그램 등에 사용된다.
Node.js - 내장 HTTP 서버 라이브러리
Node.js는 내장 HTTP 서버 라이브러리를 포함하고 있다. 때문에 웹 서버에서 아파치 같은 별도의 소프트웨어 없이 웹 서버 구동이 가능한다. 이러한 점은 웹 서버 동작에 있어 많은 자유도를 가지게 해준다.
여기까지 Node.js의 개념과 특징을 알아보았다.
그럼 Node.js를 이용해 웹 서버로 구동하는 방법을 알아보자.
앞서 웹 기초 공부#1~5에서 만든 웹 사이트 예제를 계속 사용할 것이다.
해당 예제 파일들이 담긴 디렉터리에 main.js라는 파일을 만들고 다음과 같은 코드를 작성후 저장해보자.
var http = require('http');
var fs = require('fs');
var app = http.createServer(function(request,response){
var url = request.url;
if(request.url == '/'){
url = '/index.html';
}
if(request.url == '/favicon.ico'){
response.writeHead(404);
response.end();
return;
}
response.writeHead(200);
response.end(fs.readFileSync(__dirname + url));
});
app.listen(3000);
이후 터미널을 열고 해당 디렉터리로 이동하여 node main.js 명령을 실행해보자.
실행 후 localhost:3000으로 접속하면 웹 서버가 작동되어 웹 사이트에 접근이 가능함을 볼 수 있다.
지금 우리의 상태에서는 위의 코드가 이해가 안간다. 필자도 현재는 이해가 안간다.
하지만 앞으로 알아가 볼것이고 자유자재로 다룰 수 있도록 변할 것이다.
아무튼 잠깐 코드의 특정 부분을 살펴보자.
response.end(fs.readFileSync(__dirname + url));
아무 것도 모르긴 하지만 출력 명령인 console.log();는 알기에 위 코드의 __dirname + url 부분을 출력해보자.
위와 같이 출력되는 이유는 __dirname + url이 출력값을 가지기 떄문이다.
또한 출력값의 D:\Lluvia\nodejs\는 main.js 파일이 있는 위치이며
index.html은 사용자의 요청에 따라 Node.js가 해당 파일을 전달 했다는 의미이다.
이해가 안가는게 당연하다. 쉽게 생각하자.
아마 다른 웹 페이지에 접속하면 해당 출력값이 바뀌게 될것이다. 다음과 같이 말이다.
따라서 우리는 __dirname + url이 가리키는 파일을 만들것이고
fs.readFileSync()라는 Node.js의 기능을 이용하여 해당 파일을 읽어내고
respond.end()로 출력하는 과정을 그 방법을 배울 것이다.
이는 우리가 어떤 코드를 사용하느냐에 따라 사용자에 전송되는 데이터가 변한다는 것이다.
이러한 부분은 아파치 같은 웹 서버는 불가능 하지만 Node.js나 php, Python - Django는 가능한 기능이다.
즉, 프로그래밍 적으로 사용자에게 전송할 데이터를 생성하는 것이 가능한 점이 Node.js가 가진 힘이다.
앞으로는 Javascript의 문법과 Node.js의 사용법, 웹 에플리케이션을 만드는 방법을 알아볼것이다.
긴글 읽어주셔서 감사합니다.
<정보 출처>
생활코딩_WEB_WEB2:Node.js - 웹서버 만들기
https://opentutorials.org/course/3332/21032
[개발 기본 지식] Node.js 란?
https://velog.io/@remon/%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D-Node.js%EB%9E%80
[Node.js] Node.js 소개와 특징 및 작동 원리
https://velog.io/@deannn/Node.js-Node.js%EC%9D%98-%EC%86%8C%EA%B0%9C%EC%99%80-%ED%8A%B9%EC%A7%95
[Node.js] 개념 이해하기
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/
'보안 > 웹 해킹' 카테고리의 다른 글
웹 기초 공부 #8 - Node.js / Application (0) | 2023.11.01 |
---|---|
웹 기초 공부 #7 - Node.js / Javascript (0) | 2023.09.25 |
웹 기초 공부 #5 (0) | 2023.09.18 |
웹 기초 공부 #4 (0) | 2023.09.13 |
웹 기초 공부 #3 (0) | 2023.09.11 |