https://medium.com/zigbang/nodejs-event-loop%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-16e9290f2b30
Express, Node.js, Event 내의 프로세스를 중심으로 브라우저에 http://localhost:3000/blog/230801.html을 입력한 순간부터 서버로부터 응답을 받을 때까지 무슨 일이 일어나는지 분석해 보겠습니다. 루프, LibUV 및 OS(Linux).
1. 브라우저 요청
브라우저에 URL을 입력하면 URL을 구문 분석하여 3000 포트의 localhost에 HTTP 요청을 보내야 함을 식별합니다.
브라우저는 'http://localhost:3000/blog/230801.html'의 서버에 HTTP GET 요청을 보냅니다.
2. Express(요청 처리)
요청 수신: localhost:3000에서 실행되는 Express 애플리케이션이 HTTP 요청을 수신합니다. Express는 요청을 처리하고 그에 따라 라우팅하는 프레임워크 역할을 합니다.
라우팅: Express는 등록된 경로와 미들웨어를 확인하여 /blog/230801.html 경로와 일치하는 항목을 찾습니다.
/blog/:postId.html에 대한 미들웨어 또는 경로 핸들러가 있는 경우 요청은 해당 핸들러로 전달됩니다.
요청 처리: /blog/:postId.html에 대한 경로 핸들러가 요청을 처리합니다. 여기에는 디스크에서 파일 읽기, 데이터베이스 쿼리 또는 기타 서버 측 논리가 포함될 수 있습니다.
3. Node.js(자바스크립트 런타임)
JavaScript 코드 실행: Express의 경로 핸들러는 JavaScript로 작성되었습니다. Chrome의 V8 엔진을 기반으로 구축된 JavaScript 런타임인 Node.js는 이 JavaScript 코드를 실행합니다.
비동기 작업: 경로 핸들러에 파일 읽기 또는 데이터베이스 쿼리와 같은 I/O 작업이 포함된 경우 Node.js는 이러한 작업을 비동기식으로 수행하여 메인 스레드를 차단하지 않습니다. 여기가 Event Loop와 LibUV가 작동하는 곳입니다.
4. 이벤트 루프(동시성 처리)
작업 예약: Node.js는 이벤트 루프를 사용하여 동시성을 처리합니다. 경로 핸들러가 I/O 요청(예: 파일 읽기)을 수행하면 작업이 LibUV로 전달됩니다.
비차단: 이벤트 루프는 I/O 작업이 완료되기를 기다리는 동안 계속해서 다른 작업을 처리합니다. 이것이 Node.js가 차단 없이 많은 연결을 효율적으로 처리할 수 있게 해주는 것입니다.
5. LibUV(I/O 작업)
비동기 I/O 처리: LibUV는 Node.js가 파일 읽기, 네트워크 요청 등과 같은 비동기 I/O 작업을 수행하는 데 사용하는 C 라이브러리입니다.
스레드 풀: 파일 시스템 작업(예: 230801.html 읽기)을 위해 LibUV는 스레드 풀을 사용합니다. 요청이 이 스레드 풀로 푸시되고 스레드 중 하나가 요청을 처리합니다.
I/O 완료: I/O 작업이 완료되면 LibUV는 이벤트 루프에 작업이 완료되었음을 알리고 이벤트 루프는 해당 작업과 관련된 콜백을 실행합니다.
6. OS 수준(Linux)
파일 시스템 액세스: 230801.html 읽기 요청이 이루어지면 LibUV는 Linux 커널과 상호 작용하여 디스크에서 실제 파일 읽기 작업을 수행합니다.
네트워크 스택: Linux OS는 들어오는 HTTP 요청을 올바른 애플리케이션(포트 3000에서 실행되는 Express)으로 라우팅하고 TCP 연결을 관리하는 등 낮은 수준의 네트워킹 측면을 처리합니다.
7. Node.js 및 Express로 돌아가기
콜백 실행: 파일을 읽은 후(또는 데이터베이스 쿼리가 완료되면) Express 경로 핸들러에서 제공하는 콜백이 실행됩니다. 여기에는 클라이언트에 대한 응답으로 파일 내용을 보내는 것이 포함될 수 있습니다.
응답 생성: Express는 응답 개체(res)를 사용하여 HTTP 헤더, 상태 코드 및 응답 본문을 설정합니다.
8. 응답 보내기
HTTP 응답: Express는 res.send() 또는 이와 유사한 것을 호출하여 HTTP 응답을 클라이언트에 다시 보냅니다. 이 응답에는 230801.html의 내용이 포함되어 있습니다.
네트워크 전송: Linux OS는 브라우저가 수신하는 네트워크 스택을 통해 HTTP 응답을 다시 보냅니다.
9. 브라우저 렌더링
응답 수신: 브라우저는 응답을 수신하고 HTML을 구문 분석한 후 화면에 콘텐츠를 렌더링합니다.
이벤트 처리: HTML에 JavaScript 또는 기타 자산(예: CSS)이 포함되어 있는 경우 브라우저는 이러한 리소스를 로드하기 위해 추가 요청을 할 수 있습니다.
요약
Express, Node.js, 이벤트 루프, LibUV 및 Linux OS의 관점에서 프로세스에는 다음이 포함됩니다.
요청을 신속하게 라우팅하고 처리합니다.
경로 핸들러의 JavaScript 코드를 실행하는 Node.js.
비차단 작업을 관리하는 이벤트 루프.
LibUV는 Linux OS의 도움으로 비동기 I/O 작업을 처리합니다.
마지막으로 응답은 렌더링을 위해 브라우저로 다시 전송됩니다.
'CS' 카테고리의 다른 글
const 개념 종결 c++ // 매개변수 const, 함수뒤 const, 리턴값앞 const (0) | 2024.05.26 |
---|---|
REST API (0) | 2023.08.10 |