종원

Hello world (2) Node.js 에서 Express를 쓰는 이유 본문

카테고리 없음

Hello world (2) Node.js 에서 Express를 쓰는 이유

곰종 2026. 6. 20. 23:52

목표 : Hello world 홈페이지를 배포하기

일단 기본으로 node.js를 이용해서 localhost:3000에 hello world를 띄우기 위한 작업은 

const http = require("http"); 

const server = http.createServer((request, response) => {
    response.end("Hello World");
});

server.listen(3000);

 

으로 하는데, 이건 그냥 코드일 뿐이고 내가 생각하는 흐름은

http 변수에 Node.js의 내장 HTTP 모듈을 가져와서 저장한 후

웹서버를 생성한 뒤 Node.js가 request와 response 객체를 만들어서 우리 코드에 전달해 주고

위 코드같은 경우에는 request를 받으면 Hello world를 응답으로 보낸 뒤 응답을 "종료"함

 

이 요청을 받기 위해 서버는 3000포트에서 들어오는 클라이언트의 요청을 대기하는 중이라고 이해했다.

 

이로인해 주소창에 http://localhost:3000/ 를 검색하면 

http:// -  프로토콜을 사용하겠습니다
localhost - 내 컴퓨터를 의미
3000 - 3000번 포트로 접속한다는 의미

/ - 브라우저가 GET /를 보내는것

GET / HTTP/1.1
Host: localhost:3000

그럼 Node.js에서는 브라우저가 요청하면 request, resopnse 객체를 만들어서 우리 app.js코드에 넘겨줌

브라우저는 Node.js를 모르지만,http localhost 3000포트로 보내는 거고 그걸 node.js는 캐치한 것

 

그럼 나는 hello world 페이지에서 댓글도 남기고 댓글이 저장되는 기능도 하고싶은데, 그럼 클라이언트는 어떤 요청을 해야할까?

 


일단 댓글을 남기는 요청할 때는 새로운 POST라는 개념이 생기는데
브라우저에서 POST 요청으로 나의 댓글에 대한 데이터를 보내고 어디로 보내는지도 확인한다 (POST /comment)
POST /comment
POST /login
POST /signup
POST /article
POST /logout 등등 POST의 요청에서도 구분해야 하기 때문

그럼 서버는 method를 확인하고, POST인가? 어디 url? 데이터는 뭐지? 하고 저장한 뒤 응답함

method : 무엇을 할 것인가

url : 어디서 할 것인가

GET /comment (댓글확인) POST /comment(댓글작성) DELETE /comment(댓글삭제)

 

request에는 많은 정보들을 담고있는데
method, url, body, headers.....등 

이게 각각 많은 method, url, body가 있을 수록 코드도 길어지고 app.js를 작성할 때 복잡해 지기 때문에
요청(request)을 처리하는 코드를 훨씬 읽기 쉽고 관리하기 쉽게 만들어주는 프레임워크인 express를 사용하게 된다.

 

일단 express없이 Node.js만으로 댓글 기능을 만들어 본다면 

 

const comments = [];

으로 comments가 들어갈 수 있는 배열을 선언한다. 

 

여기서 이 comments 배열은 app.js에서 생성된 변수이고, 이 변수는 Node.js 프로세스의 메모리(RAM) 에 존재하기 때문에

서버가 종료되면 데이터가 사라진다. 따라서 영구적으로 저장할 수 있는 DB를 사용해야 한다.

 

일단 comment에 댓글로 입력된 body가 들어가려면 

const comments = [];

comments.push("안녕하세요");

로 배열에 하나를 넣는 함수 push를 사용하여 넣어준다.

 

근데 여기서 안녕하세요는 늘 댓글로 안녕하세요가 들어오지 않을것이기 때문에

comments.push(request.body);

로 request.body를 통해 사용자가 입력한 바디를 자연스럽게 comments 배열에 넣어준다.

 

댓글이 잘 입력되었는지 확인하기 위해 server는 

response.end(JSON.stringify(comments));

배열 형태로 있는 comments를 JSON.stringfy를 통해 변환해서 응답을 함

 

-- 

댓글을 추가 했는데, 사용자가 F5로 새로고침 하면 어떤 request가 될 까?

여기서 request는 GET / 으로 홈페이지를 받고, GET / comments로 댓글을 받는 두 번의 요청을 하게된다.

 

