Skip to main content

우리가 만들려는 건 정확히 뭐일까?

프로그래밍을 처음 배울 때 서버는 자주 무서운 단어처럼 보입니다. 화면도 없고, 눈에 보이는 버튼도 없고, 터미널에는 검은 창만 있으니까요. 그런데 사실 서버는 생각보다 단순한 역할을 합니다. 누군가가 무언가를 요청하면, 그 요청을 받고 적절한 대답을 돌려주는 프로그램입니다.

예를 들어 보겠습니다. 브라우저에서 쇼핑몰 상품 페이지를 열면 이런 일이 벌어집니다. 브라우저는 "상품 정보 좀 주세요"라고 요청하고, 서버는 "좋아요, 이름은 이거고 가격은 이거예요"라고 응답합니다. 로그인 버튼을 누르면 브라우저는 "이 사용자가 맞는지 확인해 주세요"라고 요청하고, 서버는 확인한 뒤 성공 또는 실패를 알려줍니다. 할 일 앱에서 새 항목을 추가하면 서버는 "새 할 일을 저장했어요"라고 답합니다.

즉, 서버는 늘 바쁩니다. 누군가 페이지를 열고, 누군가 로그인하고, 누군가 데이터를 저장하고, 또 누군가는 목록을 읽어 가기 때문입니다. 서버는 웹 서비스의 조용한 일꾼입니다. 화면 뒤에서 계속 뛰어다니는 매니저에 가깝습니다.

이 책에서 우리가 만들 것은 바로 그런 요청을 받고 응답하는 Node.js 서버입니다. 그리고 그중에서도 Express 기반의 서버를 만들 겁니다. 먼저 머릿속 그림부터 분명히 해두면, 앞으로 나올 코드가 훨씬 덜 낯설어집니다.

서버는 식당 직원과 비슷하다

서버를 식당으로 생각해 보면 이해가 쉽습니다.

브라우저나 앱은 손님입니다. 손님은 메뉴를 보고 주문합니다. "김치찌개 하나 주세요." 그러면 서버는 주방과 창고를 왔다 갔다 하며 필요한 일을 처리합니다. 재료를 확인하고, 요리를 만들고, 접시에 담아 다시 손님에게 가져다줍니다.

웹에서 이 과정을 바꿔 말하면 이렇습니다.

  • 손님은 브라우저나 모바일 앱이다.

  • 주문은 HTTP 요청이다.

  • 음식은 서버가 돌려주는 응답이다.

여기서 HTTP 요청이라는 말이 나오는데, 어렵게 들릴 필요는 없습니다. 그냥 "인터넷에서 정해진 방식으로 부탁하는 메시지"라고 생각하면 됩니다. "이 주소의 데이터를 주세요", "이 내용을 저장해 주세요", "이 항목을 삭제해 주세요" 같은 부탁이죠.

서버는 이 부탁을 이해하고 적절한 답을 줍니다. 어떤 때는 HTML을 보내고, 어떤 때는 JSON을 보내고, 어떤 때는 "그건 없습니다"라고 404를 돌려주기도 합니다.

초보자가 서버를 배울 때 가장 중요한 포인트는 하나입니다. 서버는 결국 요청과 응답의 왕복을 다루는 프로그램이라는 점입니다. 이 문장을 이해하면, 이후에 나오는 라우팅, 미들웨어, API, 에러 처리도 모두 이 큰 그림 안에서 자리를 찾게 됩니다.

Node.js는 무엇일까?

이제 "그 서버를 뭘로 만들 건데?"라는 질문이 나옵니다. 여기서 등장하는 것이 Node.js입니다.

Node.js는 브라우저 밖에서 자바스크립트를 실행할 수 있게 해주는 실행 환경입니다. 원래 자바스크립트는 브라우저 안에서 주로 동작하는 언어였지만, Node.js 덕분에 이제는 서버에서도 자바스크립트를 사용할 수 있습니다.1

