Node.js 서버를 위해 만들어진 모듈 시스템이다. 모듈이란 대개 클래스 하나 혹은 복수의 함수로 이루어진다.
서로 가르키는 객체가 같다. 하지만 원본은 module.exports
이다. 그러므로 export
의 참조를 바꾸면 안된다!
module.exports === exports; // true
exports = { key: 'value' }; // exports는 더 이상 module.exports를 참조하지 않는다!
module.exports === exports; // false
exports.newValue = 3; // 프로퍼티를 추가하는 방식으로 진행되어야 한다.
둘을 혼용하여 사용하지 않도록 한다.
// 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
에 저장된다.)
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가 출력된다.
express는 server framework이다. 기존 내장 모듈인 http를 사용하는 것보다 더 빠르고 쉽게 서버를 작성할 수 있게 해준다.
요청에 대한 응답을 수행하기 전까지 중간에서 처리하는 과정이다.
메서드와 url로 분기하는 것을 의미한다. express의 router
객체를 이용하여 url을 파일별로 분리하여 관리할 수 있다.
이번 스프린트는 불친절했다. 이유는 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
이 포함되어야만 하기 때문이다. 이를 포함하지 않으면 에러가 발생한다.