왜 두 번의 요청을 하고, 첫 번째 요청 후에는 누가 요청을 하는걸까?

일단 두 번의 요청으로 각각 GET/ , GET /comment로 요청하는 이유는

 

필요한 데이터만 다시 가져오기 위해 요청을 나눠서 하고

역할 분리를 위해 GET / 은 홈페이지를 보여주는 것. 
GET /comments는 홈페이지를 보여주는 것 분리

 

그리고 comments를 보여주는건 누가 요청하냐면
브라우저가 HTML을 읽다가 comments라는게 있다면 스스로 GET /comments를 다시 보냄. 왜? 이 코멘트를 화면에 보여줘야 하니깐. 

그래서 HTML이 브라우저에게 요청을 유도하는 것이기도함

 

그리고 댓글창에 쓰고 댓글을 추가하는건 버튼으로 인하여 사용자가 직접 요청하는 경우도 있음

 

그리고 기본으로 HTML의 type로 응답하기 때문에 댓글 같은건 Content-Type을 application/json으로 설정해야함

(Content-Type을 application/json으로 설정하고, Body에는 JSON 형태의 댓글 데이터를 담아 응답한다.)

 

그럼 JSON 형태로 댓글 데이터를 담아 응답하면, 그건 어떻게 출력될까?
서버는 GET /comments의 응답으로 JSON형태의 안녕하세요, 반갑습니다 를 보냈지만 브라우저는 이 데이터를 받았을 뿐이고, 
JavaScript에서 HTML속 이 json형태의 댓글을 화면에 예쁘게 그려주는 역할을 함

데이터/화면의 구분을 해야함

서버가 데이터를 반환하면서 그게 바로 화면에 뜨는게 아닌, 데이터를 반환하면 최종적으로 HTML에 전달이 되고 HTML에서는 어떻게 띄워주는지가 결정

 

일단 app.js로 comments를 보여주기 위해 코딩을 해보면

const http = require("http"); 

const comments = [];

const server = http.createServer((request, response) => {
  if (request.method === "GET" && request.url === "/") { 
    response.end("<h1>Hello Comment</h1>");
    return;
  }

  if (request.method === "GET" && request.url === "/comments") { 
    response.setHeader("Content-Type", "application/json"); 
    response.end(JSON.stringify(comments)); 
    return;
  }

  response.statusCode = 404; 
  response.end("Not Found");
});

server.listen(3000);

Localhost:3000으로 접속하면 Hello Comment가 <h1>이 적용된 형태로 나오고

Localhost:3000/comments로 접속하면 빈 배열만 나오게 된다. 아마도 여기의 형태는 json일것이다.

 

comments에 ["안녕하세요", "반갑습니다"]를 넣고 Localhost:3000/comments를 접속하면 ["안녕하세요", "반갑습니다"]가 출력된다. 

나는 기존에 저장되어있는것이 아닌, 내가 댓글을 넣고 그게 출력되면 좋겠는데 

그럼 기존 request처럼 뭐 request.method, request.url 같이 요청을 보내야 하는데

request.body는 node.js에 없다.

이유는 request.body로 한번에 텍스트, 이미지, 영상 등이 들어갈 수 있는데 만약 영상이 20gb라면 20gb의 메모리를 한번에 올려야 할 수도 있고 node.js가 body를 한 번에 받지 않기 때문이다

 

네트워크를 통해 조각 단위로 조금씩 도착하는데, 이걸 Stream이라고 한다

아직 Body가 전부 도착하지 않았을 수도 있기 때문에 Node.js에서는 request.body를 자동으로 만들어 줄 수가 없다.

 

택배로 비유하면

택배를 100개 보냈고, 1개씩 올리고 있는데 바로 response로 100개를 전부 보여줄 수 없기 때문.

 

순수 Node.js에서는 직접 

request.on("data", ...)

 

으로 data 조각들을 하나씩 모으고 마지막에

request.on("end", ...)

 

가 호출되면 Body가 전부 왔다고 판단해서 사용됨.

이 과정이 20GB를 body에 넣을 경우 네트워크 -> 1kb 도착 -> 1kb 처리 -> 1kb 도착 -> 1kb 처리 

이런식으로 조금씩 전달하는 구조(스트림)라고 함

 

Node.js는 범용 HTTP 서버이기 때문에 작은 텍스트뿐만 아니라 대용량 파일도 처리해야 합니다. 따라서 Body를 자동으로 메모리에 올려 request.body를 만들지 않고, 스트림으로 조금씩 전달하도록 설계되었습니다.

 

