2020.07.07(화) Sprint 7. Server & Node

Park, Jinyong·2020년 7월 7일
1

Today I Learned

commonJS

Node.js 서버를 위해 만들어진 모듈 시스템이다. 모듈이란 대개 클래스 하나 혹은 복수의 함수로 이루어진다.

module.exports vs exports

서로 가르키는 객체가 같다. 하지만 원본은 module.exports이다. 그러므로 export의 참조를 바꾸면 안된다!

module.exports === exports; // true

exports = { key: 'value' }; // exports는 더 이상 module.exports를 참조하지 않는다!

module.exports === exports; // false
exports.newValue = 3; // 프로퍼티를 추가하는 방식으로 진행되어야 한다.

둘을 혼용하여 사용하지 않도록 한다.

동일한 파일을 require하면 한 번만 실행된다.

// subject.js
const mod1 = require('./lib/my-module.js');
const mod2 = require('./lib/my-module.js');
// lib/my-module.js
console.log('Loading module!');

여기서 ./lib/my-module.js는 두 번 사용하지만, 불러오는 건 딱 한 번만 불러오기 때문에, Loading module!은 한 번만 출력된다. (첫 호출 시, require.cache에 저장된다.)

Event Loop 참고 1 참고 2

console.log('A');

setTimeout(console.log, 1000, 'B');

superLongComputation(); // 5초를 대기하는 동기 함수 => 5초 동안 콜 스택에 머문다.

console.log('C');

A -> C -> B

위의 경우, A 출력 후 B 출력 함수가 WebAPI로 넘어간다. 그리고 superLongComputation 함수가 실행되어 5초간 대기한다. 그 와중에 B 출력 함수는 타이머가 종료되고 작업 큐로 넘어간다. 그리고 동기 함수인 'C'를 출력한다. 동기 함수가 모두 실행되어 콜 스택이 비워지면 이벤트 루프가 실행되고 작업 큐에 있던 B 출력 함수가 콜 스택으로 넘어오고 B가 출력된다.

http 모듈로 작성했던 코드를 express 프레임워크로 작성해보았다.

Express

express는 server framework이다. 기존 내장 모듈인 http를 사용하는 것보다 더 빠르고 쉽게 서버를 작성할 수 있게 해준다.

Middleware

요청에 대한 응답을 수행하기 전까지 중간에서 처리하는 과정이다.

Routing

메서드와 url로 분기하는 것을 의미한다. express의 router 객체를 이용하여 url을 파일별로 분리하여 관리할 수 있다.

Advanced challenge를 완료했다.

fs 모듈을 활용하여 서버를 재시작하더라도 데이터가 남아있도록 구현했다.

cors, body-parser를 미들웨어에서 처리하여 사용하였다.

http://127.0.0.1:3000에 접근하면 index.html이 실행되도록 변경했다.

socket.io를 이용하여 auto fetching 기능을 구현했다.(setInterval 대신)


이번 스프린트는 불친절했다. 이유는 API 문서를 찾고 읽는 법을 배우기 위해서란다. express를 어떻게 사용하고 어떤 메서드가 어떤 의미인지 찾고 테스트하는데만 2시간을 써버렸지만, 구현은 http 모듈을 사용했을 때보다 훨씬 간단해져서 금방 해냈다. 오랜만에 Advanced Challenges가 있어서 이를 구현하는데 대부분의 시간을 보냈다. socket.io에선 약간 허술한 부분도 있지만 어쨋든 동작을 하니까 다음에 사용할 일이 있다면 그 때 다시 살펴보기로 했다.

어제 발생했던 의문에 대해서는 help-desk에 문의하여 궁금증을 해소했다. Preflight request에 대한 응답의 헤더의 access-control-allow-methods가 빈 문자열이라도 GET, POST 메서드를 사용할 수 있었는데, 이는 access-control-allow-methods가 명시되어 있지 않더라도 기본적으로 HEAD, GET, POST 메서드를 허용하기 때문이다.

또 다른 의문은 본 요청에 대한 응답의 헤더에 왜 다시 CORS용 헤더를 넣어야하는지에 관한 의문이었는데, MDN을 확인해본 결과 본 요청에 대한 응답의 헤더에는 반드시 Access-Control-Allow-Origin이 포함되어야만 하기 때문이다. 이를 포함하지 않으면 에러가 발생한다.

0개의 댓글