node 명령어를 이용해 js 파일을 실행시키면, 해당 스크립트를 실행시키게 된다. 이 과정에서 코드를 분석하고 변수와 함수에 대한 메모리 공간을 미리 받아준다. (호이스팅 잘 정리해놓았어요)
그리고 이 NodeJS는 event-loop이라는 특별한 성질 때문에, eventListener가 있는 한 절대로 서버가 꺼지지 않고 해당 event의 요청을 감지하게 된다.
예를 들어 저번에 작성했던 코드 를 보면,
const http = require('http')
const server = http.createServer((req,res) => {
console.log(req);
})
server.listen(3000);
3000번 포트로 들어오는 요청을 서버가 감지하고, 요청이 들어오면 안에 있는 callback이 실행된다. eventListener의 성격이 listen 메소드이고, 두번째 인자로 주는 콜백이 (req,res) => {} 인 셈이다. 해당 리스너가 없어질 때까지 스크립트는 종료되지 않는다.
그래서 NodeJS 가 event-driven이라고 얘기하는 이유도, 이 event loop의 성질 때문에 그러하다.
데이터베이스에 접근할 때에도 데이터 요청에 대한 메시지를 보내고 실행해야 하는 함수를 등록하게 되어 event loop을 생성하게 된다.
NodeJS가 event loop 방식을 채택하게 된 것은 다름 아닌 NodeJS는 싱글 스레드 JS를 실행하기 때문이다. 수 천, 수 만의 요청을 처리해야 하는데, 서버가 멈춰있는 도중 들어올 때마다 실행하기를 반복한다면 분명 처리 속도에 문제가 생길 것이다. 그래서 event loop를 통해 계속 작동하며 해당 이벤트를 처리하게 된다.
싱글 스레드는 말 그대로 한 프로세스에 한 스레드만을 이용한다는 것인데, 그러므로 복수의 요청이 들어오면 모두 동기적으로 처리할 수 밖에 없다. 그렇다면 멀티 쓰레드가 좋은가? 각자의 장단점이 있다. 하지만 일단 NodeJS는 싱글 쓰레드라고 하더라도 그 속도가 매우 빠르다.
만약 그냥 event loop을 중단시키고 싶다면
process.exit();
해당 메소드를 사용한다.
const http = require('http')
const server = http.createServer((req,res) => {
console.log(req);
process.exit();
})
server.listen(3000);
다음 코드는 localhost:3000으로 접속할 때 해당 요청을 콘솔로 보여주며 서버 실행을 멈추는 코드이다. 하지만 사실상 process.exit()를 쓸 일은 없을 것이다.(서버를 멈추는 일이 있나? ㅋㅋ)