<Node.js> 이벤트 기반 코드 실행의 이해

·2024년 4월 26일
0

Node.js

목록 보기
3/4

Event 기반 코드 실행의 이해

Node.js는 이벤트 기반(event-driven)으로 동작합니다. 이것은 Node.js가 특정한 일이 발생했을 때 미리 정해둔 작업을 수행하는 방식인데, 이를 이해하기 위해서는 '파티'나 '생일 파티'와 같은 사건(이벤트)을 생각해 볼 수 있다.

누군가 생일 파티를 열었다고 가정해보자. 생일 파티에는 여러 명의 친구들이 와서 함께 노래를 부르며 춤을 출 것이다.
이때, 생일 파티는 이벤트가 발생하는 곳이며,
친구들이 노래를 불러 춤을 출 때는 이벤트에 연결된 작업이다.

Node.js에서도 비슷한 원리가 적용된다. 예를 들어, 웹 서버를 만들 때, 사용자가 웹 페이지에 접속했을 때의 이벤트를 생각해 볼 수 있겠다.

사용자가 웹 페이지에 접속하는 것은 이벤트(생일 파티)이며,
이에 대한 작업으로는 웹 페이지를 전달하는 것(노래를 부르거나 춤을 추는 것)이 있습니다.

Node.js에서는 이벤트에 대한 작업을 정의할 때, 이벤트 리스너(event listener)를 등록한다.
이벤트 리스너는 특정한 이벤트가 발생했을 때 실행되는 함수이다.

Node.js는 이벤트 리스너를 내부적으로 관리하며, 이벤트가 발생하면 등록된 이벤트 리스너가 실행된다.

따라서 Node.js의 이벤트 기반 코드 실행은 생일 파티에서의 이벤트와 비슷하다.
이벤트가 발생하면 그에 대응하는 작업이 실행된다.

코드로 보는 이해

const server = http.createServer((req, res) => {
req.on('data', (chunk) => {
      console.log(chunk);
      body.push(chunk);
    });
    req.on('end', () => {
      const parsedBody = Buffer.concat(body).toString();
      const message = parsedBody.split('=')[1];
      fs.writeFileSync('message.txt', message);
    });
}
  1. server로 req 이벤트가 들어오면, req에 대한 on 작업이 실행된다.
  2. on 작업 내부 함수인 dataend가 실행된다.
  3. 내부 이벤트 리스너에 따라 코드가 실행될 것이다.

⭐️ 알고 넘어가자.

  • data 이벤트
    클라이언트로부터 데이터를 받을 때 발생하는 이벤트입니다. 이 이벤트가 발생할 때마다, 클라이언트로부터 전달된 데이터의 일부분이 버퍼(chunk) 형태로 제공됩니다. 즉, 요청 본문이 작은 조각(chunk)으로 나누어져 도착하게 됩니다.
  • end 이벤트
    클라이언트로부터의 데이터 송신이 끝났을 때 발생하는 이벤트입니다. 클라이언트가 요청의 모든 데이터를 전송했을 때 이 이벤트가 발생하며, 이때 요청의 데이터 수신이 완료되었다는 것을 알 수 있습니다. 따라서 요청에 대한 작업이 여기서 완료되는 것이 일반적입니다.

발생한 에러 정리

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:405:5)
at ServerResponse.setHeader (node:_http_outgoing:648:11)
at IncomingMessage.
at IncomingMessage.emit (node:events:526:35)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
code: 'ERR_HTTP_HEADERS_SENT'
}

해당 에러는 응답 헤더를 클라이언트에게 전송한 후에 다시 헤더를 설정하려고 하기 때문에 발생한 것임.
HTTP 헤더는 한 번만 설정할 수 있다.

profile
- 배움에는 끝이 없다.

0개의 댓글