-
Node.js | javascript] 이벤트 기반 코드 실행 | Event-DrivenNode.js 2023. 12. 4. 13:39
자바스크립트 코드는 작성된 순서대로 실행되지 않는다.
이벤트 기반 코드 실행?
- 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
- 이벤트 예시 : 클릭, 네트워크 요청 등
이전에 작성했던 코드를 잠시 보자
if (url === "/message" && method === "POST") { const body = []; req.on("data", (chunk) => { console.log(chunk); body.push(chunk); }); req.on("end", () => { const parsedBody = Buffer.concat(body).toString(); // console.log(parsedBody); const message = parsedBody.split('=')[1]; fs.writeFileSync("message.txt", message); // A }); res.statusCode = 302; // B res.setHeader("Location", "/"); return res.end(); }
A 코드는 B 이후의 코드들보다도 나중에 실행된다.
심지어 응답을 발송한 뒤에 실행된다.
응답 발송은 이벤트 리스너 실행이 끝났다는 의미가 아니다.
응답이 발송된 후에도 이벤트 리스너는 계속 실행된다.
따라서 응답에 영향을 줄 수 있는 어떤 처리를 이벤트 리스너에 하는 건 잘못된 설정이다.
노드js는 함수를 함수 안에 넣으안에 넣은 함수를 나중에 실행한다. 이를 비동기식(asychronous) 실행라고 한다.
위 코드를 만나면 노드는 내부적으로 이벤트 리스너를 추가한다.
노드는 모든 이벤트를 내부에서 별도로 관리한다.(이벤트 루프)
- req.on('end', () => {...}
- end 이벤트와 화살표 함수로 작성된 이벤트 리스너로 구성
- 위 행을 만나면 노드는 이벤트 리스너에 콜백 함수를 등록한 뒤, 그 다음 행을 읽는다.
- 위 코드에서는 res.statusCode =302;를 읽는 것이다.
- return res.end()까지 읽고나서
- 노드는 요청 분석을 완료한 후(여기서는 end 이벤트 분석을 완료한 후)
- 이벤트와 연결된 콜백함수를 찾아 호출한다.
왜 이렇게 하지?
노드는 싱글 스레드 기반, 즉 호출 스택을 하나 사용하고 여기서 함수들이 실행된다.
순차적으로 모든 행을 읽어들이다가 작업이 오래 걸리는 행을 만나면
해당 작업이 끝날 때까지 다른 일을 수행할 수 없고 기다리게 된다.
이는 서버를 느리게 만들고, 해당 작업이 끝나기 전에 들어오는 다른 요청들을 포함한 아무 것도 처리할 수 없게 된다.
참고자료 : https://node-js.tistory.com/27
위 자료에서 복사
- 이벤트 루프 : 이벤트 발생 시 콜백 함수를 관리하고 호출된 콜백 함수의 실행 순서를 결정합니다.
- 태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간입니다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라 도고 불립니다.
- 백그라운드: 타이머나 i/o작업 콜백 또는 이벤트 리스너들이 대기하는 곳입니다.
'Node.js' 카테고리의 다른 글
npm 패키지 설정하기 (1) 2023.12.04 Node.js] 모듈 시스템 사용하기 (1) 2023.12.04 Node.js] 라우터 요청 : url 루트의 요청에 따라 기능이 달라지는 간단한 서버 (0) 2023.12.01 Node.js] 서버의 요청 및 응답 확인하기 (1) 2023.11.30 Node.js] 서버 만들기 : http 모듈, require, listen (0) 2023.11.29