반면 Express는 웹 애플리케이션 개발을 위한 프레임워크입니다. 일반적인 웹 개발에서 많이 사용하는 JSON이나 Form 데이터를 자동으로 읽어서 request.body를 만들어 개발자가 편리하게 사용할 수 있도록 도와줍니다. 대용량 파일은 Express도 스트림 기반으로 처리합니다.

const http = require("http");
const querystring = require("querystring");

const comments = [];

const server = http.createServer((request, response) => {
  // GET /
  // 댓글 입력 화면
  if (request.method === "GET" && request.url === "/") {
    response.setHeader("Content-Type", "text/html; charset=utf-8");
    response.end(`
      <h1>Hello Comment</h1>

      <form action="/comment" method="POST">
        <p>댓글</p>
        <input name="comment" />
        <button type="submit">작성</button>
      </form>
    `);
    return;
  }

  // GET /comments
  // 댓글 목록 JSON 응답
  if (request.method === "GET" && request.url === "/comments") {
    response.setHeader("Content-Type", "application/json; charset=utf-8");
    response.end(JSON.stringify(comments));
    return;
  }

  // POST /comment
  // 댓글 저장
  if (request.method === "POST" && request.url === "/comment") {
    let body = "";

    request.on("data", (chunk) => {
      body += chunk;
    });

    request.on("end", () => {
      const parsedBody = querystring.parse(body);

      comments.push({
        comment: parsedBody.comment,
      });

      response.statusCode = 302;
      response.setHeader("Location", "/");
      response.end();
    });

    return;
  }

  response.statusCode = 404;
  response.end("Not Found");
});

server.listen(3000);

 

express 쓰기 전 코드를 보면 

<h1>Hello Comment</h1>

<form action="/comment" method="POST">

    <input name="comment">

    <button>작성</button>

</form>

을 통해 Hello Comment를 보여주면서 동시에 /comment로 post하기 위한 댓글창도 보여주고 있음
input name = "comment"로 사용자가 댓글을 입력하는 곳이 생기며
name = "comment" / Key = value 값으로 매핑된다

버튼을 클릭하면 form이 전송되고

if (request.method === "POST" &&
    request.url === "/comment")

Node.js에서 위 조건을 만족하게 됨

하지만 comment = 안녕하세요가 한번에 바로 오는게 아닌 스트림으로 오기 때문에

comm -> ent= -> 안녕 -> 하세요

이런식으로 쪼개져서 올 수 있기 때문에 

let body =""; 로 만들어놓고

조각 이올 때 마다 

request.on("data", (chunk) => {

    body += chunk;

});

청크로 받은 조각을 바디에 이어붙인다.

Bdoy를 전부 받으면 

request.on("end")

Body가 전부 도착했다고 end를 호출

 

현재 Body는 comment=안녕하세요 라는 문자열 이기 때문에

querystring.parse(body)

body.comment 처럼 사용하기 위해 querystring.parse(body)를 실행함

 

그럼 파싱된 데이터를 comments에 저장하기 위해 push 해주면

comments.push({
    comment: parsedBody.comment
});

RAM에

comments = [

    {
        comment: "안녕하세요"
    }

]

가 저장되고 

 

댓글은 저장 되었으나 브라우저는 POST /comment 상태이기 때문에

response.statusCode = 302;

response.setHeader("Location", "/");

를 이용하여 댓글 저장은 끝났으니 다시 맨 처음 화면인 GET / 으로 돌아간다.

 

이렇게 node.js 만을 사용해서 서버를 만들고 통신을 하면 정말 하나 하나의 동작을 지정하고, 비교하고, api가 많아질수록 그만큼의 if문이 생겨서 코드가 길어지고 가독성이 떨어짐

 

또한 모든 POST요청마다 request.on data, end, parse를 반복해야하는데 (회원가입,로그인 등등) express를 사용하면 req.body하나로 끝남 대체로 이런 불편함 때문에 Express를 사용하여 개발 

Express는 Node.js 위에서 동작하는 웹 프레임워크입니다. Node.js에서 반복적으로 작성해야 하는 라우팅, HTTP Body 처리, 미들웨어 등의 작업을 대신 처리해주기 때문에 웹 서버를 더 쉽고 가독성 있게 개발할 수 있도록 도와줍니다.

 

