Deno 애플리케이션을 배포하는 방법은 무엇인가요?
Deno로 구축된 웹 애플리케이션에는 다양한 배포 옵션이 존재합니다. 그러나 서비스 플랫폼으로서의 컨테이너화는 다른 배포 옵션에 비해 제공하는 다양한 장점으로 인해 최근 인기 있는 선택이 되었습니다.
이 문서에서는 Deno와 그 장점 및 한계를 살펴봅니다. 또한 간단한 Deno 앱을 빌드하여 Back4app 컨테이너에 배포해 보겠습니다.
Contents
Deno란 무엇인가요?
Deno는 Node.js의 한계와 설계 결함을 해결하기 위해 만들어진 안전하고 최신의 JavaScript 및 TypeScript용 런타임입니다.
Node.js와 달리 기본적으로 보안을 강조하여 파일 시스템 및 네트워크 액세스에 대한 세분화된 권한을 적용합니다.
또한 Deno는 기본적으로 TypeScript를 지원하므로 다른 기능 중에서도 추가 설정이나 번역 단계가 필요하지 않습니다.
2018년 출시 이후 Deno는 Node.js보다 개선된 기능으로 개발자들의 관심과 주목을 받아왔습니다.
그러나 Deno가 개선 사항을 제공하지만, Node.js는 광범위한 커뮤니티 지원과 방대한 패키지 저장소를 갖춘 성숙한 에코시스템으로 남아 있습니다.
그럼에도 불구하고 Deno의 접근 방식을 높이 평가하고 그 잠재력을 탐구하는 개발자 커뮤니티가 점점 더 늘어나고 있습니다.
Deno의 장점
Deno의 인기 상승에는 몇 가지 근본적인 이유가 있습니다. 그 중 일부는 다음과 같습니다.
Node.js보다 향상된 보안
Deno는 권한 기반 보안 모델을 구현하고 샌드박스 환경에서 애플리케이션을 실행하는 등 향상된 보안을 주요 장점으로 제공합니다.
파일 시스템 및 네트워크와 같은 리소스에 액세스하려면 명시적인 권한 부여가 필요한 권한 기반 보안 모델을 구현합니다.
기본적으로 Deno는 제한된 모드로 작동하며 샌드박스 환경에서 애플리케이션을 실행하여 잠재적으로 위험한 작업을 제한하고 기본 시스템에서 격리하며 민감한 리소스에 대한 직접적인 액세스를 방지합니다.
포괄적인 보안 감사와 꼼꼼한 코드 검토는 Deno의 강력한 보안을 더욱 강화합니다. 이러한 조치를 통해 애플리케이션을 구축하고 보안에 대한 확신을 심어주며 잠재적인 취약성으로부터 보호할 수 있는 신뢰할 수 있고 안전한 플랫폼을 제공합니다.
종속성 관리
Deno는 Node.js와 같은 기존 JavaScript 런타임 환경과 비교하여 종속성 관리에 대한 차별화된 접근 방식을 제공합니다.
Deno는 중앙화된 패키지 레지스트리에 의존하는 대신 웹에서 직접 모듈을 가져오기 위해 URL을 활용합니다.
이 접근 방식은 npm과 같은 별도의 패키지 관리자가 필요하지 않고 버전 충돌과 관련된 우려와 “node_modules” 폴더 관리의 복잡성을 완화하여 프로세스를 간소화합니다.
가져오려는 모듈의 URL을 지정하여 종속성을 지정할 수 있으므로 코드 공유 및 배포가 더 쉬워집니다. Deno의 종속성 관리에 대한 이러한 분산된 접근 방식은 단순성을 높이고 마찰을 줄이며 보다 능률적인 개발 환경을 보장하는 데 도움이 됩니다.
즉시 사용 가능한 TypeScript 지원
Deno는 TypeScript를 기본적으로 원활하게 지원하므로 프로젝트에서 TypeScript를 선호하거나 필요한 경우 탁월한 선택이 될 수 있습니다.
TypeScript는 정적 타이핑 및 기타 고급 언어 기능을 JavaScript 개발에 제공하는 JavaScript의 상위 유형입니다. Deno를 사용하면 TypeScript를 사용하기 위해 추가 구성이나 빌드 단계가 필요하지 않습니다.
Deno는 TypeScript 컴파일러와 함께 번들로 제공되므로 TypeScript 코드를 직접 작성하고 실행할 수 있습니다.
이 기본 지원은 별도의 TypeScript 툴체인을 설정해야 하는 복잡성을 없애고 개발 프로세스를 간소화합니다.
Deno로 애플리케이션을 빌드하면서 TypeScript의 유형 검사, 향상된 툴링, 향상된 개발자 경험을 활용할 수 있습니다.
Deno의 한계
그러나 Deno에는 채택에 영향을 미치는 몇 가지 제한 사항이 있습니다. 그 중 일부는 다음과 같습니다.
미성숙한 생태계
Deno의 한계 중 하나는 생태계의 성숙도입니다. 더 오래 사용되어 온 Node.js에 비해 Deno의 생태계는 아직 비교적 새롭고 진화하고 있습니다.
즉, Deno용으로 특별히 설계된 타사 라이브러리, 프레임워크 및 도구가 더 적을 수 있습니다. 특정 기능을 처음부터 빌드하거나 기존 Node.js 패키지를 Deno에서 사용하도록 조정해야 할 수도 있습니다.
커뮤니티 규모가 작다는 것은 잘 정립된 Node.js 에코시스템에 비해 사용할 수 있는 리소스, 튜토리얼, 커뮤니티 지원이 적을 수 있다는 의미이기도 합니다.
하지만 Deno의 인기와 채택이 증가함에 따라 향후 더 다양한 라이브러리와 도구를 제공하는 등 생태계가 성장하고 성숙해질 것으로 예상됩니다.
가파른 학습 곡선
Deno의 또 다른 한계는 Node.js와 같은 다른 JavaScript 런타임 환경에서 전환할 때 발생하는 학습 곡선입니다.
Deno는 익숙해져야 할 수 있는 새로운 개념, API 및 패턴을 소개합니다. 여기에는 Deno의 모듈 시스템, 권한 기반 보안 모델, 다른 런타임과 비교하여 특정 기능이 구현되는 방식의 차이점에 대한 이해가 포함됩니다.
이미 Node.js에 능숙한 개발자는 Deno의 특정 기능과 규칙을 학습하고 적응하는 데 시간과 노력을 투자해야 할 수 있습니다.
그러나 학습 곡선은 공식 Deno 문서를 참조하고, Deno 커뮤니티에 참여하고, 사용 가능한 학습 리소스를 탐색하여 관리할 수 있습니다.
Node.js 라이브러리와의 호환성
Node.js 라이브러리와의 호환성은 Deno의 또 다른 한계입니다. 모듈 시스템과 런타임 환경의 차이로 인해 모든 Node.js 라이브러리 및 모듈을 수정 없이 Deno에서 바로 사용할 수 있는 것은 아닙니다.
Deno는 ES 모듈(ECMAScript 모듈)을 모듈 시스템으로 사용하는 반면, Node.js는 전통적으로 CommonJS 모듈을 사용합니다. 이러한 모듈 형식의 차이로 인해 Deno에서 Node.js 전용 모듈을 가져와 사용할 때 비호환성이 발생할 수 있습니다.
개발자는 Deno의 모듈 시스템과 함께 작동하도록 특별히 설계된 라이브러리를 조정하거나 대체 라이브러리를 찾아야 할 수도 있습니다.
Deno는 일부 Node.js 모듈을 실행하기 위한 호환성 계층을 제공하지만, 모든 경우에 적용되는 것은 아니며 수동 수정 또는 조정이 필요할 수 있습니다.
Deno 배포 옵션
Deno 앱에는 여러 가지 배포 옵션이 있으며, 그 중 일부는 다음과 같습니다.
서비스형 인프라(IaaS)
서비스형 인프라(IaaS)는 가상화된 컴퓨팅 리소스를 제공하는 클라우드 컴퓨팅 모델입니다. IaaS를 사용하면 클라우드 제공업체로부터 가상 머신, 스토리지 및 네트워킹을 종량제 방식으로 대여할 수 있습니다. 이를 통해 물리적 하드웨어에 투자하지 않고도 자체 가상화된 인프라를 설정하고 관리할 수 있습니다.
IaaS 옵션을 사용하면 가상 머신에서 Deno 애플리케이션을 실행할 수 있습니다. AWS, Google Cloud, Microsoft Azure와 같은 인기 있는 IaaS 플랫폼은 유연하고 확장 가능한 솔루션을 제공하므로 애플리케이션의 특정 요구 사항에 따라 인프라를 구성할 수 있습니다.
그러나 IaaS를 사용하면 제어 및 리소스 격리 기능이 향상되지만 서버 프로비저닝, 보안 업데이트, 모니터링과 같은 작업을 포함하여 수동 설정 및 관리가 더 많이 필요합니다.
따라서 인프라에 대한 광범위한 제어가 필요하고 인프라의 복잡성을 효과적으로 처리할 수 있는 전문 지식이 필요한 경우 IaaS가 적합한 선택입니다.
서비스형 컨테이너(CaaS)
서비스형 컨테이너(CaaS)는 컨테이너화된 애플리케이션의 배포와 관리를 간소화하는 클라우드 컴퓨팅 모델입니다.
CaaS를 사용하면 기본 인프라에 대한 걱정 없이 애플리케이션을 빌드하고 배포하는 데 집중할 수 있습니다.
Deno 애플리케이션은 컨테이너 내에 배포하여 일관성과 격리를 보장할 수 있습니다. Back4app 컨테이너는 Deno 배포를 위한 인기 있는 CaaS 옵션입니다.
CaaS 플랫폼은 각 애플리케이션이 자체 컨테이너에서 실행되는 확장성과 리소스 격리를 제공하여 보안과 안정성을 강화합니다.
컨테이너의 일관성 덕분에 컨테이너를 지원하는 모든 플랫폼에서 Deno 애플리케이션을 쉽게 배포할 수 있습니다.
CaaS 솔루션은 학습 곡선이 있지만 여러 노드 또는 클러스터에 걸쳐 동적으로 확장 및 배포해야 하는 애플리케이션에 상당한 이점을 제공합니다.
Deno 설치 프로세스
Deno를 사용하려면 먼저 다운로드하여 설치해야 합니다. Deno의 설치 방법은 운영 체제에 따라 다릅니다.
macOS 및 Linux에서는 아래 명령을 실행하여 Deno를 설치할 수 있습니다:
curl -fsSL <https://deno.land/x/install/install.sh> | sh
Windows에서는 아래 명령을 실행하여 Powershell을 사용하여 Deno를 설치할 수 있습니다:
irm <https://deno.land/install.ps1> | iex
설치가 성공적으로 완료되었는지 확인하려면 아래 명령을 실행하면 터미널에 버전 번호가 출력됩니다.
deno --version
버전 번호가 표시되지 않으면 Deno를 다시 설치해 보세요.
Deno 프로젝트 설정
Deno로 간단한 API를 만들려면 라우터, 서버, 데이터베이스가 필요합니다.
아래 단계를 따르기 전에 프로젝트의 루트 디렉터리에 src
폴더를 만드세요. 이 폴더에는 프로젝트의 모든 소스 파일이 들어갑니다.
1단계: 종속성 파일 만들기
Node.js와 달리 Deno는 NPM이나 Yarn과 같은 패키지 관리자를 사용합니다. 그 대신 해당 URL에서 직접 패키지를 가져옵니다.
package.json
파일의 기능을 모방하려면 프로젝트의 루트 디렉터리에 deps.ts를
만들고 아래 코드 블록을 추가합니다.
export { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
export type { RouterContext} from "https://deno.land/x/[email protected]/mod.ts";
export { config as dotenvConfig } from "https://deno.land/x/[email protected]/mod.ts";
export { Client } from "https://deno.land/x/[email protected]/mod.ts";
위의 코드 블록은 애플리케이션
, 라우터
, 라우터컨텍스를
가져오기(설치)하고 내보내기(설정)합니다. 구성은
dotenv에서, 클라이언트는
deno-postgres에서 가져옵니다.
2단계: 서버 만들기
이 단계에서는 Oak로 간단한 HTTP 서버를 생성합니다. Oak는 Express와 비슷하지만 더 가벼운 Node.js용 프레임워크인 Koa.js를 기반으로 하는 Deno의 HTTP 서버용 미들웨어입니다.
Oak로 HTTP 서버를 만들려면 src에
server.ts
파일을 생성하고 아래 코드 블록을 추가합니다.
import { Application } from "../deps.ts";
import config from "../config/default.ts";
import router from "./router.ts";
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: config.port });
위의 코드 블록은 Oak로 HTTP 서버를 생성하고 들어오는 모든 트래픽을 처리할 라우터를 등록합니다.
app.use(router.routes())
줄은 라우터의 경로를 Oak 애플리케이션의 미들웨어로 등록합니다. 모든 수신 요청은 등록된 경로와 비교하여 일치하는 항목이 발견되면 해당 핸들러가 실행됩니다.
일치하는 항목을 찾지 못하면 app.use(router.allowedMethods())
줄에서 404 찾을 수 없음 또는 405 허용되지 않음과 같은 적절한 응답을 전송하여 처리합니다.
3단계: 환경 변수 관리
API 키, 데이터베이스 자격 증명 등과 같은 민감한 데이터를 일반 텍스트로 저장하면 보안 위험이 발생할 수 있습니다. 키나 자격 증명을 확보한 사람은 누구나 애플리케이션에 제한 없이 액세스할 수 있습니다. 이로 인해 데이터 손실 및 데이터 도난 등 다양한 악용 사례가 발생할 수 있습니다.
이와 같은 상황을 피하려면 민감한 데이터를 환경 변수에 저장하는 것이 좋습니다.
프로젝트의 루트 폴더에 .env
파일을 만들고 데이터베이스 자격 증명 및 기타 민감한 정보를 파일에 저장합니다.
이렇게요:
#.env
DB_URI = <YOUR_POSTGRES_DB_URI>
PORT = 8000
을 데이터베이스 자격 증명으로 바꿉니다.
그런 다음 프로젝트의 루트 폴더에 config
폴더를 만들고 config 폴더에 default.ts
파일을 만든 다음 아래 코드 블록을 추가합니다.
//default.ts
import { dotenvConfig } from "../deps.ts";
dotenvConfig({
export: true,
path: "../.env",
});
const config = {
db: {
dbUri: Deno.env.get("DB_URI"),
},
port: 3000
};
export default config;
위의 코드 블록은 .env
파일에 저장된 값을 안전하게 검색하여 애플리케이션의 나머지 부분에 노출합니다.
3단계: 데이터베이스에 연결
이 단계에서는 애플리케이션을 Postgres 데이터베이스에 연결합니다. 애플리케이션의 데이터를 저장하고 검색하려면 데이터베이스가 필요합니다.
src
폴더에 db.ts
파일을 생성하고 아래 코드 블록을 추가합니다.
//db.ts
import { Client } from "../deps.ts";
import config from "../config/default.ts";
let postgresConfiguration = config.db.dbUri;
const client = new Client(postgresConfiguration);
await client.connect();
export default client;
위의 코드 블록은 .env
파일에 제공한 URI를 사용하여 애플리케이션을 Postgres 데이터베이스에 연결하려고 시도합니다.
4단계: 데이터베이스 리포지토리 만들기
src
폴더에 블로그 리포지토리
파일을 만들고 아래 코드를 파일에 추가합니다.
//blogRepository.ts
import client from "./db.ts";
class BlogRepository {
async createBlogTable() {
const blog = await client.queryArray(
`CREATE TABLE IF NOT EXISTS blogs (id SERIAL PRIMARY KEY, title VARCHAR(255), body VARCHAR(255), author VARCHAR(255))`
);
return blog;
}
async getAllBlogs() {
const allBlogs = await client.queryArray("SELECT * FROM blogs");
return allBlogs;
}
async getBlogById(id: string) {
const blog = await client.queryArray(
`SELECT * FROM blogs WHERE id = ${id}`
);
return blog;
}
async createBlog(title: string, body: string, author: string) {
const blog = await client.queryArray(
`INSERT INTO blogs (title, body, author) VALUES ('${title}', '${body}', '${author}')`
);
return blog;
}
async updateBlog(id: string, title: string, body: string, author: string) {
const blog = await client.queryArray(
`UPDATE blogs SET title = '${title}', body = '${body}', author = '${author}' WHERE id = ${id}`
);
return blog;
}
async deleteBlog(id: string) {
const blog = await client.queryArray(`DELETE FROM blogs WHERE id = ${id}`);
return blog;
}
}
export default new BlogRepository();
위의 코드 블록은 원시 SQL 쿼리를 추상화하고 Postgres 데이터베이스와 상호 작용하는 데 사용할 수 있는 간단한 메서드를 노출하여 모든 데이터베이스 작업을 처리합니다.
5단계: 경로 핸들러 만들기
이 단계에서는 애플리케이션의 간단한 CRUD 함수를 처리하는 라우트 핸들러를 생성합니다. 지원되는 경로는 다음과 같습니다:
- GET /api/blogs: 데이터베이스의 모든 블로그를 반환합니다.
- GET /api/blog/:id: URL 매개변수에 제공된 아이디와 일치하는 단일 블로그를 반환합니다.
- POST /api/blog/new: 데이터베이스에 새 블로그를 만듭니다.
- PUT /api/blog/:id: URL 매개변수에 제공된 일치하는 아이디로 블로그를 업데이트합니다.
- DELETE /api/blog/:id: URL 매개변수에 제공된 아이디와 일치하는 블로그를 삭제합니다.
src 폴더에 라우터.ts 파일을 만들고 다음 가져오기를 추가합니다.
import { Router, RouterContext } from "../deps.ts";
import blogRepository from "./blogRepository.ts";
그런 다음 아래 코드 블록을 추가하여 라우터 인스턴스를 생성합니다:
const router = new Router();
라우터 핸들러를 등록하려면 라우터 인스턴스에 라우터 핸들러를 연결해야 합니다.
예를 들어 (GET /api/blogs):
router
.get("/api/blogs", async (ctx: RouterContext<"/api/blogs">) => {
const data = await blogRepository.getAllBlogs();
console.log(data);
//format data
const allBlogs = data.rows.map((blog) => {
return {
id: blog[0],
title: blog[1],
body: blog[2],
author: blog[3]
};
});
ctx.response.body = allBlogs;
})
위의 코드 블록은 처리기 로직을 라우터 인스턴스에 연결하여 GET /api/blogs에 대한 라우트 핸들러를 생성합니다.
나머지 경로를 등록하려면 이전에 체인으로 연결한 방법에 연결합니다. 이렇게 하세요:
GET /api/blog/:id:
.get("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
try {
const data = await blogRepository.getBlogById(ctx.params.id);
console.log(data);
//format data
const blog = data.rows.map((blog) => {
return {
id: blog[0],
title: blog[1],
body: blog[2],
author: blog[3]
};
});
ctx.response.body = blog;
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error getting blog",
error,
};
}
})
POST /api/blog/new
.post("/api/blog/new", async (ctx: RouterContext<"/api/blog/new">) => {
const resBody = ctx.request.body();
const blog = await resBody.value;
if (!blog) {
ctx.response.status = 400;
ctx.response.body = { msg: "Invalid data. Please provide a valid blog." };
return;
}
const { title, body, author } = blog;
if (!(title && body && author)) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Title or description missing. Please provide a valid blog.",
};
return;
}
try {
await blogRepository.createBlog(title, body, author);
ctx.response.status = 201;
ctx.response.body = {
msg: "blog added successfully",
};
} catch (error) {
ctx.response.status = 500;
ctx.response.body = {
msg: "Error adding blog",
error,
};
}
})
PUT /api/blog/:id:
.put("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
try {
const resBody = ctx.request.body();
const blog = await resBody.value;
if (!blog) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Invalid data. Please provide a valid blog.",
};
return;
}
const { title, body, author } = blog;
if (!(title && body && author)) {
ctx.response.status = 400;
ctx.response.body = {
msg: "Title or description missing. Please provide a valid blog.",
};
return;
}
await blogRepository.updateBlog(ctx.params.id, title, body, author);
ctx.response.status = 200;
ctx.response.body = {
msg: "blog updated successfully",
};
} catch (error) {
console.log(error);
ctx.response.status = 500;
ctx.response.body = {
msg: "Error updating blog",
error: error.message,
};
}
})
api/blog/:id를 삭제합니다:
.delete("/api/blog/:id", async (ctx: RouterContext<"/api/blog/:id">) => {
await blogRepository.deleteBlog(ctx.params.id);
ctx.response.status = 200;
ctx.response.body = {
msg: "blog deleted successfully",
};
});
그런 다음 라우터 인스턴스를 내보냅니다. 이렇게 하세요:
export default router;
마지막으로 애플리케이션이 처음 시작될 때 블로그 데이터베이스를 생성하도록 server.ts
파일을 수정합니다.
이렇게요:
import { Application } from "../deps.ts";
import config from "../config/default.ts";
import blogRepository from "./blogRepository.ts";
import router from "./router.ts";
const app = new Application();
(async () => {
await blogRepository.createBlogTable();
})();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: config.port });
수정된 코드는 데이터베이스에 새 블로그 테이블을 생성하는 IIFE를 server.ts
파일에 추가합니다.
Back4app 컨테이너에 Deno 앱 배포하기
Back4app 컨테이너에 Deno 앱을 배포하려면 아래 단계를 따라야 합니다:
1단계: 도커파일 만들기
도커파일은 도커 이미지 빌드에 대한 구체적인 지침을 제공합니다. 이 지침은 이미지 빌드 프로세스를 안내합니다.
아래 명령을 실행하여 Docker파일을 생성합니다:
touch Dockerfile
위의 명령은 프로젝트의 루트 디렉터리에 Docker파일을 생성합니다.
그런 다음 아래 코드 블록을 Docker파일에 추가합니다:
FROM denoland/deno:latest
EXPOSE 8000
WORKDIR /app
COPY deps.ts .
RUN deno cache deps.ts
COPY . .
RUN deno cache src/server.ts
CMD ["run", "--allow-net", "--allow-env", "--allow-read", "src/server.ts"]
위의 도커파일은 Deno 애플리케이션을 실행하기 위한 컨테이너화된 환경을 설정합니다. 애플리케이션 종속성 및 진입점을 캐시한 다음 컨테이너가 시작될 때 지정된 권한으로 Deno 애플리케이션을 실행합니다.
애플리케이션은 포트 8000에서 수신 대기할 것으로 예상되지만 실제 포트 매핑은 컨테이너를 실행할 때 수행해야 합니다.
마지막으로 코드를 GitHub에 푸시합니다.
2단계: 새 Back4app 애플리케이션 만들기
Back4app 애플리케이션을 만들려면 Back4app 공식 웹사이트를 방문하세요. Back4app 랜딩 페이지의 오른쪽 상단에 있는 가입 버튼을 찾습니다. 가입 버튼을 클릭하면 등록 양식으로 이동합니다. 이 양식에 이메일 주소, 사용자 아이디, 비밀번호 등 필요한 세부 정보를 입력합니다. 정확한 정보를 제공해야 합니다. 양식을 작성한 후 제출합니다.
이미 계정이 있는 경우 대신 로그인을 클릭합니다.
Back4app 계정을 성공적으로 설정했으면 로그인하여 계정 대시보드에 액세스합니다. 거기에서 ‘새 앱’ 버튼을 찾아 클릭합니다.
이 작업을 수행하면 새 앱을 만들기 위한 다양한 옵션이 표시되는 페이지로 이동합니다. 컨테이너화를 사용하여 배포하려는 경우‘서비스형 컨테이너‘ 옵션을 선택합니다.
다음으로 GitHub 계정을 Back4app 계정에 연결합니다. 계정의 모든 리포지토리 또는 특정 리포지토리에 대한 액세스 권한을 Back4app에 부여할 수 있습니다.
배포하려는 애플리케이션(이 경우 이 자습서에서 빌드한 애플리케이션)을 선택하고 선택을 클릭합니다.
선택 버튼을 클릭하면 이름, 브랜치, 루트 디렉터리, 자동 배포 옵션, 포트, 상태 및 환경 변수 등 앱에 대한 몇 가지 정보를 입력해야 하는 페이지로 이동합니다.
애플리케이션이 올바르게 작동하는 데 필요한 모든 필수 환경 변수를 제공해야 합니다. 필수 정보 입력을 완료했으면 ‘앱 만들기’ 버튼을 클릭합니다.
그러면 배포 프로세스가 시작되고 잠시 후 배포가 준비됩니다. 배포 프로세스에 시간이 많이 걸리는 경우 로그를 확인하여 배포에 오류가 발생했는지 확인하거나 Back4app의 문제 해결 가이드를 참조하세요.
결론
이 글에서는 Deno의 장점과 한계, 인기 있는 배포 옵션, Deno로 앱을 빌드하는 방법, Back4app 컨테이너를 사용하여 앱을 배포하는 방법에 대해 살펴보았습니다.
이러한 한계에도 불구하고 보안 모델 덕분에 Deno는 매우 안전하고 민감한 애플리케이션을 구축하는 데 이상적입니다. 또한 네이티브 TypeScript 지원으로 프로젝트에서 TypeScript를 설정해야 하는 번거로움을 없앴습니다.
이 문서에 설명된 단계에 따라 Back4app 컨테이너에서 Deno 애플리케이션을 쉽게 생성하고 배포할 수 있습니다.
자주 묻는 질문
Deno란 무엇인가요?
Deno는 개발자들이 서버 사이드와 클라이언트 사이드 애플리케이션을 구축할 수 있도록 해주는, 보안성이 뛰어나고 현대적인 JavaScript/TypeScript 런타임입니다.
Deno 애플리케이션을 배포하는 방법은 무엇인가요?
1. Deno 애플리케이션 생성
2. Dockerfile 작성
3. Deno 애플리케이션을 GitHub에 푸시하고, GitHub 계정을 Back4app 계정에 연결
4. Back4app에서 CaaS 애플리케이션 생성
5. 저장소 목록에서 Deno 애플리케이션 선택
6. Deno 애플리케이션 배포