이 말은 꽤 중요합니다. 프론트엔드에서 버튼을 눌렀을 때 동작을 만들던 자바스크립트가, 이제는 서버 쪽 로직도 처리할 수 있다는 뜻이니까요. 즉, 같은 언어로 화면 쪽과 서버 쪽을 모두 다룰 수 있습니다.1

Node.js를 너무 거창하게 외울 필요는 없습니다. 지금 단계에서는 이렇게 기억하면 충분합니다.

Node.js는 자바스크립트로 서버 프로그램을 만들 수 있게 해주는 실행 환경이다.

Node.js는 Chrome의 V8 자바스크립트 엔진을 기반으로 동작하며, 네트워크나 파일 시스템 같은 서버 작업에 필요한 기능도 함께 제공합니다.12 그래서 우리는 자바스크립트로 파일을 읽고, 포트를 열고, HTTP 요청을 받고, 응답을 보낼 수 있습니다.

왜 Node.js가 서버에 잘 어울릴까?

Node.js가 인기 있는 이유는 "자바스크립트로 서버를 만들 수 있다"에서 끝나지 않습니다. 서버는 보통 여러 요청을 동시에 상대해야 하는데, Node.js는 이런 상황에 꽤 잘 맞는 구조를 가지고 있습니다.

핵심은 논블로킹 I/O입니다. 이름은 조금 딱딱하지만 뜻은 이렇습니다. 어떤 요청이 데이터베이스 응답을 기다리거나 파일 읽기가 끝나길 기다리는 동안, Node.js는 멍하니 서 있지 않고 다른 일을 처리하러 갑니다.1

카페 직원 비유로 다시 보면 더 쉽습니다. 어떤 손님이 "라떼 하나요"라고 주문했다고 해서 직원이 우유 데워질 때까지 기계 앞에서 얼어 있으면 비효율적이겠죠. 보통은 우유가 데워지는 동안 다른 손님의 주문도 받습니다. Node.js도 비슷합니다. 기다리는 시간을 낭비하지 않고 다른 요청을 처리합니다.

이런 특성 덕분에 Node.js는 네트워크 요청이 많고, 입력과 출력이 자주 일어나는 웹 서버나 API 서버에 잘 어울립니다.12

물론 처음부터 내부 구조를 깊게 파고들 필요는 없습니다. 지금은 이 정도만 이해하면 충분합니다.

  • Node.js는 서버에서 자바스크립트를 돌릴 수 있게 해준다.

  • 기다리는 작업이 있어도 다른 요청을 처리하는 데 유리하다.

  • 그래서 웹 서버와 API를 만들 때 많이 사용된다.

이 세 줄만 머릿속에 남아도 아주 좋은 출발입니다.

그런데 Node.js만으로는 왜 조금 불편할까?

여기서 중요한 사실 하나. Node.js는 프레임워크가 아닙니다.

Node.js 자체만으로도 HTTP 서버를 만들 수 있습니다. 실제로 Node는 기본 모듈만으로 웹 서버를 열 수 있고, 요청과 응답도 직접 다룰 수 있습니다.12 하지만 그 상태는 말하자면 맨손 요리와 비슷합니다. 할 수는 있는데, 칼도 직접 만들고 도마도 직접 깎는 느낌이 납니다.

예를 들어 서버를 만들다 보면 이런 일이 자주 필요합니다.

  • URL 경로별로 다른 동작 처리하기

  • GET, POST, PUT, DELETE 같은 메서드 구분하기

  • 요청 본문(JSON) 읽기

  • 에러를 한곳에서 처리하기

  • 중간에 로그인 검사나 로그 기록 같은 공통 작업 끼워 넣기

이런 기능을 Node.js만으로도 만들 수는 있습니다. 하지만 매번 직접 작성하면 코드가 길어지고, 반복이 많아지고, 금방 복잡해집니다. MDN 문서도 Node 자체만으로는 라우팅, 정적 파일 제공, 템플릿 처리 같은 일반적인 웹 개발 작업을 충분히 편하게 지원하지 않기 때문에 웹 프레임워크를 쓰는 편이 낫다고 설명합니다.2

바로 이 지점에서 Express가 등장합니다.

Express는 왜 필요한가?