if (request.method === "GET" && request.url === "/") {
    ...
}
else if (request.method === "GET" && request.url === "/login") {
    ...
}
else if (request.method === "POST" && request.url === "/login") {
    ...
}
else if (request.method === "GET" && request.url === "/signup") {
    ...
}
else if (request.method === "POST" && request.url === "/signup") {
    ...
}
// 계속...

 

app.get("/", ...)

app.get("/login", ...)

app.post("/login", ...)

app.get("/signup", ...)

app.post("/signup", ...)

express 사용하여 간단하게 만듬

⭐ Q1. JavaScript와 Node.js의 차이를 설명해주세요.

답변

JavaScript는 프로그래밍 언어입니다.

Node.js는 JavaScript를 브라우저 밖에서도 실행할 수 있게 해주는 Runtime입니다.

⭐ Q2. Runtime이란 무엇인가요?

답변

Runtime은 프로그램을 실제로 실행하는 환경입니다.

JavaScript는 Node.js Runtime에서 실행됩니다.

Python은 Python Runtime에서 실행됩니다.

⭐ Q3. 왜 node app.js를 입력하나요?

답변

app.js는 JavaScript 코드가 작성된 파일입니다.

Node.js가 app.js를 읽고 실행하기 위해

node app.js
 

를 사용합니다.

⭐ Q4. node app.js를 입력하면 어떤 순서로 실행되나요?

답변

사용자

↓

Git Bash

↓

운영체제(OS)

↓

Node.js(node.exe)

↓

app.js 실행

⭐ Q5. 프로그램은 왜 종료되나요?

답변

프로그램은 위에서 아래로 실행됩니다.

실행할 코드가 더 이상 없으면 종료됩니다.

⭐ Q6. 서버는 왜 종료되지 않나요?

답변

서버는 클라이언트의 요청을 계속 기다려야 하기 때문입니다.

listen()이 요청을 계속 대기하도록 합니다.

⭐ Q7. HTTP란 무엇인가요?

답변

브라우저와 서버가 통신하기 위한 프로토콜입니다.

⭐ Q8. request와 response는 무엇인가요?

답변

request는 클라이언트가 서버로 보낸 요청 정보입니다.

response는 서버가 클라이언트에게 보내는 응답입니다.

⭐ Q9. request 객체에는 어떤 정보가 들어있나요?

답변

대표적으로

request

↓

method

url

body

headers
 

등이 들어 있습니다.

⭐ Q10. response.end()는 왜 사용하나요?

답변

브라우저에게 응답을 보내고,

응답이 끝났음을 알리기 위해 사용합니다.

응답을 종료하지 않으면 브라우저는 계속 데이터를 기다릴 수 있습니다.

⭐ Q11. createServer()는 무엇인가요?

답변

HTTP 요청을 처리할 수 있는 웹 서버를 생성합니다.

⭐ Q12. listen(3000)은 무엇을 하나요?

답변

생성한 웹 서버를

3000번 포트에서 실행하고

클라이언트의 요청을 계속 기다립니다.

⭐ Q13. localhost란 무엇인가요?

답변

현재 사용 중인 컴퓨터 자신을 의미하는 특별한 이름입니다.

실제로는

127.0.0.1
 

을 의미합니다.

⭐ Q14. 친구가 localhost:3000으로 접속하면 내 서버에 접속되나요?

답변

아닙니다.

localhost는 항상 자기 자신의 컴퓨터를 의미합니다.

친구는 친구 컴퓨터의 localhost에 접속하게 됩니다.

⭐ Q15. Port는 왜 필요한가요?

답변

한 컴퓨터에서 여러 서버를 실행할 수 있기 때문입니다.

포트 번호를 이용해 어떤 서버와 통신할지 구분합니다.

⭐ Q16. 브라우저에서 localhost:3000을 입력하면 어떤 일이 일어나나요?

답변

브라우저

↓

HTTP GET /

↓

localhost의

3000번 포트

↓

Node.js 서버

↓

request 생성

↓

app.js 실행

↓

response.end()

↓

브라우저 출력

⭐ Q17. request.url은 무엇인가요?

답변

클라이언트가 요청한 URL 경로(Path)가 저장됩니다.

예를 들어

/

/login

/comment
 

등이 들어갑니다.

⭐ Q18. request.method는 무엇인가요?

답변

