런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
기존에는 자바스크립트 프로그램을 인터넷 브라우저 위에서만 실행할 수 있었다.
하지만 구글이 V8 엔진을 사용하여 크롬을 출시하자 Nodejs가 탄생했다.
Nodejs는 V8과 더불어 libuv라는 라이브러리를 사용한다.
이 libuv 라이브러리는 Nodejs의 특성인 이벤트 디반, 논블로킹 I/O모델을 구현하고 있다. 이 덕분에 Nodejs는
" 가볍고 효율적이다! "
이벤트 기반 : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
미리 이벤트 리스너를 만들어두고 특정 이벤트가 발생하면 이벤트 리스너에 등록한 콜백함수를 실행해 이벤트 루프를 통해 콜백 처리 순서를 관리한다.
발생한 이벤트가 없거나 이벤트를 다 처리하면 node는 다음 이벤트가 발생할 때까지 대기한다.
ex) 버튼을 누르면 경고 창을 띄우도록 설정한다고 했을 때,
클릭 이벤트 리스너에 경고창을 띄우는 콜백함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백 함수가 실행돼 경고 창이 뜨게 된다.
이벤트 루프에 대해 간략히 짚고 넘어가면,
노드는 코드를 읽을 때 맨 위부터 한줄씩 실행한다.
함수 호출 부분을 발견했다면 호출한 함수를 호출 스택에 넣는다.
실제 실행될 때에는 호출된 순서와 반대로 실행이 완료된다.
➕ 태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간이다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 부른다.
➕ 백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳이다.
이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.
오래 걸리는 함수를 백그라운드로 보내 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오길 기다리는 방식이다.
" 이 방식이 논블로킹 방식이다! "
블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있다.
하지만 싱글스레드라는 한계 때문에 현제 노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있는 I/O 작업이 주로 시간적 이득을 본다.
여기서 말하는 I/O 작업?
파일 시스템 접근, 네트워크 요청 같은 작업 등
setTimeout()
: 코드를 논블로킹으로 만들기 위해 주로 사용하는 기법동기와 비동기, 블로킹과 논블로킹
차이 ex) readFile과 readFileSync
➡️ 비동기-논블로킹 방식은 호출한 함수가 바로 return 되어 다음 작업으로 넘어가고, 백그라운드 작업 완료 여부는 신경쓰지 않고 나중에 백그라운드가 알림을 줄 때 처리한다.
어떤 작업을 다른 객체에 맡기고, 내 할일을 하다가 다른 객체가 작업을 마치면 call back!
콜백지옥?
비동기 방식으로 하되, 순서를 유지하고 싶을 때 일어나는 일...
자바스크립트 비동기 처리에 사용되는 객체이며, 내부적인 예외 처리 구조 기능을 가진다.
Promise 코드를 일자로 폈다고 생각하자!
에러 처리를 위해 await를 try catch문으로 감싼다.
async function 함수명() {
await 비동기_처리_메서드_명();
}
자바스크립트와 노드에서 논블로킹이 중요한 이유는 노드는 싱글스레드이기 때문이다!
한번에 한 가지 일만 처리가 가능하므로 어떤 작업에서 블로킹이 발생하면 다음 일을 처리할 수 없기 때문이다. (CPU 코어를 하나만 사용한다.)
멀티스레드는 작업의 개수만큼 스레드가 많아지기 때문에 서버 과부하 가능성이 있다.
노드는 싱글 스레드 여러개를 사용해 멀티프로세싱 기능을 한다.
(pm2를 통해 멀티프로세싱 구현 가능)
" Node.js는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 적합하다! "
HTTP : 인터넷에서 데이터를 주고 받을 수 있는 프로토콜
HTTP 모듈은 노드에서 가장 기본적인 웹 모듈이며 웹서버뿐만 아니라 클라이언트 생성하는 것과 관련된 모든 기능을 담당한다.
네트워크 기능을 담당하는, 서버를 위한 필수 모듈!
Nodejs의 웹서버 프레임워크이다.
express 패키지를 호출해서 app 변수에 담는 형식으로 사용한다.
URI 및 특정한 HTTP 요청메소드인 특정 엔드포인트에 대한 클라이언트 요청에
애플리케이션이 응답하는 방법을 결정한다.
클라이언트에게 온 요청을 보내기 위해 응답하려는 중간에 목적에 맞게 처리하는 것이다.
Nodejs 에서 데이터 베이스를 연동할 때, 객체와 테이블을 매핑해주는 ORM인 sequelize 모듈을 통하여 특정 DB에 종속되지 않고 객체의 메서드를 통해 쿼리를 조작하는 기능 또한 제공 해주어 SQL 문법을 모르더라도 데이터베이스 조작을 가능하게 한다.
객체와 관계형 데이터 베이스의 데이터를 자동으로 매핑해주는 것.
sequelize는 자바스크립트 객체와 데이터베이스의 관계를 매핑해준다.
app.js 에서 sequelize.sync()
해야한다.
참고로 sequelize는 Promise 문법이 내부적으로 동작하기 때문에 쿼리가 잘 수행됐으면
then() 메서드가 호출된다.