Node.js와 Express.js 서버 개발 – 포트, 라우팅, chunk/buffer 완전 이해

2025. 7. 2. 13:55JavaScript/Node.js

오늘은 Node.js와 Express.js를 활용한 웹 서버 개발 전반에 대해 심층적으로 학습했습니다. 특히, HTTP 통신 구조, 라우팅의 원리, 포트와 경로의 관계, chunk/buffer 개념, 그리고 브라우저 자동 실행 방법까지 실습 중심으로 익혔습니다. 이 글은 실전 코딩과 함께 배운 개념들을 기반으로, 백엔드 개발자로서 반드시 이해하고 있어야 할 핵심 내용을 모두 담고 있습니다.


1️⃣ 용어 및 개념 정리

용어설명

JavaScript 원래는 웹 브라우저에서만 실행되던 프로그래밍 언어
Node.js JavaScript를 브라우저 밖(서버 환경)에서도 실행 가능하게 만든 런타임 환경
Express.js Node.js 위에서 동작하는 웹 서버 프레임워크. 라우팅, 응답, 미들웨어 등을 간편하게 처리
포트(Port) 서버가 외부와 통신하는 통로. 클라이언트는 특정 포트로 요청을 보냄
라우팅(Routing) 특정 URL 경로로 요청이 들어왔을 때 어떤 동작을 수행할지 정하는 방식
chunk 클라이언트가 전송하는 데이터를 잘게 나눈 조각
buffer chunk 조각을 담고 있는 이진 데이터 구조체 (Node.js 내부 처리 구조)

2️⃣ Express 설치 및 서버 생성

✅ 설치 방법

npm init -y           # package.json 생성
npm install express   # express 설치

✅ 기본 서버 코드 구조

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('express page');
});

app.listen(3001, () => {
  console.log('3001 port waiting...');
});

이 코드를 통해 http://localhost:3001/ 경로에서 "express page"가 출력됩니다.

🔎 코드 분석

  • require('express'): 외부 모듈 불러오기
  • app.get('/'): 루트 경로(/)에 GET 요청이 들어올 때 콜백 함수 실행
  • res.send(): 클라이언트에 응답 전송
  • app.listen(3001): 3001번 포트에서 요청을 기다림

3️⃣ app.get('/')가 작동하는 이유

  • app.listen(3001)은 서버의 입구 역할을 하고,
  • app.get('/')은 그 안에서 URL이 /인 요청만 처리함
  • 두 개가 함께 존재해야 http://localhost:3001/이 정상 작동함
app.listen(3001);
app.get('/');

→ 이렇게 구성되면 브라우저에서 포트번호를 통해 들어온 요청 중 / 경로에 해당하는 요청만 처리됨


4️⃣ 개발 환경 vs 배포 환경

환경 설명
개발 환경 로컬 PC에서 localhost:3001처럼 포트번호를 직접 명시하여 사용
배포 환경 AWS, Netlify, Vercel 등에서 보통 80/443 포트를 자동 사용 → myapp.com으로 접속 가능

5️⃣ 터미널에서 서버 실행 명령어

node ex01.js           # 기본 실행
npx nodemon ex01.js    # 코드 변경 시 자동 재실행 (권장)

nodemon이 없으면 먼저 설치:

npm install -g nodemon

ctrl + c로 서버 실행 중지 가능


6️⃣ 터미널에서 브라우저 열기 (Bash 환경)

Git Bash에서는 start 명령어 대신 explorer 사용

explorer http://localhost:3001/

또는 Express 서버 코드 안에 삽입하여 자동 브라우저 열기:

const { exec } = require('child_process');
exec('explorer http://localhost:3001');

7️⃣ req.on('data')와 req.on('end') 이해

Node.js에서 POST 요청 처리를 위해 http.createServer()로 만든 서버에서는 req 객체에서 데이터가 조각(chunk) 단위로 들어옵니다.

let body = "";
req.on('data', (chunk) => {
  body += chunk;
});

req.on('end', () => {
  console.log('받은 전체 데이터:', body);
});
  • data: 데이터 조각이 들어올 때마다 발생
  • end: 모든 조각 수신이 완료되었을 때 발생

📌 왜 누적해야 할까?

데이터는 한 번에 다 오지 않기 때문 (네트워크의 특성) → body += chunk 로 누적해서 전체 본문을 완성하는 것


8️⃣ chunk와 buffer 개념

개념 설명
chunk 네트워크에서 전송되는 데이터의 조각 (예: id=abc)
buffer 이진 데이터로 구성된 chunk를 담는 구조체 (Node.js 내부에서 사용)

예시:

req.on('data', (chunk) => {
  console.log(typeof chunk);         // object (Buffer)
  console.log(chunk.toString());     // id=jinwoo&pw=1234
});

9️⃣ cd .. vs cd ../ 차이

명령어 설명
cd .. 현재 폴더의 부모 디렉토리로 이동 (기본 이동)
cd ../ 부모 디렉토리를 경로 연결용으로 사용 (예: cd ../images)

핵심 요약:

  • 기능은 같지만 사용 목적과 문맥에 따라 쓰임이 다름
  • 실무에서는 cd ..는 단독 이동용, ../는 경로 연결용으로 자주 사용됨

✅ 오늘 학습 핵심 요약

  • Node.js는 JavaScript 런타임, Express.js는 웹 프레임워크
  • 서버는 listen(포트)로 열고, 라우팅은 get('/경로')로 처리
  • POST 요청 처리 시 data, end 이벤트를 통해 본문 수신
  • 데이터는 chunk로 오고, Buffer로 구성됨 → 문자열로 누적 필요
  • Git Bash에서는 브라우저 자동 실행 시 explorer 명령어 사용
  • 디렉토리 이동 시 cd ..cd ../는 기능은 같지만 문맥이 다름

다음 학습 주제: Express 미들웨어, RESTful API 설계, JWT 인증 처리