본문 바로가기

DevOps

[Node.js] 실습1

Node.js는 자바스크립트 코드 실행에 필요한 런타임으로 v8 엔진을 사용하고,
자바스크립트 런타임에 필요한 이벤트 루프 및 운영체제 시스템 API를 사용하는 데는 libuv 라이브러리를 사용

 

1. 애플리케이션에서 요청 발생하면 V8 엔진은 자바스크립트 코드로 된 요청을 바이트 코드나 기계어로 변경
2. 자바스크립트로 작성된 Node.js의 API는 C++로 작성된 코드를 사용
3. V8 엔진은 이벤트 루프로 libuv를 사용하고 전달된 요청을 libuv 내부의 이벤트 큐에 추가
4. 이벤트 큐에 쌓인 요청은 이벤트 루프에 전달되고 운영체제 커널에 비동기 처리를 맡김
(운영체제 내부적으로 비동기 처리가 힘든 경우(DB, DNS 룩업, 파일 처리 등)는 워커 스레드에서 처리)
5. 운영체제의 커널 또는 워커 스레드가 완료된 작업은 다시 이벤트 루프로 전달
6. 이벤트 루프에서는 콜백으로 전달된 요청에 대한 완료 처리를 하고 넘김
7. 완료 처리된 응답을 Node.js 애플리케이션으로 전달

 

const http = require("http");
// require() 함수는 모듈을 읽어오는 함수
// http 모듈을 불러와서 http 변수에 할당

let count = 0;
const server = http.createServer((req, res) => {
    log(count); // 전역 변수 count 사용
    res.statusCode = 200; // 요청에 대한 상태 코드를 200으로 설정
    res.setHeader("Content-Type", "test/plain");
    // http는 요청/응답에 대한 부가 정보를 설정할 수 있음
    // 부가 정보를 header에 설정하게 되는데 여기서는 text/plain으로 설정
    // 콘텐츠 타입은 해당 콘텐츠가 어떤 형태의 데이터인지를 나타냄
    // text/plain은 텍스트를 평문으로 해석하겠다는 뜻
    // text/html이라면 텍스트를 html로 해석한다는 뜻
    res.write("hello\n"); // 응답으로 hello 보내줌
    setTimeout(() => {
        res.end("Node.js");
    }, 2000);
    // setTimeout()은 콜백 함수와 숫자를 인수로 받음
    // 숫자는 밀리초이며 해당 시간이 지나면 콜백 함수 실행
    // 여기서는 2초 후 node.js 응답으로 주고 http 커넥션을 끝내는 동작
});
// const server = http.createServer(callback)
// createServer()는 서버 인스턴스를 만드는 만드는 함수
// 인수로는 콜백 함수를 받는데 콜백 함수에서는 http 서버로 요청이 들어오면 해당 요청을 처리할 함수를 설정
// 콜백 함수는 요청 처리에 사용할 요청(req)과 응답(res) 객체를 인수로 받음

function log(count) {
    console.log((count += 1));
}

server.listen(8000, () => console.log("Hello Node js"));
// 사용할 포트 번호를 8000번으로 지정
// 또한 IP가 생략되었으므로 기본값인 localhost 혹은 127.0.0.1로 서버에 접근 가능

 

 

 

http://www.example.com:80/path/to/file.html?key1=value#hash

  • http > 프로토콜
  • http://www.example.com > hostname 도메인명
  • 80 > 포트번호
  • path/to/file.html > pathname 웹 서버 자원에 대한 경로
  • ?key1=value > query 웹 서버에서 제공하는 추가 매개변수
  • #hash > hash 일종의 북마크(서버에 전송하지 않음)
const http = require("http");

const url = require("url"); // url 모듈을 할당

http.createServer((req, res) => {
    const path = url.parse(req.url, true).pathname;
    // url 모듈을 사용해 요청(req)으로 받은 url의 pathname을 얻어냄
    // url이 localhost:3000/user 라면 pathname은 /user
    // parse() 함수의 두 번째 인수로 있는 true는 쿼리 스트링도 함께 파싱할지 여부를 설정하는 변수
    // 경로명 다음의 ? 기호 뒤에 키=값 형태로 붙임
    res.setHeader("Content-Type", "text/html; charset=utf-8");

    if (path === "/user") {
        res.end("[user] name: eunbi, age: 20"); // /user 결과값 설정
    } else if (path === "/feed") { // /feed 결과값 설정
        res.end(`<ul>
        <li>picture1</li>
        <li>picture2</li>
        <li>picture3</li>
        </ul>
        `);
    }
    else {
        res.statusCode = 404;
        res.end("404 page not found");
    }
}).listen("3000", () => console.log("make router!"));

 

 

 

 

 

'DevOps' 카테고리의 다른 글

[AKS] 개념  (0) 2024.04.29
[AKS] 시작하기  (0) 2024.04.26
[AKS] 개요  (0) 2024.04.25
[ERROR] 해결 모음  (0) 2024.04.17
[Python] 기초  (0) 2023.12.28