Express.js 애플리케이션을 배포하는 방법은 무엇인가요?
애플리케이션이 성장함에 따라 쉽게 확장하려면 올바른 배포 옵션을 선택하는 것이 필수적입니다. 이 문서에서는 Express.js 애플리케이션에 사용할 수 있는 다양한 배포 옵션을 살펴봅니다. 특히, Express.js 애플리케이션을 Back4app 컨테이너에 배포하는 방법에 중점을 둡니다.
Contents
- 1 Express.js란 무엇인가요?
- 2 Express.js 사용의 장점
- 3 Express.js의 단점
- 4 Express.js 배포 옵션
- 5 Back4app 컨테이너에 Express 애플리케이션을 배포하는 방법
- 6 전제 조건
- 7 간단한 Express API 만들기
- 8 Express 애플리케이션 도커화
- 9 Back4app 컨테이너에 도커화된 Express 애플리케이션 배포하기
- 10 Docker 이미지를 최적화하는 방법
- 11 결론
- 12 자주 묻는 질문
- 13 Express.js란 무엇인가요?
- 14 Express.js 애플리케이션의 배포 옵션은 무엇인가요?
- 15 Express.js 애플리케이션을 Back4app 컨테이너에 배포하는 방법은 무엇인가요?
Express.js란 무엇인가요?
Express는 복잡한 웹 및 모바일 API를 구축하는 과정을 간소화하는 Node.js 위에 구축된 비오피니언 경량 프레임워크입니다.
API 경로의 엔드포인트를 쉽게 정의하고 이를 핸들러 함수에 매핑할 수 있는 간단한 라우팅 시스템을 제공합니다.
또한 요청-응답 주기에서 로깅, 인증, 오류 처리 등의 기능을 추가할 수 있는 미들웨어를 지원합니다.
Express.js 사용의 장점
Express 사용의 몇 가지 장점은 다음과 같습니다:
- 미니멀하고 사용이 간편합니다: Express.js는 라우팅과 같은 일부 Node.js 기능의 복잡성을 추상화합니다. API 요청과 응답을 처리하는 간단한 방법을 제공합니다.
- 확장성이 뛰어납니다: Express.js는 대규모 커뮤니티를 통해 애플리케이션에 쉽게 통합할 수 있는 광범위한 NPM 패키지 및 확장 기능 에코시스템을 제공합니다.
- 고성능: 최소한의 설계와 Node의 논블로킹, 이벤트 중심 아키텍처를 활용하기 때문에 Express는 성능이 매우 뛰어납니다.
- 강력한 커뮤니티 지원: Express.js는 2010년부터 사용되었습니다. 이 기간 동안 많은 개발자가 이를 채택했습니다. 따라서 문제가 발생했을 때 도움을 받을 수 있는 대규모 커뮤니티가 Express와 함께 구축되어 있습니다. 또한 Express의 작동 방식을 설명하는 많은 기사, 튜토리얼, 잘 작성된 문서가 있습니다.
Express.js의 단점
다음은 Express.js의 몇 가지 단점입니다:
- 의견이 없습니다: Nest.js와 같은 프레임워크에 비해 Express.js는 의견이 분분합니다. 의견이 많지 않다는 것은 프로젝트 구조와 조직에 대한 결정을 내려야 한다는 것을 의미하며, 특히 여러 가지 방법이 있는 경우 지루할 수 있습니다.
- 기본 제공 기능이 부족합니다: Express.js는 사전 구성이 되어 있지 않으며 로깅과 같은 대부분의 고급 기능을 사용하려면 추가 종속성을 설치해야 합니다.
Express.js 배포 옵션
서비스형 인프라(IaaS)
서비스형 인프라는 인터넷을 통해 컴퓨팅, 네트워크, 스토리지 리소스를 온디맨드 방식으로 제공하는 클라우드 컴퓨팅 서비스입니다.
IaaS를 사용하면, 사용자는 애플리케이션의 리소스를 프로비저닝하고 구성할 책임이 있으며, IaaS 제공업체는 기본 물리적 인프라를 유지 관리합니다. 예를 들어 Express 애플리케이션을 배포하려는 경우, 선택한 IaaS 제공업체에서 가상 머신을 생성하고 구성할 수 있습니다.
VM에 Node 및 npm과 같은 필요한 종속성을 설치한 다음 Express 코드를 VM에 추가해야 합니다. 그런 다음 VM에서 Express 애플리케이션을 시작하면 인터넷을 통해 액세스할 수 있습니다.
IaaS의 주요 장점 중 하나는 제어 수준이 높다는 점입니다. 애플리케이션의 필요에 맞게 가상 머신의 CPU, 메모리, 스토리지 리소스를 사용자 지정할 수 있습니다.
하지만 이 접근법의 몇 가지 단점을 고려하는 것이 중요합니다.
애플리케이션의 규모와 수요 변화에 따라 인프라와 리소스를 관리하는 일은 복잡하고 시간이 많이 소요될 수 있습니다.
인기 있는 IaaS 제공업체는 다음과 같습니다:
- Microsoft Azure
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
서비스형 컨테이너(CaaS)
서비스형 컨테이너(CaaS) 는 기본 인프라를 추상화하여 컨테이너화된 애플리케이션을 신속하게 배포하고 실행할 수 있도록 하는 클라우드 서비스 모듈입니다.
Express 애플리케이션을 CaaS 제공업체에 배포하려면, Docker와 같은 컨테이너화 도구를 사용하여 애플리케이션을 실행하는 데 필요한 코드, 종속성, 런타임을 컨테이너에 패키징합니다. 컨테이너를 생성한 후에는 배포합니다. CaaS 공급자는 컨테이너를 실행하는 데 필요한 인프라를 프로비저닝하고 관리합니다.
CaaS 사용의 가장 큰 장점은 높은 수준의 추상화로 인해 낮은 수준의 인프라 구성에 대해 걱정할 필요가 없기 때문에 배포가 간소화된다는 점입니다. 대신 애플리케이션의 로직을 구축하는 데 집중할 수 있습니다. 또한 컨테이너화는 애플리케이션이 여러 환경에서 일관되게 실행되도록 보장합니다.
인기 있는 CaaS 제공업체는 다음과 같습니다:
- Back4app Containers
- Amazon Elastic Container Service (ECS)
- Google Kubernetes Engine (GKE)
Back4app 컨테이너에 Express 애플리케이션을 배포하는 방법
전제 조건
이 튜토리얼을 따라 하려면 다음 사항이 준비되어 있는지 확인하세요:
- 컴퓨터에 Node.js가 설치되어 있습니다.
- GitHub 계정.
- 컴퓨터에 Docker가 설치되어 있어야 합니다. 설치되어 있지 않은 경우 Docker 사이트를 방문하여 Docker 데스크톱을 설치하세요.
- Express.js에 대한 실무 지식.
Back4app 컨테이너 개요
Back4app 컨테이너는 서버 측 인프라를 관리하여 배포를 자동화하는 플랫폼입니다.
Back4app 컨테이너의 일부 기능은 다음과 같습니다:
- GitHub 통합: 코드 베이스가 변경될 때 애플리케이션을 자동으로 배포할 수 있도록 GitHub 리포지토리를 Back4app에 연결할 수 있습니다.
- Docker 배포: 널리 사용되는 컨테이너화 도구인 Docker를 사용하여 애플리케이션 코드를 컨테이너에 패키징할 수 있습니다. 이렇게 하면 애플리케이션이 여러 환경에서 예측 가능한 방식으로 작동합니다.
- 자동 배포: GitHub 리포지토리를 Back4app에 연결하면 기본 브랜치에 코드를 푸시할 때마다 배포가 트리거됩니다.
- 실시간 배포 추적: 배포의 상태와 진행 상황을 확인할 수 있습니다.
- 실시간 애플리케이션 모니터링
- 다운타임 없는 업데이트
프로젝트 소개
이 가이드에서는 Express 애플리케이션을 Back4app에 배포하는 과정을 안내합니다. 먼저 단일 엔드포인트로 간단한 Express REST API를 만들고, Docker를 사용하여 도커화한 다음, 이를 GitHub에 푸시합니다. 그런 다음 이를 Back4app 컨테이너에 배포합니다.
간단한 Express API 만들기
아래 단계에 따라 Express 애플리케이션을 만들 수 있습니다:
- 터미널에서 다음 명령을 실행하여 새 Node.js 프로젝트를 초기화합니다.
npm init
이 명령은 패키지 이름, 버전, 설명, 진입점, 작성자 및 라이선스와 같은 애플리케이션 세부 정보를 입력하라는 메시지를 표시합니다. 응답하면 이러한 구성이 포함된 package.json 파일이 생성됩니다.
기본 구성을 사용하려면 아래와 같이 -y 플래그를 사용하세요:
npm init -y
- 이 명령을 실행하여 Express를 종속성으로 설치하세요.
npm install express
- 프로젝트 폴더의 루트에서 index.js 파일을 만듭니다. 엔트리 포인트 파일에 다른 이름을 지정한 경우 해당 이름을 사용합니다.
- index.js 파일을 열고 Express 애플리케이션의 인스턴스를 만듭니다.
const express = require('express');
const app = express();
- “/” 엔드포인트에 대한 GET 요청을 처리하는 라우트 핸들러를 추가합니다.
app.get("/", (req, res) => {
res.json({
message: "Success",
});
});
이 엔드포인트는 JSON 메시지를 응답으로 보냅니다.
- 포트 번호를 정의하고 지정된 포트에서 들어오는 요청을 수신 대기합니다.
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`App listening at <http://localhost>:${port}`);
});
process.env.PORT는
PORT라는 환경 변수를 참조합니다. 이 값이 .env 파일에 정의되어 있지 않으면 애플리케이션은 3000 값을 사용합니다.
- 다음 명령을 실행하여 Express 서버를 시작합니다.
node index.js
브라우저에서 http://localhost:3000/api 을 방문하면 다음과 같은 응답이 표시됩니다.
{
"message": "Success!"
}
이것은 Express API의 매우 기본적인 예시이며 실제 애플리케이션은 더 많은 엔드포인트, 외부 데이터, 미들웨어 등으로 인해 더 복잡할 것입니다.
이 글의 목적상, 도커화된 Express 애플리케이션을 배포하는 방법을 설명하는 것으로 충분합니다.
Express 애플리케이션 도커화
Express.js 애플리케이션을 도커라이징하는 것은 다양한 환경에서 애플리케이션을 더 쉽게 실행할 수 있도록 애플리케이션을 위한 도커 컨테이너를 만드는 것을 의미합니다.
도커란 무엇인가요?
Docker는 애플리케이션, 런타임, 라이브러리 및 종속성을 격리된 휴대용 컨테이너 환경에서 패키징할 수 있는 오픈 소스 도구입니다.
이 컨테이너 내에서 애플리케이션을 캡슐화함으로써 Docker는 기본 호스트 시스템과 관계없이 애플리케이션이 실행될 수 있는 일관된 환경을 제공합니다.
이렇게 하면 “내 컴퓨터에서 작동한다”는 문제가 사라집니다. 로컬 환경에서 Express 애플리케이션을 작업하고, 컨테이너화하여 호환성 문제에 대한 걱정 없이 여러 환경에 배포할 수 있습니다.
Docker 설치
Docker는 macOS, Windows, Linux 등 여러 플랫폼에서 실행할 수 있습니다. 공식 웹사이트에서 사용 중인 OS에 맞는 Docker를 다운로드하여 설치할 수 있습니다.
Express.js 애플리케이션을 도커라이즈하는 방법
Docker를 설치한 후에는 애플리케이션을 도커화해야 합니다. 즉, 애플리케이션을 Docker 컨테이너에 패키징해야 합니다.
아래 단계를 따르세요:
- 프로젝트의 루트에서
Dockerfile이라는
파일을 만듭니다. 이 파일에는 Express 애플리케이션용 Docker 이미지를 빌드하기 위한 지침이 포함되어 있습니다.
- 일반적으로 Docker파일을 만들 때 가장 먼저 하는 일은 기본 이미지를 지정하는 것입니다. 기본 이미지는 애플리케이션 이미지의 시작점 역할을 하는 미리 빌드된 이미지로, 일반적으로 애플리케이션 실행을 위한 최소한의 지침이 포함되어 있습니다.
- 그런 다음 Docker파일에서 이 이미지 위에서 실행할 지침과 구성을 제공할 수 있습니다. 사용자 지정 기본 이미지를 직접 만들 수도 있지만 대부분의 경우 충분한 공식 이미지가 Docker에 제공됩니다.
- 이 가이드에서는 노드 기본 이미지, 특히 크기가 작은 알파인 변형을 사용하겠습니다. 도커파일에 다음을 추가하여 이 기본 이미지를 지정해 보겠습니다.
FROM node:20-alpine
여기서 node:20-alpine은
Node.js 버전 20과 함께 사전 설치되어 제공됩니다.
- 다음 줄을 추가하여 컨테이너 내부의 작업 디렉터리를 설정합니다.
WORKDIR /usr/src/app
- package.json 및 package-lock.json을 작업 디렉터리에 복사합니다. 여기에는 Docker가 설치해야 하는 모든 종속성이 나열됩니다.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
- 종속성 설치 명령을 추가합니다.
RUN npm install
- 나머지 코드를 컨테이너의 작업 디렉터리에 복사합니다.
COPY . .
- Express 애플리케이션이 수신하는 포트 번호를 노출합니다. 이 경우 포트 3000입니다.
expose 3000
- 애플리케이션을 시작하기 위한 명령을 추가합니다.
CMD["node", "index.js"]
전체적으로 DockerFile은 다음과 같은 모습이어야 합니다:
FROM node:20-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "index.js" ]
.dockerignore 파일 추가
.dockerignore 파일은 Docker가 무시할 파일을 지정합니다. 이 파일을 사용하면 불필요한 파일을 무시할 수 있어 Docker 이미지의 크기를 줄일 수 있습니다. 또한 이미지에서 민감한 파일을 숨기는 데 도움이 됩니다.
프로젝트에 추가하려면 프로젝트 베이스에 파일을 만들고 이름을.dockerignore
로 지정합니다. 여기에 다음 내용을 추가합니다.
.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*
위의 파일은 git 파일, 노드 모듈, 로그 및 환경 변수가 Docker 이미지로 복사되는 것을 방지합니다.
로컬에서 도커 이미지 빌드
프로젝트 디렉터리에서 다음 명령을 실행하여 Docker 이미지를 빌드합니다.
docker build -t docker-express-api .
t
플래그는 태그를 나타내며 도커 이미지에 의미 있는 이름을 지정할 수 있습니다. 끝에 있는 점(.)은 현재 디렉터리에서 Docker파일을 찾아 그 안에 있는 지침을 실행하도록 Docker에 지시합니다.
로컬에서 Docker 이미지 실행
Docker 이미지를 빌드한 후에는 다음 명령을 사용하여 Express 애플리케이션을 실행합니다:
docker run -p 3000:3000 docker-express-api
여기서 -p 3000:3000은
로컬 호스트의 포트 3000을 컨테이너의 포트 3000에 매핑합니다. 브라우저에서 http://localhost:3000 을 방문하면 애플리케이션에 액세스할 수 있습니다.
실행 중인 Docker 인스턴스를 보려면 다음 명령을 사용하세요:
docker ps
인스턴스를 중지하려면 실행합니다:
docker stop docker-express-api
Back4app 컨테이너에 도커화된 Express 애플리케이션 배포하기
이제 Docker 이미지가 로컬에서 실행되도록 했으므로 Back4app에 배포해야 합니다.
Express 애플리케이션을 GitHub에 푸시
Backapp은 GitHub에서 애플리케이션을 배포합니다. 따라서 아래 단계에 따라 애플리케이션 리포지토리를 GitHub로 푸시해야 합니다:
- GitHub 사이트로 이동하여 계정에 로그인합니다.
- 로그인한 후 페이지 오른쪽 상단에서 “+” 아이콘을 찾아 클릭합니다. 드롭다운 메뉴에서 “새 리포지토리”를 선택합니다.
- “새 리포지토리 만들기” 페이지에서 리포지토리 이름을 지정합니다. 이 가이드에서는 “express-api”를 사용하겠습니다. “리포지토리 이름 만들기” 버튼을 클릭합니다. 다음 페이지에서 리포지토리의 URL을 기억해 두세요. 로컬 리포지토리를 GitHub로 푸시할 때 필요하기 때문입니다.
로컬 컴퓨터에서 프로젝트 폴더로 이동하여 다음 명령을 실행하여 애플리케이션을 GitHub의 원격 리포지토리로 푸시합니다.
git remote add origin <https://github.com/remigathoni/express-api.git>
git branch -M main
git push -u origin main
GitHub 리포지토리에서 앱의 파일을 볼 수 있어야 합니다.
Express 애플리케이션 배포
Back4app에 앱을 배포하려면 아래 단계를 따르세요:
- Back4app으로 이동하여 계정을 등록합니다. 이미 계정이 있는 경우 로그인합니다. 인증 후 Back4app에서 대시보드로 리디렉션됩니다.
- 대시보드에서 새 앱 만들기 버튼을 클릭합니다. 서비스형 백엔드와 서비스형 컨테이너의 두 가지 옵션이 표시됩니다. BaaS는 사용자를 대신하여 백엔드를 처리하는 반면, CaaS는 컨테이너화된 환경에서 애플리케이션을 배포할 수 있습니다. 애플리케이션만 배포하려는 경우 서비스형 컨테이너를 클릭합니다.
- 메시지가 표시되면 Back4app에 GitHub 계정에 대한 액세스 권한을 부여하고 Express 리포지토리를 선택합니다.
- 배포된 앱의 이름을 지정합니다. 이 가이드에서는 “배포된 Express API”를 사용하고 있습니다. 기본 브랜치, 루트 디렉토리, 자동 배포 상태(예 또는 아니요), 환경 변수와 같은 추가 배포 옵션을 설정할 수도 있습니다.
- 앱 만들기 버튼을 클릭하여 배포 프로세스를 마무리합니다.
이제 Express 애플리케이션을 Back4app에 무료로 배포했습니다.
Docker 이미지를 최적화하는 방법
다음과 같은 이유로 도커 이미지의 크기를 최적화하는 것이 중요합니다:
- 성능 향상: 작은 이미지에는 실행해야 하는 불필요한 레이어가 포함되지 않습니다. 따라서 시작 시간이 빨라집니다.
- 더 빠른 배포: 이미지 크기가 작을수록 배포 속도가 빨라집니다.
- 리소스 소비 감소: 이미지 크기가 작을수록 실행 시 디스크 공간과 메모리 사용량이 줄어듭니다.
- 보안 강화: 불필요한 라이브러리와 종속성을 제외하면 이미지 크기가 작아져 애플리케이션의 공격 표면이 줄어듭니다.
Express.js Docker 이미지를 최적화하기 위해 다단계 빌드를 사용할 수 있습니다.
다단계 빌드를 사용하면 빌드 환경과 런타임 환경을 분리할 수 있습니다. 빌드 단계에서 애플리케이션을 빌드한 다음 필요한 파일만 최종 프로덕션 단계로 복사할 수 있습니다.
Express 애플리케이션으로 돌아가서 종속 요소를 설치하는 빌드 단계와 런타임 이미지를 생성하는 프로덕션 페이지의 두 단계를 정의할 수 있습니다.
빌드 단계 만들기
아래 지침에 따라 빌드 단계를 정의하세요:
- 도커파일의 모든 내용을 삭제하고 기본 이미지에서 빌드 단계를 정의합니다.
FROM node:20-alpine AS build
스테이지의 이름은 FROM 명령어에 AS name-of-stage를
추가하여 지정합니다. 또한 알파인 베이스 이미지는 노드: 이미지보다 훨씬 작다는 점에 유의하세요.
- 작업 디렉터리를 정의합니다.
WORKDIR /usr/src/app
- package.json 및 package-lock.json 파일을 컨테이너에 복사합니다.
COPY package*.json ./
- 개발 종속성을 설치합니다.
RUN npm install --only=development
- 애플리케이션 코드를 빌드 단계에 복사합니다.
COPY . .
- 애플리케이션을 실행합니다.
CMD ["node", "index.js"]
여기서 실행하는 명령은 프로젝트에 따라 다릅니다. 예를 들어 TypeScript를 사용하여 애플리케이션을 빌드한 경우 애플리케이션을 트랜스파일해야 할 수 있습니다.
프로덕션 단계 만들기
두 번째 단계에서는 빌드 단계에서 빌드된 애플리케이션 파일만 복사합니다. 아래 단계를 따르세요:
- Node.js 기본 이미지를 추가하고 이름을 프로덕션으로 지정합니다.
# Production Stage
FROM node:20-alpine AS production
- 작업 디렉터리를 설정합니다.
WORKDIR /usr/src/app
COPY
명령어에--from=build를
지정하여 “빌드 단계”에서 필요한 파일을 복사합니다. 빌드 명령이 없으므로 모든 것을 직접 복사합니다.
COPY --from=build /usr/src/app .
- Express 앱이 수신하는 포트를 노출하세요.
EXPOSE 3000
- Express 애플리케이션을 시작합니다.
CMD ["node", "index.js"]
도커파일을 생성한 후 변경 사항을 GitHub에 푸시하면 Back4app이 자동으로 애플리케이션을 다시 배포합니다.
이 문서의 코드를 보려면 애플리케이션의 GitHub 리포지토리를 참조하세요.
결론
Express.js는 의견에 구애받지 않는 경량 Node.js 프레임워크입니다. 개발자가 웹 및 모바일 애플리케이션을 위한 최소한의 API를 빠르게 구축할 수 있도록 도와줍니다.
Express 애플리케이션을 배포할 때는 서비스형 인프라(IaaS) 및 서비스형 컨테이너(CaaS) 플랫폼을 비롯한 다양한 옵션이 있습니다.
IaaS 플랫폼은 기본 서버 인프라를 최대한 제어하고자 할 때 더 적합하며, CaaS는 인프라를 수동으로 관리할 필요 없이 개발에서 프로덕션으로 빠르게 전환하고자 할 때 좋은 선택입니다.
최고의 CaaS 제공업체 중 하나는 Back4app 컨테이너입니다. Back4app은 사용자를 대신하여 애플리케이션 배포를 관리하고 모니터링하므로 사용자는 애플리케이션의 기능을 실제로 구축하는 데 집중할 수 있습니다.
이 가이드에서는 Express.js 애플리케이션을 도커화하여 Back4app 컨테이너에 배포하는 방법을 배웠습니다. 자세한 내용은 Back4app 컨테이너 설명서를 참조하세요.
자주 묻는 질문
Express.js란 무엇인가요?
Express는 Node.js 위에 구축된 의견 없는 가벼운 프레임워크로, 복잡한 웹 및 모바일 API를 구축하는 과정을 단순화합니다.
Express.js 애플리케이션의 배포 옵션은 무엇인가요?
– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))
Express.js 애플리케이션을 Back4app 컨테이너에 배포하는 방법은 무엇인가요?
Express.js 애플리케이션을 만듭니다.
Express.js 애플리케이션을 Dockerize 합니다.
Dockerized 애플리케이션을 GitHub에 푸시합니다.
Back4app 계정을 만듭니다.
Back4app 컨테이너를 만듭니다.
Back4app에 GitHub 액세스를 제공합니다.
Express.js 저장소를 선택하고 애플리케이션을 배포합니다.