인턴 Study #1. Node.js

beoms96·2020년 5월 28일
1

인턴 공부

목록 보기
1/11
post-thumbnail

인턴하면서 공부했던 기록들을 차례 차례 옮겨 적을 예정이다.
우선 첫 날 했던 Node.js 부터 express 까지.

1. Node.js

소개

구글 크롬의 자바스크립트 엔진 (V8 Engine)에 기반해 만들어진 서버 사이드 플랫폼. 2009년에 Ryan Dahl에 의해 개발됨.

Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다. Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리이기도 합니다.
(출처: https://nodejs.org/ko/)

입문자들의 오해: Node는 웹서버가 아니다. Node 자체로는 아무것도 하지 않음 - 아파치 웹서버처럼 HTML 파일 경로를 지정해주고 서버를 열고 그런 설정이 없다. HTTP 서버를 직접 작성해야 함. (일부 라이브러리의 도움을 받으며) Node.js는 그저 코드를 실행할 수 있는 하나의 방법에 불과한 Javascript Runtime 일 뿐이다.

특징

  • Single-Thread (싱글 스레드) - Node.js는 이벤트 루프와 함께 싱글 스레드 모델을 사용, 이벤트 메커니즘은 서버가 멈추지 않고 반응해주록 해주어 서버의 확장성을 키워줌. 일반적인 웹서버는 요청을 처리하기 위해 제한된 스레드를 생성하지만 Node.js 는 스레드를 한 개만 사용하고 훨씬 많은 처리 가능
  • Non-Blocking: 비동기 I/O 처리, 이벤트 위주 - API가 실행됐을 때 데이터를 반환할 때까지 기다리지 않고 다음 API를 실행한다. 결과값 반환 시, Node.js 의 이벤트 알림 메커니즘을 통해 결과값 받아옴.
  • Asynchronous Programming (비동기 프로그래밍)
  • Memory Efficient (메모리 효율성)
  • 빠른 속도: 구글 크롬의 V8 자바 스크립트 엔진을 사용해 빠른 실행 제공
  • 노 버퍼링: 데이터 버퍼링이 없고, 데이터를 chunk로 출력

처리과정

웹서버에서 주로 이루어지는 일은 서버에서 파일을 연 후 클라이언트에게 내용을 반환해주는 형식.

Node.js가 파일 요청을 실행하는 순서
1. 컴퓨터의 파일 시스템으로 일을 보낸다.
2. 다음 요청을 처리할 준비를 한다.
3. 파일 시스템이 열리고 파일을 읽을 대, 서버는 클라이언트에게 내용들을 반환한다.

Do (할 수 있는 것)

  • 동적 페이지 내용 생성 가능
  • 서버에서 파일들을 만들고, 열고, 읽고, 쓰고, 지우고, 끄는 것이 가능
  • 데이터 수집
  • 데이터베이스 안에 데이터를 추가하고, 지우고, 수정 가능하다.
  • CRUD 가능

사용 분야

  • 입출력이 잦은 어플리케이션
  • 데이터 스트리밍 어플리케이션
  • 데이터를 실시간으로 다루는 어플리케이션
  • JSON API 기반 어플리케이션
  • 싱글페이지 어플리케이션

2. Express.js

개요: Node.js 웹 애플리케이션 프레임워크

API

  • 자유롭게 활용할 수 있는 수많은 HTTP 유틸리티 메소드 및 미들웨어 통해 쉽고 빠르게 강력한 API를 작성할 수 있음.

성능

  • Express는 기본적인 웹 애플리케이션 기능으로 구성된 얇은 계층을 제공

모듈

  • body-parser: POST 데이터 처리
  • express-session: 세션 관리

EJS 템플릿 엔진

  • 템플릿 엔진: 탬플릿을 읽어 엔진의 문법과 설정에 따라 파일을 HTML형식으로 변환시키는 모듈

  • <% %>를 사용하여 서버의 데이터를 사용하거나 코드를 실행시킬 수 있음.
    <%자바스크립트 코드%>
    <%출력 할 자바스크립트 객체%>

RESTful API

  • REST: Representational State Transfer, www와 같은 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처 중 하나의 형식

  • REST 서버는 클라이언트로 하여금 HTTP 프로토콜을 사용해 서버의 정보에 접근 및 변경을 가능케 함. 정보는 Text, XML, JSON 등, 주로 JSON 사용.

HTTP Method

  • GET: 조회
  • PUT: 생성 및 업데이트, 리소스의 위치가 명확히 지정됐을 때.
  • DELETE: 제거
  • POST: 생성, 리소스의 위치를 지정하지 않았을 때

3. Router

정의

라우팅: 애플리케이션 엔드 포인트(URI)의 정의, 그리고 URI가 클라이언트 요청에 응답하는 방식.

라우트 메소드: HTTP 메소드 중 하나로부터 파생, express 클래스의 인스턴스에 연결.

  • get, post, put, head, delte 등 제공

라우트 경로

요청 메소드와의 조합을 통해, 요청이 이루어질 수 있는 엔드포인트 정의.

라우트 핸들러

여러 콜백 함수를 제공하여 요청을 처리할 수 있음. 차이점은 next('route')를 호출하여 나머지 라우트 콜백을 우회할 수도 있다는 점. 이렇게 하면 라우트에 대한 사전 조건 지정 후, 현재의 라우트를 계속할 이유가 없는 경우 제어를 후속 라우트에 전달.

// 2개 이상의 콜백 함수는 하나의 라우트를 처리(next 오브젝트 지정해야함.)
app.get('/example/b', function(req, res, next) {
    console.log('the response will be sent by the next function ...');
    next();
}, function(req, res) {
    res.send('Hello from B!');
});

app.route()

app.route()를 이용하면 라우트 경로에 대해 체인 가능한 라우트 핸들러를 작성할 수 있음. 경로는 한 곳에 지정되어 있으므로, 모듈식 라우트를 작성하면 중복성과 오타가 감소하여 도움이 됨.

app.route('book')
.get(function(req, res) {
    res.send('Get a random book');
})
.post(function(req, res) {
    res.send('Add a book');
})
.put(function(req, res) {
    res.send('Update the book');
});

express.Router

express.Router 클래스를 사용하면 모듈식 마운팅 가능한 핸들러를 작성할 수 있음

Router 인스턴스는 완전한 미들웨어이자 라우팅 시스템, 미니앱이라 불리는 경우가 많다.

  • "birds.js"
var express = require('express');
var router = express.Router();

// middleware that is specific to this router
router.use(function timelog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});
// define the home page route
router.get('/', function(req, res) {
    res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
    res.send('About birds');
});

