면접을 다녀왔고, 이론들에대해서 정리하고 머릿속에 정립하는시간이 필요함을 느꼈다.
공부를 진행하면서 복습을 하고, 그걸 바탕으로 글을 작성하고자한다.
HTTP 메서드
1. 클라이언트와 서버와의 관계

: 서버와 클라이언트가 소통을 하기 위해서 보통 http를 사용한다.
2. REST(Reepresentational State Transfer)
: 자원(Resource) - URL / 행위(Verb) : HTTP Method / 표현(Representiations)
HTTP가 설계의 우수성에 비해 제대로 사용되지 못하자, 활용가능한 아키텍처로 rest발표함. REST를 지키면서 행위를 전달하는 방법이라 생각하면 된다.
3.

주요 method 정리
GET : 리소스를 조회할때 사용. query를 사용해서 서버에 데이터를 전송한다. body에 데이터 전달가능하나, 지원하는곳이 많지 않아서 권장되진않는다.
POST :요청 데이터를 처리하거나 등록에 이용한다. 주로 등록에 사용된다. message body를 통해서 서버로 요청 데이터를 전달한다. POST는 완벽하게 정해진 부분이 없기 때문에 리소스마다 POST에 대한 처리를 정리해 두어야한다.
PUT : 리소스가 있으면 해당 리소스를 완전히 대체하고, 해당 리소스가 없으면 생성한다.
PATCH: 리소스 부분 변경할때 사용한다. PUT 방식은 전체를 대체하는 방식이기 때문에 PATCH로 부분 변경을 진행한다. PATCH지원이 안되는경우 POST를 사용.
DELETE : 리소스를 제거할때 사용한다.
Event Loop

(참고 : https://www.korecmblog.com/node-js-event-loop/)
이벤트 루프는 node.js가 여러 비동기 작업을 관리하기 위한 구현체 이다.
file.readFile('test.txt', callback) 과 같은 비동기 작업들을 모아서 관리하고 순서대로 실행할 수 있게 해주는 도구이다. 위의 그림과 같이 구성되어있다.
이벤트 루프는 총 6개의 Phase로 구성되어있다. node.js는 순서대로 phase를 방문하면서 큐에 쌓인 작업을 하나씩 실행한다. (각 phase는 큐를 관리한다. ) phase의 큐에 담긴작업을 모두실행하거나 시스템의 실행한도에 다다르면 node.js는 다음 phase로 넘어간다. 이벤트 루프가 살아있는 한 node.js는 이벤트 루프를 반복한다.
Stream and Buffer
Buffer
Node.js는 요청이 얼마나 크고 복잡한지 미리 알지 못한다. 하지만 데이터를 미리 다룰 수 있다. 다만 코드를 사용해서 chunk를 마음대로 다룰순없다. 대신 체계화하기 위해서 buffer를 사용한다. (어디서 무엇을 처리하는지 쉽게 알기위함.) 버퍼는 여러개의 청크를 보유하고 파싱이( parsing ) 끝나기 전에 작업할 수 있도록 한다.
const parsedBody = Buffer.concat(body);.toString();
concat(배열 등을 함쳐준다.) 버퍼는 문자열로 전환된다. 그리고 콘솔로 parsedBody를 확인하면 우리가 확인할수없는 청크형태의 Buffer가 뜬다.
어? 버퍼는 그럼 노드를 위한 청크들의 안내서..아, 버퍼는 청크들이 모이게 놔둬서 데이터 처리
스트림은 concat으로 청크들을 합친후 문자열로 아.. 오키.. 그러나 비동기식이다. 그래서 에러처리를 잘해줘야함.
(비동기 : node.js는 함수를 함수안에 넣었을때, 안에 넣은 함수를 나중에 실행한다. 이를 비동기식으로 부른다. )
Stream
버퍼가 너무 크기 때문에 buffering 이라는 말처럼 오래 기다려야하기 때문에 중간에 보내는 stream의 역할이 필요하다.
버퍼가 진행되는동안 기다리기만 할수없으니 stream이 중간에 송신할수있게 해주는것이다.
또한 비동기식이기때문에 에러처리를 잘해주어야한다.
(비동기 : node.js는 함수를 함수안에 넣었을때, 안에 넣은 함수를 나중에 실행한다. 이를 비동기식으로 부른다.)
Blocking및 None Blocking
Blocking
Javascript 실행을 위해서 js아닌 작업이 완료될때까지 기다려야하는 상황. 이벤트 루프가 블로킹 작업을 하는동안 js실행을 계속할 수 없기때문이다. 일부 method는 같은 작업을 하는 blocking method도 가지는 이름 마지막에 Sync가 붙는다. 동기로 실행된다.
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 됩니다.
블로킹의 코드가 더 간단해 보이지만 두번째줄에서 전체 파일을 읽을때까지 다른js의 실행이 블로킹 되는 단점이 있다. 동기 예제에서 오류가 발생하면 반드시 처리해줘야하고 아니면 프로세스가 죽을것이다.
( 나를 위한 참고 : Sync라는 코드가 붙으면 블로킹! 이런 동기 방식자체를 많이 사용하진 않는다. 오류가 났을때, 힘드니까,.,.)
None Blocking
논블로킹 메서드는 비동기로 실행된다.
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
moreWork(); // console.log 이전에 실행될 것입니다.
fs.readFIle()이 논플로킹이므로 js를 계속 실행하고 moreWork()가 먼저 호출될것이다. 파일읽기가 완료되기를 기다리지 않고 moreWork()를 실행할 수 있도록 한것은 높은 스루풋을 가능하게한것이다.
(참고 : https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking/)