[Node.js] 1. Express 서버 구성하기

진욱·2025년 7월 1일

NodeJS

목록 보기
1/5
post-thumbnail

들어가며

진행 중인 Front-end 프로젝트도 끝나고, 면접을 위한 공부를 이것저것 하던 중 문득 "서버를 한 번 만들어보면 쓸 데가 있지 않을까?" 라는 생각이 들었다. Next.js를 배울 때 Express를 다루었던 경험도 있어서 Node.js 기반의 Express 프레임워크를 빠르게 공부하고 서버를 구성해 보았다.

이번 시리즈에서는 아주 기본적인 서버만 구성하고, 이를 AWS EC2에 올린 후 도메인까지 연결 및 CI/CD까지 구축하는 과정을 기록해보려 한다.


Express

📍 Express란?

Node.js는 Chrome의 V8 엔진을 이용해 JavaScript로 브라우저가 아닌 서버를 구축하고, 서버에서 JavaScript가 작동하도록 하는 런타임 환경이다. Express는 이 Node.js 런타임 환경에서 구동되는 웹 프레임워크이다.

📍 왜 Express일까?

Express는 프레임워크이므로 웹 애플리케이션을 만들기 위한 각종 라이브러리와 미들웨어가 내장되어 있기 때문에 개발이 편리하고, 개발자들에게 개발 규칙을 강제하여 구조 및 코드의 통일성을 향상할 수 있다.

또한 JavaScript 기반이기 때문에 새로운 언어에 대한 러닝 커브가 존재하지 않으며(개인적), 검색을 통해 충분한 레퍼런스들을 얻을 수 있다는 장점이 있다.

📍 Express 설치

애플리케이션을 위한 디렉토리를 생성한 후 디렉토리 내부로 이동한다.

$ mkdir test-server
$ cd test-server

애플리케이션에 package.json 파일을 생성한다.

$ npm init

Express를 설치한다.

$ npm install express

Express 서버 구동을 위해 app.js 파일을 생성한 후 다음 코드를 붙여넣는다.

import express from 'express';

const app = express();

const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

터미널에서 app.js 파일을 실행한 후 브라우저로 이동해 http://localhost:3000에서 "Hello World!"가 잘 출력되는지 확인한다.

$ node app.js

# package.json의 script에 명령어 ⇒ "dev": "node app.js" 를 등록했다면 
$ npm run dev

이로써 간단한 서버 구성을 완료하였고, 프로젝트를 GitHub 레포지토리에 업로드하여 EC2에서 이용할 수 있도록 준비한다.

🚨 참고: Express Generator 활용

Express는 애플리케이션의 보일러 플레이트를 빠르게 생성하는 Express Generator도 제공한다. 이 방식을 활용하면 다음과 같은 폴더 구조를 자동으로 생성할 수도 있다.

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.jade
    ├── index.jade
    └── layout.jade

7 directories, 9 files

EC2 배포

이제 이 서버를 EC2에 올리는 과정을 진행한다.

⚠️ 지금부터 진행하는 과정은 AWS Console 내에서 이루어지므로 반드시 AWS 계정이 필요하다.

1️⃣ VPC 생성

서버를 EC2에 배포하기 위해 먼저 EC2를 생성해야 한다. 그 전에 EC2를 배치하기 위한 VPC를 먼저 구성한다.

AWS VPC(Virtual Private CLoud)는 AWS에서 제공하는 가상 네트워크로, 클라우드 내에서 사용자에게 독립적이고 격리된 네트워크 환경을 제공한다. EC2 인스턴스를 생성하기 전에 VPC를 먼저 생성하는 이유는 EC2 인스턴스를 VPC 내에서 실행함으로써 해당 인스턴스를 다른 네트워크와 격리하고, 필요한 보안 설정을 하는 등 세부적으로 제어할 수 있기 때문이다.

VPC가 없는 구조VPC를 적용한 구조