module.exports = router;
  • "app.js"
var birds = require('./birds');
app.use('/birds', birds);

4. Callback Function

콜백 함수란?

자바스크립트에서는 함수는 일급 객체. 함수는 Object 타입이며 다른 일급객체와 똑같이 사용된다. function 자체가 객체이므로 변수안에 담을 수도 있고, 인수로서 다른 함수에 전달도 가능하고, 함수에서 만들어 질 수도 있고 반환 될 수도 있다.

Callback Function: 특정 함수에 매개변수로서 전달된 함수
그 함수를 전달받은 함수 안에서 호출됨.

장점

Callback Function을 사용해 프로그램 흐름을 끊지 않음으로서, Non-Blocking 코드를 사용하는 서버는 Blocking 코드를 사용하는 서버보다 더 많은 양의 요청을 처리할 수 있다.

5. Event Loop

Node.js 기반으로 만들어진 서버가 가동되면, 변수들은 초기화하고, 함수를 선언하고 이벤트가 일어날 때까지 기다림.
Event-Driven 어플리케이션에서는 이벤트를 대기하는 메인 루프가 있고, 이벤트가 감지되었을 시 Callback Function 호출

콜백과의 차이점은 콜백함수는 비동기식 함수에서 결과를 반환될 때 호출되지만, 이벤트 핸들링은 옵저버 패턴에 의해 작동

  • Event Listeners 함수들이 옵저버 역할

Ex) Event Loop 예제

// events 모듈 사용
var events = require('events');

// EventEmitter 객체 생성
var eventEmitter = new events.EventEmitter();

// event와 EventHandler 를 연동(bind)
// eventName 은 임의로 설정 가능
eventEmitter.on('eventName', eventHandler);

// Event 발생
eventEmitter.emit('eventName');

출처:
Node.JS 공식홈페이지, Express.JS 공식 홈페이지, velopert.com

profile
beoms96 개발 노트

0개의 댓글