[Node.js] Node.js zip

✨New Wisdom✨·2020년 9월 20일
0

📗 Nodejs 📗

목록 보기
15/20
post-thumbnail

About Node.js

1. 자바스크립트 런타임

런타임 : 특정 언어로 만든 프로그램들을 실행할 수 있는 환경

기존에는 자바스크립트 프로그램을 인터넷 브라우저 위에서만 실행할 수 있었다.
하지만 구글이 V8 엔진을 사용하여 크롬을 출시하자 Nodejs가 탄생했다.

Nodejs는 V8과 더불어 libuv라는 라이브러리를 사용한다.
이 libuv 라이브러리는 Nodejs의 특성인 이벤트 디반, 논블로킹 I/O모델을 구현하고 있다. 이 덕분에 Nodejs는
" 가볍고 효율적이다! "

2. 이벤트 기반

이벤트 기반 : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

미리 이벤트 리스너를 만들어두고 특정 이벤트가 발생하면 이벤트 리스너에 등록한 콜백함수를 실행해 이벤트 루프를 통해 콜백 처리 순서를 관리한다.
발생한 이벤트가 없거나 이벤트를 다 처리하면 node는 다음 이벤트가 발생할 때까지 대기한다.

ex) 버튼을 누르면 경고 창을 띄우도록 설정한다고 했을 때,
클릭 이벤트 리스너에 경고창을 띄우는 콜백함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백 함수가 실행돼 경고 창이 뜨게 된다.

이벤트 루프에 대해 간략히 짚고 넘어가면,
노드는 코드를 읽을 때 맨 위부터 한줄씩 실행한다.
함수 호출 부분을 발견했다면 호출한 함수를 호출 스택에 넣는다.
실제 실행될 때에는 호출된 순서와 반대로 실행이 완료된다.

➕ 태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간이다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 부른다.
➕ 백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳이다.

3. 논블로킹 I/O

이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.
오래 걸리는 함수를 백그라운드로 보내 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오길 기다리는 방식이다.
" 이 방식이 논블로킹 방식이다! "

블로킹보다 논블로킹 방식이 같은 작업을 더 짧은 시간 동안 처리할 수 있다.
하지만 싱글스레드라는 한계 때문에 현제 노드 프로세스 외의 다른 컴퓨팅 자원을 사용할 수 있는 I/O 작업이 주로 시간적 이득을 본다.

여기서 말하는 I/O 작업?
파일 시스템 접근, 네트워크 요청 같은 작업 등

  • setTimeout() : 코드를 논블로킹으로 만들기 위해 주로 사용하는 기법

동기와 비동기, 블로킹과 논블로킹

  • 동기와 비동기 : 함수가 바로 return되는지 여부
  • 블로킹과 논블로킹 : 백그라운드 작업 완료 여부

차이 ex) readFile과 readFileSync

➡️ 비동기-논블로킹 방식은 호출한 함수가 바로 return 되어 다음 작업으로 넘어가고, 백그라운드 작업 완료 여부는 신경쓰지 않고 나중에 백그라운드가 알림을 줄 때 처리한다.

Callback

어떤 작업을 다른 객체에 맡기고, 내 할일을 하다가 다른 객체가 작업을 마치면 call back!
콜백지옥?
비동기 방식으로 하되, 순서를 유지하고 싶을 때 일어나는 일...

Promise

자바스크립트 비동기 처리에 사용되는 객체이며, 내부적인 예외 처리 구조 기능을 가진다.

  • resolve(성공) 시에는 then, reject(실패) 시에는 catch가 실행된다.

async / await

Promise 코드를 일자로 폈다고 생각하자!
에러 처리를 위해 await를 try catch문으로 감싼다.

async function 함수명() {
  await 비동기_처리_메서드_명();
}
  • await는 async 안에서만 사용이 가능
  • async 함수는 Promise를 리턴한다.
  • 예외 처리는 try catch 문으로 해결

4. 싱글 스레드