Express는 Node.js 위에서 동작하는 웹 프레임워크입니다. 쉽게 말해, 서버 개발을 훨씬 편하게 만들어 주는 도구 상자입니다.23

Express를 쓰면 우리는 "요청이 오면 이 함수를 실행해 줘"를 아주 간단하게 적을 수 있습니다. 경로를 나누고, 메서드를 구분하고, 미들웨어를 끼우고, JSON 응답을 보내는 일이 자연스러워집니다.23

Node.js만 썼을 때와 Express를 썼을 때의 차이는 이렇습니다.

Node.js만 쓰면 벽돌부터 직접 구워서 집을 짓는 느낌입니다. Express를 쓰면 이미 잘 만들어진 공구와 자재를 쓰면서 집 구조에 더 집중할 수 있습니다.

Express가 특히 사랑받는 이유는 세 가지입니다.

  • 가볍다. 필요한 기능을 차근차근 얹어 갈 수 있다.3

  • 라우팅이 쉽다. URL과 HTTP 메서드별로 코드를 나누기 좋다.2

  • 미들웨어 구조가 강력하다. 요청 처리 사이사이에 공통 기능을 끼워 넣기 좋다.2

공식 사이트도 Express를 "minimal and flexible", 즉 작고 유연한 프레임워크라고 소개합니다.3 좋은 의미로 간섭이 적습니다. 그래서 작은 실습 서버부터 실제 서비스 API까지 폭넓게 사용할 수 있습니다.

Node.js와 Express의 관계를 한 문장으로 정리하면

많은 초보자가 여기서 헷갈립니다. Node.js와 Express가 경쟁 관계처럼 보일 때가 있거든요. 하지만 둘은 경쟁자가 아닙니다.

Node.js는 서버에서 자바스크립트를 실행하는 바탕이고, Express는 그 위에서 웹 서버를 편하게 만들게 도와주는 프레임워크입니다.23

비유하면 이렇습니다.

Node.js는 주방입니다. 가스레인지도 있고 냄비도 있습니다. 요리는 할 수 있습니다.

Express는 잘 정리된 조리 도구 세트입니다. 칼도 잘 들고, 양념도 정리되어 있고, 레시피를 적용하기도 편합니다.

즉, 우리는 이 책에서 Node.js라는 주방 위에 Express라는 도구를 올려서 서버를 만들게 됩니다.

아주 작은 미리보기: JavaScript 서버는 이렇게 생긴다

아직 설치나 실행은 다음 장에서 제대로 다룰 테니, 지금은 "아, 대충 이렇게 생겼구나" 정도만 보고 지나가면 됩니다.

자바스크립트로 쓴 가장 작은 Express 예시는 이런 모습입니다.

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

app.get('/', (req, res) => {
  res.send('안녕하세요, 서버입니다!');
});

app.listen(3000, () => {
  console.log('서버 실행 중');
});

이 코드를 지금 완벽히 이해하지 못해도 괜찮습니다. 눈여겨볼 것은 딱 세 가지입니다.

  • express()로 앱을 만든다.

  • app.get('/')로 / 요청을 처리한다.

  • app.listen(3000)으로 서버를 기다리게 만든다.

이 정도만 보면 됩니다. 나중에 다시 보면 "어? 이거 생각보다 짧네?" 하는 순간이 옵니다.

TypeScript 버전은 어떻게 달라질까?

이 책은 JavaScript로 먼저 설명하고, 뒤에서 TypeScript 버전으로 업그레이드합니다. 이 순서는 아주 좋습니다. 초보자에게는 먼저 흐름을 이해하는 것이 중요하고, 그다음에 타입 안전성을 더하는 편이 훨씬 자연스럽기 때문입니다.

TypeScript는 자바스크립트에 타입 정보를 더해 주는 언어입니다. 다시 말해, "이 값은 문자열인지 숫자인지", "이 함수가 무엇을 받는지"를 더 분명하게 적을 수 있게 해 줍니다. 결국 실행은 Node.js가 하고, TypeScript 코드는 보통 자바스크립트로 변환된 뒤 사용됩니다.4

