인턴하면서 공부했던 기록들을 차례 차례 옮겨 적을 예정이다.
우선 첫 날 했던 Node.js 부터 express 까지.
구글 크롬의 자바스크립트 엔진 (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 일 뿐이다.
웹서버에서 주로 이루어지는 일은 서버에서 파일을 연 후 클라이언트에게 내용을 반환해주는 형식.
Node.js가 파일 요청을 실행하는 순서
1. 컴퓨터의 파일 시스템으로 일을 보낸다.
2. 다음 요청을 처리할 준비를 한다.
3. 파일 시스템이 열리고 파일을 읽을 대, 서버는 클라이언트에게 내용들을 반환한다.
템플릿 엔진: 탬플릿을 읽어 엔진의 문법과 설정에 따라 파일을 HTML형식으로 변환시키는 모듈
<% %>를 사용하여 서버의 데이터를 사용하거나 코드를 실행시킬 수 있음.
<%자바스크립트 코드%>
<%출력 할 자바스크립트 객체%>
REST: Representational State Transfer, www와 같은 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처 중 하나의 형식
REST 서버는 클라이언트로 하여금 HTTP 프로토콜을 사용해 서버의 정보에 접근 및 변경을 가능케 함. 정보는 Text, XML, JSON 등, 주로 JSON 사용.
HTTP Method
라우팅: 애플리케이션 엔드 포인트(URI)의 정의, 그리고 URI가 클라이언트 요청에 응답하는 방식.
요청 메소드와의 조합을 통해, 요청이 이루어질 수 있는 엔드포인트 정의.
여러 콜백 함수를 제공하여 요청을 처리할 수 있음. 차이점은 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('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 클래스를 사용하면 모듈식 마운팅 가능한 핸들러를 작성할 수 있음
Router 인스턴스는 완전한 미들웨어이자 라우팅 시스템, 미니앱이라 불리는 경우가 많다.
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;
var birds = require('./birds');
app.use('/birds', birds);
자바스크립트에서는 함수는 일급 객체. 함수는 Object 타입이며 다른 일급객체와 똑같이 사용된다. function 자체가 객체이므로 변수안에 담을 수도 있고, 인수로서 다른 함수에 전달도 가능하고, 함수에서 만들어 질 수도 있고 반환 될 수도 있다.
Callback Function: 특정 함수에 매개변수로서 전달된 함수
그 함수를 전달받은 함수 안에서 호출됨.
Callback Function을 사용해 프로그램 흐름을 끊지 않음으로서, Non-Blocking 코드를 사용하는 서버는 Blocking 코드를 사용하는 서버보다 더 많은 양의 요청을 처리할 수 있다.
Node.js 기반으로 만들어진 서버가 가동되면, 변수들은 초기화하고, 함수를 선언하고 이벤트가 일어날 때까지 기다림.
Event-Driven 어플리케이션에서는 이벤트를 대기하는 메인 루프가 있고, 이벤트가 감지되었을 시 Callback Function 호출
콜백과의 차이점은 콜백함수는 비동기식 함수에서 결과를 반환될 때 호출되지만, 이벤트 핸들링은 옵저버 패턴에 의해 작동
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