VPC가 없다면 위의 그림과 같이 시스템의 복잡도가 증가할 뿐만 아니라 하나의 인스턴스가 추가될 때 모든 인스턴스의 세부 사항을 수정해야 하는 불편함이 생길 수 있다. 따라서 우리가 사용할 인스턴스에 VPC를 적용하여 독립된 네트워크처럼 동작할 수 있도록 한다.

AWS의 VPC 메뉴로 이동한 후 VPC를 생성한다.

VPC 생성

[VPC 생성]

  • 생성할 리소스로 VPC 등을 선택한다.
  • VPC 이름을 지정한다.
  • Public 서브넷과 Private 서브넷이 잘 생성되는지 확인한다.

2️⃣ EC2 생성

EC2 생성을 위해 AWS EC2 메뉴로 이동해 인스턴스를 생성한다.

인스턴스 OS 선택키 페어 생성

[인스턴스 OS 선택]

  • 인스턴스의 이름을 지정한다.
  • 프리 티어로 사용 가능한 Ubuntu 24.04 LTS 이미지를 선택한다.

[키 페어 생성]

  • 키 페어를 .pem 형식으로 설정한다. SSH 방식으로 인스턴스에 접속한다면 이 키 페어를 잘 보관해야 한다.
네트워크 설정 편집보안 그룹 규칙 추가

[네트워크 설정 편집]

  • 1단계에서 생성한 VPC를 선택한다.
  • 외부에서 EC2에 접근할 수 있도록 Public 서브넷을 선택한다.
  • 퍼블릭 IP 자동 할당을 활성화한다.

[보안그룹 규칙 추가]

  • 보안 그룹을 생성하고 기존 SSH 접속 외에 보안 그룹 규칙을 추가한다.
    • 사용자 지정 TCP 유형을 추가하고 3000번 포트를 개방한다. (Express에서 3000번 포트를 사용하기 때문!)
    • HTTP 유형과 HTTPS 유형을 추가한다.
    • 소스 유형은 외부에서 접근할 수 있도록 위치 무관(Anywhere IPv4)으로 설정한다.

나머지 설정은 그대로 두고 EC2 생성을 마무리한다.


3️⃣ EC2의 IAM 역할 생성

EC2 접속이 어렵지는 않지만 Linux 기반의 EC2에서 서버의 코드를 변경하는 것은 너무 번거로운 일이고, Git을 이용한다고 해서 변경 사항이 발생할 때마다 인스턴스에 접속해 git pull origin main 명령어를 실행하는 것은 비효율적인 작업일 것이다.

이를 위해 GitHub 브랜치의 코드가 업데이트되면 EC2에 있는 서버의 코드도 업데이트하는 CI/CD 환경을 구축할 예정인데, 이를 위해 EC2의 IAM 역할이 필요하다.

AWS의 IAM 메뉴로 이동한 후 역할을 생성한다.

엔티티 선택권한 추가

[엔티티 선택]

  • 신뢰할 수 있는 엔티티 유형은 AWS 서비스를 선택한다.
  • 서비스 또는 사용 사례에서 EC2를 선택한다.

[권한 추가]

  • 권한 정책에서 AmazonEC2RoleforAWsCodeDeploy 권한을 추가한다.

마지막으로 역할 이름까지 지정하면 EC2의 IAM 역할이 생성이 완료된다. 이 IAM 역할을 EC2 인스턴스에 등록해야 한다.

EC2의 인스턴스 메뉴에서 작업 메뉴를 클릭해보면 보안 > IAM 역할 수정 메뉴가 있을 것이다. IAM 역할 수정으로 이동한다.

IAM 역할에 생성한 EC2의 IAM 역할을 선택하고 역할을 업데이트한다.

※ 중요! IAM 역할 업데이트 이후에 꼭 EC2를 재부팅해야 한다! 그래야 IAM 역할이 정상적으로 업데이트될 것이다.


4️⃣ EC2 접속 및 설정

이제 EC2에 접속한다. EC2는 터미널에서 SSH를 이용해 접속할 수도 있지만 나는 AWS Console을 이용하였다. EC2에 접속하면 다음과 같은 Linux 환경을 마주할 것이다.

