잘 들여다보지 않았던 NodeJS 드디어 만났다. 이전에 잠깐 배울때는 이런게 있구나 정도로 훑고 지나갔지 서버 엔진이라는 것을 체감한건 오늘이 처음이다. 처음 접한 느낌은 React만큼이나 생소하지만 HTTP 기본 개념이 조금 깔려있으니 왜 이렇게 동작하는지 감이 아예 없지는 않다. 그렇다고 척척 아는것도 아니고 리액트급 생소함과 문법이 어색해서 고구마 100개 먹었지만 재밌다. 쿡쿡 찔렀을 때 반응오는거도 흥미롭고. 이 녀석도 친해지는게 중요할 것 같다. 수목금토일 쭈욱 달리면 기본기가 조금 손에 잡힐 것 같다.
Chapter 보기 전에 페어시간을 편성해서 뭔가 싶었는데 내용이 어려우니 같이 보라는 의미였구나. 주로 많이 본 페이지는 HTTP 트랜잭션 해부하기 페이지다. 공식 페이지치고 심플한 느낌인데 입문에 필요한 최소한의 내용을 포함하고 있다. 처음 봤을땐 막막함 그 자체였는데 몇시간 보면서 고유명사 뜯어보고 테스트 해보니 알겠다.
첫번째는 흐름을 이해하는데 힘들었다. on
메소드가 생소해서 우선 then
과 비슷하다고 이해했다. 비동기로 데이터를 받았기 때문에 response
역시 해당 흐름속에서 처리하는게 맞았다. 이걸 이해 못해서 한시간 정도 보냈던가. 당연한 것인데.
두번째로는 response
객체를 반환할 때 헤더를 먼저 포함해야 된다는 부분이 생소하고 신기했다. 서버에서 HTTP 헤더까지 신경써야되나? 코드상에도 순서가 중요하다.
response.writeHead(200, defaultCorsHeader);
헤더 추가하고 그 다음 response.end(body)
가 이어진다. 주의: 바디에 데이터 청크를 작성하기 전에 상태 코드와 헤더를 설정해야 합니다. HTTP 응답에서 바디 전에 헤더가 있으므로 이는 이치에 맞습니다.
const getBody = (request, response) => {
// let body = [];
let body = '';
return request
.on('data', chunk => {
body += chunk;
console.log(body);
})
.on('end', () => {
//body = Buffer.concat(body); //.toString();
response.writeHead(200, defaultCorsHeader);
// console.log(request);
if (request.url === '/lower') response.end(body.toLowerCase());
if (request.url === '/upper') response.end(body.toUpperCase());
});
};
우선 NodeJS 서버 개발에 필요한 환경을 구축했다.
디렉토리의 파일이 변경되면 서버를 자동으로 재기동 시켜주는 편리한 모듈.
https://www.npmjs.com/package/nodemon
nodemon --inspect --watch server/ server/basic-server.js
nodemon server/basic-server.js
: 해당 서버 파일을 재기동한다.--inspect
: 디버깅 옵션. 포함하면 크롬 개발자도구에 디버깅 과정이 보인다.--watch <dir>
: 특정 디렉토리 안에 있는 파일이 수정되면 서버를 재기동한다. 기본 옵션은 하위 디렉토리 전체.특정 포트로 웹 클라이언트를 띄워주는 모듈. Web/Was와 비슷한 역할.
https://www.npmjs.com/package/serve
Access-Control-Allow-Origin
옵션에서 넘어가질 못했다. server.listen(PORT, ip, () => {
console.log(`http server listen on localhost:4000, Server start!`);
});
가장 마지막에 배운 부분. 한 때 Javascript 디버깅을 한다고 낑낑대다가 결국 HTML에 포함해서 진행하는 방법밖에 없다고 해서 좌절했던 기억이 난다. NodeJS는 VSCODE 자체로 디버깅 환경을 제공한다. 그 중엔 nodemon까지 있어서 launch.json
파일에 구성을 추가해서 구성하면 더욱 좋다. program
키를 변경해서 나의 서버 파일로 지정만 해주면 거의 끝난다. 어휴 편해라.