자바스크립트와 노드에서 논블로킹이 중요한 이유는 노드는 싱글스레드이기 때문이다!
한번에 한 가지 일만 처리가 가능하므로 어떤 작업에서 블로킹이 발생하면 다음 일을 처리할 수 없기 때문이다. (CPU 코어를 하나만 사용한다.)
멀티스레드는 작업의 개수만큼 스레드가 많아지기 때문에 서버 과부하 가능성이 있다.
노드는 싱글 스레드 여러개를 사용해 멀티프로세싱 기능을 한다.
(pm2를 통해 멀티프로세싱 구현 가능)

  • 프로세스 : 운영체제에서 할당하는 작업의 단위. 프로세스 간에는 자원을 공유하지 않는다.
  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위. 하나의 프로세스는 여러개의 스레드를 가질 수 있다. 서로 같은 메모리에 접근 가능.

Node.js의 장점

장점

  • 멀티스레드 방식에 비해 컴퓨터 자원을 적게 사용
  • I/O 작업이 많은 서버로 적합
  • 멀티 스레드 방식보다 쉬움
  • 웹 서버가 내장되어 있음
  • JSON 형식과 호환하기 쉬움

단점

  • 싱글 스레드라서 CPU 코어를 하나만 사용
  • CPU 작업이 많은 서버로는 부적합
  • 하나뿐인 스레드가 멈추지 않도록 관리

" Node.js는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 적합하다! "


노드 기능

HTTP 모듈

HTTP : 인터넷에서 데이터를 주고 받을 수 있는 프로토콜
HTTP 모듈은 노드에서 가장 기본적인 웹 모듈이며 웹서버뿐만 아니라 클라이언트 생성하는 것과 관련된 모든 기능을 담당한다.
네트워크 기능을 담당하는, 서버를 위한 필수 모듈!

Express

Nodejs의 웹서버 프레임워크이다.
express 패키지를 호출해서 app 변수에 담는 형식으로 사용한다.

  • packae.json : 프로젝트의 이름, 버전, 의존 패키지 리스트 등의 정보를 담고 있다.
    model 폴더를 생성해서 모델을 관리하고 router 부분의 코드를 잘 만지면 controller로 바뀌어
    MVC 패턴을 만들 수 있다.

Routing

URI 및 특정한 HTTP 요청메소드인 특정 엔드포인트에 대한 클라이언트 요청에
애플리케이션이 응답하는 방법을 결정한다.

Middleware

클라이언트에게 온 요청을 보내기 위해 응답하려는 중간에 목적에 맞게 처리하는 것이다.

Sequelize

Nodejs 에서 데이터 베이스를 연동할 때, 객체와 테이블을 매핑해주는 ORM인 sequelize 모듈을 통하여 특정 DB에 종속되지 않고 객체의 메서드를 통해 쿼리를 조작하는 기능 또한 제공 해주어 SQL 문법을 모르더라도 데이터베이스 조작을 가능하게 한다.

ORM (Object Relational Mapping)

객체와 관계형 데이터 베이스의 데이터를 자동으로 매핑해주는 것.
sequelize는 자바스크립트 객체와 데이터베이스의 관계를 매핑해준다.

  • 장점 : 빠른 개발이 가능하고 생산성이 좋아진다.
  • 코드가 줄고 가독성이 높아진다.
  • 코드 재사용이 가능해 유지보수도 편리하다.

테이블 채우기

  • sequelize.define(객체이름, 테이블정의, 테이블 설정)

관계 설정

  • 1 : 1 관계 - hasOne, belongsTo
  • 1 : N 관계 - hasMany, belongsTo
  • N : M 관계 - belongsToMany

테이블 생성

app.js 에서 sequelize.sync() 해야한다.

Create

  • create() : 인자로 테이블에 추가할 데이터들을 객체로 정의하여 전달한다.

참고로 sequelize는 Promise 문법이 내부적으로 동작하기 때문에 쿼리가 잘 수행됐으면
then() 메서드가 호출된다.

Read

  • findOne() 이나 findAll() 로 data select 한다. 여러 옵션 지정 가능하다.

update

  • update() : 첫 번째 인자는 수정할 값들을 적고, 두 번째 인자는 조건을 명시한다.

Delete

  • destroy() : where 조건으로 어떤 값을 삭제할 지 명시한다.
profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/

0개의 댓글