이 Linux 환경에서 패키지 업데이트, Node.js 설치를 진행한다. 나는 Linux 사용 경험이 있기에 큰 어려움이 없긴 했지만, Linux를 처음 사용하더라도 사실 크게 어려운 명령어를 사용할 일은 없기 때문에 겁먹을 필요는 없다고 생각한다.

➀ 인스턴스 패키지 최신화 및 최신 버전 업그레이드

$ sudo apt update
$ sudo apt upgrade

Linux는 패키지 설치를 위해서 apt (Advance Packging Tools)) 명령어를 사용한다. apt는 기존의 apt-get, apt-cache 등의 통합으로 나온 패키지 매니징 툴로, update를 이용해 패키지 최신화, upgrade를 이용해 최신 버전이 있다면 업그레이드를 진행한다.

➁ Node.js 설치

🚨 공식문서 참고

AWS는 EC2 인스턴스에서 Node.js를 설정하는 법을 자세히 설명하고 있다. 특히 nvm, Node.js의 버전은 계속해서 업데이트 될 수 있으므로 꼭 자습서를 확인해 최신화 하는 것이 좋다.

➁ - 1. curl 설치

$ sudo apt install curl
$ curl --version # curl 버전 확인

Node.js 설치를 위해 curl을 먼저 설치해야 한다. curl(client url)은 프로토콜들을 이용해 URL로 데이터를 전송하여 서버에 데이터를 보내거나 가져올때 사용하기 위한 명령줄 도구 및 라이브러리이다.

➁ - 2. nvm 설치

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

curl 버전을 확인하여 curl이 잘 설치되었다면, 이 curl을 이용해 nvm(node version manager)를 설치한다.

➁ - 3. nvm 활성화

$ . ~/.nvm/nvm.sh

nvm을 활성화한다.

➁ - 4. Node.js 설치

$ nvm install --lts

nvm을 이용해 최신 LTS 버전의 Node.js 설치한다.

➁ - 5. Node.js 실행 확인

$ node -e "console.log('Running Node.js ' + process.version)"

Node.js가 잘 실행되는지 확인한다. 다음과 같이 실행 중인 Node의 버전이 잘 나타나면 성공!


5️⃣ 프로젝트 clone

위에서 생성한 Express 프로젝트를 EC2 서버로 옮겨올 차례이다.

git 설치

$ sudo apt install -y git

먼저 GitHub의 원격 저장소에 접근하기 위해 git을 설치한다. (-y 옵션은 모든 옵션을 Yes로 설정한다는 의미이다.)

➁ 레포지토리 clone

$ git clone <GitHub 레포지토리 주소>

GitHub 레포지토리의 초록색 Code를 클릭한 후 나오는 레포지토리 주소를 복사한 후, git clone 뒤에 붙여넣는다.

예시) git clone https://github.com/JWJung-99/Test-Server.git

➂ 패키지 설치

npm install

필요한 패키지들을 설치한다.

➃ 서버 실행

node app.js

# package.json의 script에 명령어 ⇒ "dev": "node app.js" 를 등록했다면 
$ npm run dev

처음 Express 코드를 작성한 후 로컬에서 서버를 실행한 것과 마찬가지로, app.js 파일을 실행하여 서버를 구동한다.

➄ 서버 접속

브라우저에서 http://<EC2의 퍼블릭 IP 주소>:3000 주소로 접속했을 때 app.js 파일에 설정한 "Hello World!"가 등장한다면 성공!

만약 이 방법대로 진행했는데 서버 접속이 되지 않는다면 이는 방화벽 때문이므로, EC2의 보안 그룹으로 이동하여 인바운드 규칙이 다음과 같이 설정되어 있는지 확인해야 한다.


마치며

지금까지 Express 서버를 생성하고 이를 EC2에서 실행하는 과정까지 진행해 보았고, 다음 순서에서 GitHub를 연동한 CI/CD 구축, 서버 도메인 연결 등의 과정을 소개해 볼 예정이다.


참고

0개의 댓글