Blog

2시간만에 웹서버 쉽게 개발하기 (Node.js + MongoDB)

2시간만에 웹서버 쉽게 개발하기 (Node.js + MongoDB)

Web server development

프로젝트를 시작하고 싶으신가요?​

우리 팀은 귀하의 아이디어를 구현할 준비가 되어 있습니다. 귀하의 로드맵에 대해 논의하려면 지금 저희에게 연락하십시오!​

서버 개발? 두렵지 않다. 그냥 localhost:3000에서 내 코드가 숨 쉬는 걸 보고 싶다면, 당신은 제자리에 왔다. 복잡한 이론은 접어둬라. 우리는 지금부터 JavaScript 하나로 프론트엔드는 물론이고, 백엔드까지 쓸어버릴 것이다. 이건 단순한 코딩이 아니다. 그것은 ‘풀스택’으로의 선언식이다.

오늘 우리가 사용할 무기는 바로 Node.jsMongoDB다. 왜 이 조합인가? 궁금하지? Node.js는 Chrome V8 엔진으로 구동되는 비동기 자바스크립트 런타임이다. 쉽게 말해, 자바스크립트를 서버 언어로 만들어주는 ‘혁명’이나 다름없다. 여기에 더해, MongoDB는 JSON처럼 유연한 구조를 가진 NoSQL DB다. 테이블과 컬럼의 딱딱한 규칙에서 벗어나, 생각한 대로 데이터를 저장할 수 있다 .

황금률: “서버는 어렵다”는 말은 이제 지난 세대의 유물이다. 백엔드는 더 이상 ‘어두운 마법’이 아니다. 그저 하나의 도구일 뿐이다.

준비운동: 개발 환경 셋팅

핑계는 그만. 터미널을 열자. 아직 Node.js가 없다면 공식 문서에서 LTS 버전을 받는다. 설치는 ‘다음’만 누르면 끝나는 단순한 작업이다.

프로젝트 폴더를 만들고, 아래 명령어를 터미널에 그대로 복사해 붙여넣는다. 이것이 당신의 첫 번째 지배 명령어다.

npm init -y
npm install express mongodb

express는 서버의 뼈대를 만들어주는 프레임워크고, mongodb는 우리의 DB와 대화할 드라이버다 . 패키지가 설치되는 이 30초 동안, 당신은 이미 옛날에 index.html만 만지던 사람과는 다른 존재가 되어 있다.

1단계: Express 서버 띄우기 & MongoDB 연결

이제 진짜다. server.js 파일을 하나 생성하고, 아래 코드를 입력하라. 노가다 금지 – 복사-붙여넣기는 프로그래머의 미덕이다.

const express = require('express');
const { MongoClient } = require('mongodb');

const app = express();
const port = 3000;

// MongoDB 연결 URI (Atlas 클라우드 추천, 직접 로컬 설치도 가능)
// 실제 연결 시 에러 핸들링은 필수다.
const uri = "여기에_너의_MongoDB_주소를_넣어라";

MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(client => {
    console.log('✅ DB 연결 성공!');
    const db = client.db('myFirstDatabase');
    // 라우팅 로직은 여기서 실행된다.
  })
  .catch(err => console.error('❌ 연결 실패:', err));

app.listen(port, () => {
  console.log(`🟢 서버 기동 완료: http://localhost:${port}`);
});

여기서 잠깐. 로컬에 MongoDB를 설치하기 귀찮다면? 그래, 그게 맞다. 누가 내 컴퓨터에 더미 데이터를 저장하려고 들까. MongoDB Atlas를 사용하자. 클라우드에서 호스팅되는 DB는 무료 티어로도 충분하고, 보안과 안정성 모두 잡을 수 있다 .

2단계: 실제 데이터 주고받기 (CRUD의 마법)

서버가 살아있으니 이제 움직여야 한다. 프런트엔드에서 메뉴판을 보듯, 백엔드도 요청을 받아야 한다. app.listen 위에 아래 라우터를 얹어보자.

Method Endpoint 기능 MongoDB 메서드
POST /api/message 데이터 저장 insertOne()
GET /api/messages 전체 조회 find()
DELETE /api/message/:id 데이터 삭제 deleteOne()

데이터 쓰기와 읽기

app.use(express.json()); // JSON 파싱 설정

// 1. 데이터 저장하기 (POST 요청)
app.post('/api/message', async (req, res) => {
  try {
    const { title, content } = req.body;
    const result = await db.collection('posts').insertOne({ title, content, status: 'active' });
    res.status(201).json(result);
  } catch (err) {
    res.status(500).json({ message: '서버 에러 발생' });
  }
});

// 2. 데이터 가져오기 (GET 요청)
app.get('/api/messages', async (req, res) => {
  const cursor = db.collection('posts').find({});
  const results = await cursor.toArray();
  res.send(results);
});

주의 깊게 봐야 할 점: find({})를 비워두면 모든 데이터를 가져온다. 프로젝트가 커지면 인덱싱 없이는 속도가 느려진다는 사실을 명심하라 . 지금은 몰라도 좋다. 하지만 적어도 ‘내일의 나’가 서버를 켜놓고 “아, 쿼리가 왜 이렇게 느리지?” 하며 머리를 쥐어뜯는 광경을 원하지 않는다면 말이다.

배포: 세상에 내보이기

로컬에서 만족하지 마라. 세상은 넓고, 당신의 API를 기다리는 클라이언트가 있다. AWS EC2 인스턴스를 하나 빌려서 배포해보자 .

  1. 원격 서버 연결: SSH로 EC2에 접속한다.
  2. 환경 세팅: sudo apt install nodejs npm을 입력해 Node.js를 설치한다.
  3. 무중단 실행: 여기서 node server.js로 실행하면 터미널을 끄는 순간 서버도 같이 꺼진다. 초보자 함정이다. 우리는 PM2를 사용한다. npm install -g pm2pm2 start server.js를 입력하면 서버가 데몬 형태로 영원히 살아있다.

마무리: 이제 당신의 차례다

기쁜 소식과 슬픈 소식이 있다. 기쁜 소식은 이론상 2시간 안에 게시판 하나쯤은 뚝딱 만들 수 있다는 것이다 . 슬픈 소식은? 이제 당신은 ‘그냥 개발자’가 아니라 ‘서버를 다루는 자’라는 타이틀을 짊어져야 한다는 점이다.

단순히 따라 적지 말라. 코드 한 줄 한 줄에 의문을 가져라. 왜 비동기(async/await)를 써야 할까? MVC 패턴은 왜 중요할까? 이 글을 닫으면, 바로 터미널을 열어라. 진정한 개발자는 ‘보는 자’가 아닌 ‘실행하는 자‘에게만 찾아온다.

지금 바로 행동하라. localhost:3000에서 당신의 코드를 확인해보자.


이 포스팅은 현장 경험을 바탕으로 작성되었으며, 특정 제품에 대한 광고를 포함하지 않습니다.

다음
위로 스크롤

Thank you for contacting us, we will contact you as soon as possible!