HTTP 요청 방식입니다.

대표적으로

GET

POST

PUT

DELETE
 

가 있습니다.

⭐ Q19. GET과 POST의 차이는?

답변

GET은 데이터를 조회할 때 사용합니다.

POST는 서버에 새로운 데이터를 저장할 때 사용합니다.

예를 들어

GET /comments
 

댓글 조회


POST /comment
 

댓글 작성

⭐ Q20. request.body는 무엇인가요?

답변

클라이언트가 서버로 보낸 실제 데이터가 저장되는 공간입니다.

예를 들어 댓글 내용

안녕하세요.
 

가 들어갈 수 있습니다.

⭐ Q21. 왜 request.method와 request.url을 둘 다 확인해야 하나요?

답변

URL만으로는 같은 주소에서 여러 기능을 구분할 수 없기 때문입니다.

예를 들어

GET /comment
 

댓글 조회

POST /comment
 

댓글 작성

같은 URL이라도 Method에 따라 기능이 달라집니다.

⭐ Q22. Express는 왜 사용할까요?

답변

Node.js의 http 모듈만으로도 웹 서버를 만들 수 있습니다.

하지만 기능이 많아질수록

  • if문이 많아지고
  • 라우팅 코드가 길어지고
  • 유지보수가 어려워집니다.

Express는 이러한 부분을 쉽게 관리할 수 있도록 도와주는 웹 프레임워크입니다.

 

⭐ Q23. API란 무엇인가요?

답변

API(Application Programming Interface)는 클라이언트와 서버가 데이터를 주고받기 위한 약속입니다.

예를 들어

GET /comments
 

를 요청하면

 
[
  "안녕하세요",
  "반갑습니다"
]
 

를 응답하는 것도 하나의 API입니다.

API는 화면을 주는 것이 아니라 데이터를 주는 역할도 할 수 있습니다.

 

⭐ Q24. GET / 와 GET /comments의 차이점은 무엇인가요?

답변

GET / 는 홈페이지(HTML)를 요청하는 API입니다.

GET /comments는 댓글 목록(JSON 데이터)을 요청하는 API입니다.

역할을 분리하면 화면은 그대로 유지하면서 댓글만 다시 받아올 수 있어 효율적입니다.

 

⭐ Q25. 왜 HTML과 JSON을 나누어서 응답하나요?

답변

HTML 전체를 매번 다시 받으면 네트워크 사용량이 증가합니다.

댓글처럼 자주 변경되는 데이터는 JSON만 다시 받아와 화면만 갱신하는 것이 효율적입니다.

또한 화면(HTML)과 데이터(JSON)의 역할이 분리되어 유지보수가 쉬워집니다.

 

⭐ Q26. JSON이란 무엇인가요?

답변

JSON(JavaScript Object Notation)은 서버와 클라이언트가 데이터를 주고받기 위한 표준 데이터 형식입니다.

예를 들어

 
[
  "안녕하세요",
  "반갑습니다"
]
 

처럼 데이터를 구조적으로 표현할 수 있습니다.

 

⭐ Q27. Content-Type은 왜 필요한가요?

답변

Content-Type은 응답 데이터의 형식을 브라우저에게 알려주는 HTTP Header입니다.

예를 들어

 
Content-Type: text/html
 

이면 브라우저는 HTML로 해석합니다.

 
Content-Type: application/json
 

이면 JSON 데이터로 해석합니다.

 

⭐ Q28. response.end()와 Content-Type의 관계를 설명해주세요.

답변

response.end()는 응답 데이터를 전송하고 응답을 종료합니다.

Content-Type은 response.end()로 보내는 데이터가 HTML인지 JSON인지 브라우저에게 알려주는 역할을 합니다.

 

⭐ Q29. 브라우저는 JSON을 받으면 화면에 댓글을 자동으로 그려주나요?

답변

아닙니다.

브라우저는 JSON을 데이터로만 인식합니다.

화면에 댓글을 출력하려면 JavaScript가 JSON을 읽어 HTML을 생성해야 합니다.

 

⭐ Q30. 브라우저는 언제 GET /comments 요청을 보내나요?

답변

브라우저가 스스로 판단하여 보내는 것은 아닙니다.

HTML이나 JavaScript가

 
fetch("/comments")
 

를 실행하거나,

사용자가 버튼을 클릭하는 등의 동작이 있을 때 브라우저가 GET /comments 요청을 전송합니다.

 