Express 서버를 TypeScript로 쓰면 대략 이런 느낌이 납니다.

import express, { Request, Response } from 'express';

const app = express();

app.get('/', (req: Request, res: Response) => {
  res.send('안녕하세요, 타입이 있는 서버입니다!');
});

app.listen(3000, () => {
  console.log('서버 실행 중');
});

겉보기에는 비슷하죠. 하지만 Request, Response처럼 타입을 적을 수 있어서 코드의 의도가 더 선명해집니다. 규모가 커질수록 이런 차이는 꽤 크게 느껴집니다.4

초보자 관점에서는 이렇게 정리하면 됩니다.

  • JavaScript는 시작하기 쉽고 빠르다.

  • TypeScript는 실수를 더 일찍 발견하게 도와준다.

  • 처음엔 JavaScript로 개념을 잡고, 익숙해지면 TypeScript로 올라가면 좋다.

그래서 이 책도 그 순서를 따릅니다. 먼저 이해하고, 그다음 단단하게 만들겠습니다.

앞으로 우리가 자주 보게 될 단어들

첫 장이니, 앞으로 계속 만날 단어 몇 개를 가볍게 익혀 둡시다.

요청(Request)은 클라이언트가 서버에게 보내는 부탁입니다. 예를 들면 "할 일 목록 주세요"입니다.

응답(Response)은 서버가 돌려주는 결과입니다. 예를 들면 "여기 할 일 목록입니다"입니다.

라우트(Route)는 어떤 주소로 어떤 요청이 왔을 때 무엇을 할지 정한 규칙입니다. 예를 들어 /todos로 GET 요청이 오면 목록을 준다는 식입니다.

미들웨어(Middleware)는 요청과 응답 사이에서 끼어드는 중간 처리기입니다. 로그를 남기거나, 로그인 여부를 검사하거나, JSON을 해석하는 일 등을 맡습니다.2

JSON은 서버와 클라이언트가 데이터를 주고받을 때 자주 쓰는 텍스트 형식입니다. 자바스크립트 객체와 비슷하게 생겨서 금방 익숙해집니다.

이 단어들은 처음엔 조금 낯설어도, 결국은 모두 "요청을 잘 받고, 잘 처리해서, 잘 돌려주기 위한 부품들"입니다.

이 챕터의 핵심 한 장 요약

이제 오늘 내용을 한 번에 묶어 보겠습니다.

서버는 누군가의 요청을 받아 처리하고 응답하는 프로그램입니다. 웹사이트, 앱, API 뒤에는 늘 이런 서버가 있습니다.

Node.js는 자바스크립트를 브라우저 밖, 즉 서버에서도 실행할 수 있게 해주는 실행 환경입니다. 덕분에 우리는 자바스크립트로 서버를 만들 수 있습니다.1

하지만 Node.js만으로 서버를 만들면 할 수 있는 건 많아도 손이 많이 갑니다. 그래서 라우팅, 요청 처리, 미들웨어 같은 웹 개발의 공통 작업을 더 편하게 다루기 위해 Express를 사용합니다.23

그리고 이 책은 JavaScript로 먼저 출발합니다. 서버가 어떻게 움직이는지 이해한 뒤, TypeScript로 더 안전하고 유지보수하기 좋은 구조로 발전시킬 것입니다.4

즉, 우리가 하려는 일은 이것입니다.

Node.js 위에 Express를 올려서, 요청을 받고 응답하는 서버를 만드는 것.

이 문장만 확실히 붙잡고 다음 장으로 넘어가면 됩니다. 아직 코드를 많이 안 쳤는데도 벌써 절반은 이해한 셈입니다. 서버는 정체불명의 괴물이 아니라, 부탁을 잘 들어주고 대답을 잘하는 프로그램이니까요.

참고

1Node.js 소개와 기본 HTTP 서버 개념

2MDN의 Express/Node 소개와 Express의 역할 설명

3Express 공식 사이트 소개

4Node.js와 Express에서 TypeScript를 사용하는 기본 개념

책 목록

처음부터 배포까지, Node.js Express 서버 수업

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기