⭐ Q31. 댓글을 저장하려면 어떤 HTTP Method를 사용해야 하나요?

답변

댓글을 새로 생성하는 작업이므로 POST Method를 사용합니다.

예를 들어

POST /comment
 

를 통해 댓글 데이터를 서버로 전달합니다.

 

⭐ Q32. 댓글 조회는 왜 GET을 사용하나요?

답변

GET은 서버의 데이터를 조회하기 위한 HTTP Method입니다.

댓글 목록을 조회하는 기능은 데이터를 변경하지 않으므로 GET을 사용합니다.

 

⭐ Q33. GET 요청에는 Body가 존재하나요?

답변

일반적으로 GET 요청은 Body를 사용하지 않습니다.

조회할 대상은 URL과 Query Parameter를 통해 전달하는 것이 일반적입니다.

반면 POST는 Body를 통해 데이터를 전달합니다.

 

⭐ Q34. request.body는 무엇인가요?

답변

request.body는 클라이언트가 POST 요청으로 보낸 실제 데이터입니다.

예를 들어

POST /comment

Body

안녕하세요
 

에서

안녕하세요
 

가 request.body에 해당합니다.

 

⭐ Q35. 순수 Node.js에서 request.body를 바로 사용할 수 없는 이유는 무엇인가요?

답변

Node.js는 HTTP Body를 자동으로 메모리에 올리지 않습니다.

Body는 네트워크를 통해 여러 조각(Stream)으로 도착하기 때문에 개발자가 직접 데이터를 모아야 합니다.

 

⭐ Q36. Node.js가 Body를 Stream으로 처리하는 이유는 무엇인가요?

답변

Node.js는 작은 텍스트뿐 아니라 이미지, 영상, 대용량 파일도 처리해야 하는 범용 HTTP 서버입니다.

만약 Body를 모두 메모리에 올린다면 대용량 파일 업로드 시 메모리 사용량이 급격히 증가할 수 있습니다.

그래서 데이터를 Stream으로 조금씩 처리하도록 설계되었습니다.

 

⭐ Q37. Stream이란 무엇인가요?

답변

Stream은 데이터를 한 번에 모두 처리하지 않고,

조금씩 읽고 처리하는 방식입니다.

예를 들어 10GB 파일도 메모리에 한 번에 올리지 않고 작은 조각 단위로 처리할 수 있습니다.

 

⭐ Q38. Express에서는 왜 request.body를 사용할 수 있나요?

답변

Express는 웹 애플리케이션 개발을 위한 프레임워크입니다.

JSON이나 Form 데이터를 자동으로 읽어 request.body를 생성해주기 때문에 개발자는 별도의 Stream 처리 없이 데이터를 사용할 수 있습니다.

 

⭐ Q39. Node.js와 Express의 역할 차이를 설명해주세요.

답변

Node.js는 JavaScript Runtime이자 HTTP 서버를 만들 수 있는 실행 환경입니다.

Express는 Node.js 위에서 동작하는 웹 프레임워크로,

라우팅, Body 처리, 미들웨어 등을 쉽게 사용할 수 있도록 도와줍니다.

 

⭐ Q40. 왜 Express를 사용하는가?

답변

순수 Node.js만으로도 웹 서버를 만들 수 있지만,

  • 라우팅 코드가 길어지고
  • Body를 직접 처리해야 하며
  • 유지보수가 어려워집니다.

Express는 이러한 작업을 자동화하여 개발 생산성과 가독성을 높여줍니다.

 

⭐ Q41. HTML Form의 역할은 무엇인가요?

답변

HTML Form은 사용자가 입력한 데이터를 지정한 URL로 지정한 HTTP Method를 사용하여 서버로 전송하는 역할을 합니다.

예를 들어

 
<form action="/comment" method="POST">
 

는 사용자가 버튼을 클릭하면 브라우저가 POST /comment 요청을 생성하여 서버로 전송합니다.

 

⭐ Q42. form의 action과 method는 각각 무엇인가요?

답변

action은 데이터를 전송할 URL을 의미합니다.

method는 어떤 HTTP Method(GET, POST 등)를 사용할지 결정합니다.

예를 들어

 
<form action="/comment" method="POST">
 

는 브라우저에게 /comment로 POST 요청을 보내라고 알려주는 역할을 합니다.

 

⭐ Q43. input 태그의 name 속성은 왜 필요한가요?

답변

name은 서버로 전송되는 데이터의 Key가 됩니다.

예를 들어

 
<input name="comment">
 

안녕하세요
 

를 입력하면 브라우저는 Body를

comment=안녕하세요
 

형태로 만들어 서버에 전송합니다.

⭐ Q44. POST /comment 요청은 언제 발생하나요?

답변

사용자가 Form 안에 데이터를 입력한 후 Submit 버튼을 클릭하는 순간 브라우저가 자동으로 POST /comment 요청을 생성하여 서버로 전송합니다.

 

⭐ Q45. Node.js에서 POST Body는 어떻게 처리되나요?

답변

POST Body는 스트림(Stream) 형태로 전달됩니다.

Node.js는

  • request.on("data")에서 Body 조각을 받고
  • request.on("end")에서 모든 Body를 받은 후
  • Body를 하나의 문자열로 만든 뒤 처리합니다.

⭐ Q46. 왜 body += chunk를 사용하나요?

답변

HTTP Body는 여러 개의 조각(Stream)으로 나누어 전달될 수 있습니다.

따라서

 
body += chunk;
 

를 사용하여 여러 조각을 하나의 문자열로 이어 붙입니다.

 

⭐ Q47. querystring.parse()는 왜 사용하나요?

답변

브라우저의 Form은 Body를 문자열 형태로 전송합니다.

예를 들어

comment=안녕하세요
 

 
{
    comment: "안녕하세요"
}
 

와 같은 객체(Object)로 변환하기 위해 querystring.parse()를 사용합니다.

 

⭐ Q48. comments 배열은 어디에 저장되나요?

답변

comments 배열은 Node.js 프로세스의 메모리(RAM)에 저장됩니다.

따라서 서버가 종료되면 메모리가 초기화되므로 저장된 댓글도 모두 사라집니다.

 

⭐ Q49. comments.push(body)를 사용하는 것이 왜 확장성이 좋은가요?

답변

객체(Object) 전체를 저장하면 나중에 새로운 필드가 추가되어도 기존 코드를 크게 수정하지 않아도 됩니다.

예를 들어

 
{
    nickname: "종원",
    comment: "안녕하세요",
    createdAt: "2026-06-22"
}
 

처럼 작성자, 작성 시간 등을 쉽게 추가할 수 있습니다.

 

⭐ Q50. 302 Redirect를 사용하는 이유는 무엇인가요?

답변

댓글 저장이 완료된 후 브라우저를 다시 메인 페이지(/)로 이동시키기 위해 사용합니다.

동작 과정은

POST /comment

↓

댓글 저장

↓

302 Redirect

↓

브라우저가 GET / 요청

↓

메인 페이지 출력
 

입니다.

 

⭐ Q51. Express를 사용하는 이유는 무엇인가요?

답변

순수 Node.js에서는

  • 라우팅
  • HTTP Body 처리
  • Body 파싱
  • Header 설정

등을 직접 구현해야 합니다.

Express는 이러한 반복적인 작업을 대신 처리하여 웹 서버를 더 쉽고 가독성 있게 개발할 수 있도록 도와주는 웹 프레임워크입니다.

 

⭐ Q52. Express와 Node.js의 관계를 설명해주세요.

답변

Express는 Node.js 위에서 동작하는 웹 프레임워크입니다.

브라우저의 HTTP 요청은 먼저 Node.js가 받고,

Express는 그 요청을 전달받아

  • 라우팅
  • Body Parsing
  • 미들웨어 처리

등을 수행한 후 개발자의 코드로 전달합니다.

따라서 Express는 Node.js를 대체하는 것이 아니라 Node.js를 더욱 편리하게 사용할 수 있도록 도와주는 프레임워크입니다.

 

"Node.js만으로도 웹 서버를 만들 수 있는데, 왜 Express를 사용하는지 설명해주세요."

모범 답변

Node.js의 http 모듈만으로도 웹 서버를 구현할 수 있습니다. 하지만 요청이 많아질수록 Method와 URL을 직접 비교하는 코드가 길어지고, HTTP Body도 Stream으로 직접 처리해야 합니다. Express는 이러한 반복 작업을 추상화하여 라우팅과 Body 파싱을 쉽게 만들어 주며, 웹 애플리케이션을 효율적으로 개발할 수 있도록 도와주는 프레임워크입니다.