Python 애플리케이션을 빌드하고 배포하는 방법은 무엇인가요?
Python은 무료 오픈소스 프로그래밍 언어로 다양한 용도로 활용되고 있습니다. 1991년 구이도 반 로섬이 만든 이후 가장 인기 있는 프로그래밍 언어 중 하나로 발전했습니다.
이 글에서는 Python의 장단점, 사용 사례 및 배포 옵션에 대해 설명합니다. 또한 간단한 Python 애플리케이션을 빌드하고, 도커화하여 Back4app 컨테이너에 배포하는 방법을 보여드리겠습니다.
계속 읽으면서 Python 프로젝트를 빌드하고 배포하는 방법을 자세히 알아보세요.
Python 개요
Python은 높은 수준의 범용 프로그래밍 언어입니다. 해석되고 동적으로 입력되며 프로그래밍뿐만 아니라 스크립팅에도 사용할 수 있습니다. 개발자들은 일반적으로 광범위한 표준 라이브러리로 인해 Python을 “배터리가 포함된” 언어라고 표현합니다.
1991년에 처음 등장한 파이썬은 간단하고 가독성 높은 구문으로 인해 가장 인기 있고 사랑받는 프로그래밍 언어 중 하나가 되었습니다. Python의 주요 설계 원칙은 Tim Peters가 쓴 The Zen of Python에서 다루고 있습니다.
Python에는 거대한 개발자 커뮤니티와 바로 사용할 수 있는 패키지가 있습니다. 오늘날 Python은 서버 관리, 과학 컴퓨팅, 머신 러닝, RESTful API 구축 등 거의 모든 분야에서 사용되고 있습니다. Python은 현대 개발자의 필수 기술 중 하나로 간주될 수 있습니다.
파이썬의 장점
간편한 사용
파이썬은 가장 사용하기 쉽고 배우기 쉬운 언어 중 하나입니다. 주요 설계 철학이 단순성과 코드 가독성을 강조하기 때문에 학습 곡선이 거의 존재하지 않습니다. 파이썬은 기본 프로그래밍 개념을 배우기 위한 훌륭한 도구이기 때문에 교육 분야에서도 선호됩니다.
빠른 개발
파이썬의 또 다른 장점은 빠른 개발이 가능하다는 점입니다. 프로토타입을 제작하고 작업을 빠르게 완료하는 데 훌륭한 언어입니다. Python을 사용하면 복잡한 구문, 메모리 할당 등에 대해 걱정할 필요 없이 앱에만 집중할 수 있습니다.
다용도
Python은 가장 다재다능한 프로그래밍 언어 중 하나입니다. 다양한 산업과 분야에서 사용됩니다. 회계, 과학 연구, 데이터 과학, 웹 개발, 게임 개발, 자동화 등 Python이 사용되는 분야는 다양합니다.
휴대성
파이썬은 자바처럼 컴파일되는 언어가 아니라 해석되는 언어이기 때문에 이식성이 뛰어난 언어입니다(C++처럼 컴파일되는 언어가 아닙니다). 즉, 한 플랫폼에서 작성된 코드를 다른 플랫폼으로 쉽게 전송할 수 있습니다. 따라서 Python은 Windows, macOS, Linux, Android 등 여러 플랫폼을 지원해야 하는 개발자에게 인기 있는 선택지입니다.
광범위한 라이브러리
파이썬 프로그래밍 언어는 거대한 개발자 커뮤니티의 지원을 받고 있습니다. 상상할 수 있는 거의 모든 것을 위한 라이브러리가 있습니다. 가장 인기 있는 라이브러리는 다음과 같습니다:
- 웹 개발(장고, 플라스크, FastAPI)
- 머신 러닝 및 데이터 과학(텐서플로우, 파이토치)
- 컴퓨터 비전(OpenCV, Pillow, Scikit-이미지)
- 과학 컴퓨팅(NumPy, SciPy)
- 그래픽 사용자 인터페이스(Qt, GTK)
이는 극히 일부에 불과합니다. 멋진 Python 패키지의 전체 목록을 보고 싶으시다면 GitHub의 awesome-python을 살펴보세요.
동적 입력
파이썬은 동적으로 타입이 지정된 언어이므로 변수를 만들 때 데이터 타입을 선언할 필요가 없습니다. 변수 유형은 코드가 실행될 때만 할당됩니다.
동적으로 입력되는 언어는 장점도 있지만 때로는 양날의 검이 될 수도 있습니다. 일반적으로 정적으로 입력된 언어에 비해 오류가 발생하기 쉽고 메모리 제어 수준이 낮습니다.
확장 가능
프로젝트 요구 사항에 무거운 계산 작업이 포함되어 있는 경우 C 또는 C++와 같은 더 빠른 언어로 작성한 다음 Python 코드에서 호출할 수 있습니다.
Python에서 C/C++를 호출하는 방법에 대해 자세히 알아보려면 이 훌륭한 문서를 확인하세요.
Python의 한계
성능 저하
Python은 다른 프로그래밍 언어에 비해 상대적으로 느립니다. 성능을 가장 저해하는 두 가지 요소는 파이썬이 해석 언어라는 점과 동적으로 입력된다는 점입니다. 프로젝트 요구 사항에 무거운 컴퓨팅이나 멀티스레딩이 포함된 경우 Python이 가장 적합한 도구가 아닐 수 있습니다. C, C++ 또는 다른 컴파일된 언어를 사용하는 것이 훨씬 낫습니다.
메모리 집약적
정적 유형 언어로 작성된 프로그램에 비해 파이썬 프로그램은 일반적으로 더 많은 메모리를 소비하고 메모리 제어 수준이 낮습니다. 이는 앱이 메모리 효율이 높아야 하는 경우 다소 문제가 될 수 있습니다.
런타임 오류가 발생하기 쉬운 환경
파이썬은 해석 언어이기 때문에 런타임 오류가 발생하기 쉽습니다. 컴파일 프로세스가 없기 때문에 컴파일 시간에 버그를 발견할 수 없습니다. 게다가 파이썬은 동적으로 타입이 지정되므로 개발자는 언제든지 변수 유형을 변경할 수 있습니다. 이로 인해 때때로 오류가 발생할 수 있으며 개발자는 변수 유형을 염두에 두어야 합니다.
글로벌 인터프리터 잠금(GIL)
파이썬의 글로벌 인터프리터 잠금(GIL)은 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 하는 메커니즘입니다. 이는 언어 구현을 간소화하고 특정 유형의 프로그램에 일부 성능 이점을 제공하지만, CPU를 사용하는 애플리케이션에서 멀티코어 프로세서를 최대한 활용하는 기능을 제한하기도 합니다.
데이터베이스 액세스에 최적화되지 않음
Python 애플리케이션에서 데이터베이스로 작업하는 것은 Java 데이터베이스 연결(JDBC)과 같은 강력하고 사용자 친화적인 인터페이스가 부족하기 때문에 더 어려울 수 있습니다. 간단한 읽기 및 쓰기 작업과 관련된 데이터베이스 작업에는 여전히 Python을 사용할 수 있지만, 크고 복잡한 데이터베이스로 작업해야 하는 애플리케이션에는 가장 적합한 옵션이 아닐 수 있습니다.
Python 배포 옵션
Python 애플리케이션은 여러 클라우드 플랫폼에 배포할 수 있습니다. 일반적으로 다음 세 가지 범주로 나눌 수 있습니다:
- 서비스형 인프라(IaaS)
- 서비스형 플랫폼(PaaS)
- 서비스형 컨테이너(CaaS)
IaaS는 가장 덜 추상화되어 있고 CaaS는 가장 추상화되어 있습니다. 기존 호스팅도 있지만 이미 잘 알고 계시리라 생각합니다.
서비스형 인프라(IaaS)
서비스형 인프라 또는 IaaS는 타사 공급업체가 인터넷을 통해 서버, 스토리지, 운영 체제, 네트워킹 등의 가상화된 컴퓨팅 리소스를 제공하는 클라우드 컴퓨팅 모델입니다. 제공된 리소스는 고급 대시보드 또는 고급 API를 통해 관리할 수 있으므로 고객은 전체 인프라를 완벽하게 제어할 수 있습니다.
IaaS의 주요 이점은 확장성, 비용 절감, 지원 강화, 성능 및 보안입니다. 대부분의 IaaS 제공업체가 채택하는 결제 구조는 사용한 리소스에 대해서만 요금이 부과되는 종량제 시스템을 기반으로 합니다.
IaaS는 가장 유연한 클라우드 컴퓨팅 모델이며 2010년대 초에 출시된 이후 가장 인기 있는 옵션입니다. 가장 큰 단점은 고객이 애플리케이션, 운영 체제 및 데이터에 대해 전적으로 책임을 져야 한다는 점입니다.
서비스형 플랫폼(PaaS)
서비스형 플랫폼(PaaS)은 사용자에게 애플리케이션을 생성, 관리 및 제공할 수 있는 클라우드 환경을 제공하는 클라우드 컴퓨팅 서비스입니다. PaaS는 앱 개발, 사용자 지정 및 테스트를 위한 사전 구축된 도구를 제공합니다. 서비스 제공업체가 서버, 운영 체제, 소프트웨어, 백업 등을 포함한 기본 인프라를 관리하므로 사용자는 앱에만 집중할 수 있습니다.
PaaS의 장점으로는 출시 속도 향상, 보안 강화, 비용 효율성, 확장성, 고가용성, 일반적으로 코드가 덜 필요하다는 점 등이 있습니다. 하지만 몇 가지 단점도 있습니다. 세 가지 주요 단점은 유연성 부족, 통제력 부족, 공급업체 종속의 위험입니다. 그럼에도 불구하고 PaaS를 사용하면 관리 오버헤드를 줄이면서 더 빠르게 앱을 구축할 수 있습니다.
서비스형 컨테이너(CaaS)
서비스형 컨테이너(CaaS)는 조직이 컨테이너 가상화 기술을 사용하여 컨테이너를 업로드, 실행, 확장 및 관리할 수 있는 클라우드 컴퓨팅 모델입니다. CaaS 공급업체는 인프라, 운영 체제, 소프트웨어, 컨테이너화 엔진 등과 같이 필요한 작업의 대부분을 추상화합니다.
컨테이너의 가장 큰 장점은 앱을 컨테이너화하면 거의 모든 곳에 배포할 수 있고 동일한 방식으로 작동하도록 보장된다는 것입니다. 필요에 따라 다른 CaaS 공급업체로 이동할 수도 있습니다. CaaS 고객은 일반적으로 컨테이너 사양에 따라 컨테이너당 요금이 청구됩니다.
CaaS는 일반적으로 IaaS 및 PaaS에 비해 더 비싸고 유연성과 제어 수준이 낮으며 애플리케이션 도커화 등 초기 작업이 필요합니다. 그럼에도 불구하고 앱을 컨테이너화하면 사용하기 쉬운 클라우드 컴퓨팅 모델 중 하나입니다.
컨테이너에 대해 자세히 알아보려면 클라우드 컴퓨팅에서 컨테이너란 무엇인가요?
Python 배포 프로세스
이 튜토리얼의 이 섹션에서는 간단한 Python 애플리케이션을 단계별로 빌드하고 배포하는 방법을 보여드리겠습니다. 웹 앱은 Flask 프레임워크를 사용하여 구현되고 Back4app 컨테이너에 배포됩니다.
전제 조건
- 파이썬 및 플라스크 사용 경험
- Docker에 대한 기본 이해
- Python 버전 3.8 이상 및 Docker Desktop이 설치되어 있습니다.
Back4app 컨테이너란 무엇인가요?
Back4app 컨테이너는 전 세계에 분산된 컨테이너를 사용하여 앱을 배포하고 확장할 수 있는 무료 오픈 소스 플랫폼입니다.
Back4app 컨테이너를 사용하면 DevOps에 대한 걱정 없이 소프트웨어 구축과 신속한 출시에 집중할 수 있습니다.
이 플랫폼은 GitHub와 긴밀하게 통합되어 있으며 내장된 CI/CD 시스템을 갖추고 있습니다. Back4app 컨테이너를 사용하면 몇 분 만에 앱을 온라인에 출시할 수 있습니다.
백4앱 컨테이너를 사용하는 이유는 무엇인가요?
- GitHub와 잘 통합
- 확장 및 다운타임 없는 배포
- 매우 간편한 사용
- 탁월한 고객 지원
프로젝트 소개
이 글에서는 할 일 목록으로 사용될 간단한 RESTful API를 빌드하고 배포해 보겠습니다. 웹 API를 통해 사용자는 작업 추가, 작업 삭제, 완료로 표시하는 등의 기본적인 CRUD 작업을 수행할 수 있습니다.
먼저 소스 코드를 작업하고 나중에 Back4app 플라스크 컨테이너에 배포하겠습니다. 웹 애플리케이션은 플라스크 웹 프레임워크를 사용하여 구현됩니다.
“앱 코드 작성” 섹션은 건너뛰고 자신만의 Python 프로젝트를 따라해 보세요.
코드 앱
프로젝트 초기화
먼저 Flask 앱의 전용 디렉토리를 만들고 해당 디렉토리로 이동합니다:
$ mkdir flask-todo
$ cd flask-todo
가상 환경을 만들고 활성화합니다:
$ python3 -m venv venv && source venv/bin/activate
다음으로 핍을 통해 Flask를 설치합니다:
$ (venv) pip install Flask==2.2.2
모든 것이 제대로 작동하는지 확인하기 위해 app.py 내용을 다음과 같이 바꾸어 보겠습니다:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index_view():
return {
'detail': 'Hello world'
}
이 코드는 Flask를 초기화하고 메시지를 반환하는 간단한 엔드포인트를 생성합니다.
서버를 시작합니다:
$ (venv) flask run
마지막으로 자주 사용하는 브라우저에서 http://localhost:5000/ 으로 이동합니다. Hello world라는
메시지가 표시될 것입니다.
데이터베이스
이제 데이터베이스를 관리해 보겠습니다.
원시 SQL을 실행하는 대신 간단한 Flask ORM인 Flask-SQLAlchemy를 사용하겠습니다. 설치하려면 실행합니다:
$ (venv) pip install Flask-SQLAlchemy
다음으로 app.py의 내용을 다음과 같이 바꿉니다:
# app.py
from datetime import datetime
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app = Flask(__name__)
app.config['SECRET_KEY'] = '5b3ef5s80gl3b217c20fb37044fe4k33'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///default.db"
db.init_app(app)
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), nullable=False)
description = db.Column(db.String(256), nullable=False)
is_done = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.now(), nullable=True)
updated_at = db.Column(db.DateTime, default=None, nullable=True)
def as_dict(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
def __repr__(self):
return f'<Task {self.title}>'
@app.route('/')
def index_view():
return {
'name': 'flask-todo',
'description': 'a simple todo app written in flask',
'version': 1,
}
이 코드는 플라스크를 구성하고 Task라는
새 모델을 정의합니다. 작업 모델에는 이름
, 설명
, is_done
, 그리고 동적으로 업데이트할 created_at
및 updated_at와
같은 기타 변수가 있습니다.
그런 다음 SQLite 데이터베이스를 초기화하고 채우는 init_db.py라는 Python 스크립트를 만듭니다:
# init_db.py
from app import db, app
from app import Task
with app.app_context():
db.create_all()
if Task.query.count() == 0:
tasks = [
Task(name='Backup the database', description='Make sure to backup the database with all the tables.'),
Task(name='Setup 2FA', description='Setup the two factor authentication to secure your account.'),
Task(name='Malware scan', description='Perform a malware scan.'),
]
for task in tasks:
db.session.add(task)
db.session.commit()
명령줄에서 스크립트를 실행합니다:
$ (venv) python init_db.py
인스턴스라는 이름의 새 디렉터리가 생성된 것을 확인할 수 있습니다. 이 디렉터리 안에는 기본 데이터베이스인 default.db가 있습니다.
API
플라스크 앱의 URL은 다음과 같습니다:
/api/는
모든 작업 목록을 반환합니다./api/
/ 특정 작업을 표시하거나 삭제합니다./api/create/는
새 작업을 생성합니다./api/toggle/
/ 특정 작업의is_done
프로퍼티를 토글합니다.
이를 구현하려면 app.py의 끝에 다음을 추가합니다:
# app.py
@app.route('/api/')
def list_view():
json = [task.as_dict() for task in Task.query.all()]
return jsonify(json)
@app.route('/api/<int:task_id>/', methods=['GET', 'DELETE'])
def detail_view(task_id):
task = db.get_or_404(Task, task_id)
if request.method == 'DELETE':
db.session.delete(task)
db.session.commit()
return {
'detail': 'Task has been successfully deleted.'
}
else:
return task.as_dict()
@app.route('/api/create/', methods=['POST'])
def create_view():
name = request.form.get('name')
description = request.form.get('name')
if name is None or description is None:
return {
'detail': 'Please provide the name and the description.'
}, 400
task = Task(name=name, description=description)
db.session.add(task)
db.session.commit()
return task.as_dict()
@app.route('/api/toggle/<int:task_id>/')
def toggle_view(task_id):
task = db.get_or_404(Task, task_id)
if task.is_done:
task.is_done = False
else:
task.is_done = True
task.updated_at = datetime.now()
db.session.commit()
return task.as_dict()
이 코드는 설명이 필요 없습니다. 필요한 경로를 정의하고 필요한 로직을 구현했습니다. 데이터베이스를 변경할 때마다 커밋()
해야 합니다.
플라스크 앱은 여기까지입니다. 다음 섹션에서는 배포를 위해 프로젝트를 준비하겠습니다.
구니콘
Flask의 웹 서버는 한 번에 하나의 요청을 처리하도록 설계되어 많은 양의 트래픽을 처리하지 못할 수 있으므로 프로덕션 환경에서는 사용하지 않는 것이 좋습니다. 따라서 프로덕션에 사용할 수 있는 Python WSGI 서버인 Gunicorn으로 교체해 보겠습니다.
먼저 pip를 통해 설치합니다:
$ (venv) pip install gunicorn==20.1.0
설치가 성공적으로 완료되면 다음과 같이 서버를 시작할 수 있습니다:
$ (venv) gunicorn -w 2 -b 0.0.0.0:5000 app:app
[INFO] Starting gunicorn 20.1.0
[INFO] Listening at: http://0.0.0.0:5000 (1)
[INFO] Using worker: sync
[INFO] Booting worker with pid: 3
[INFO] Booting worker with pid: 4
이 명령은 UNIX 기반 운영 체제에서만 작동한다는 점에 유의하세요.
이렇게 하면 두 명의 Gunicorn 워커가 시작되고 포트 5000에
앱이 노출됩니다. 앱에 액세스하려면 즐겨찾는 웹 브라우저를 열고 http://localhost:5000 으로 이동합니다.
요구 사항.txt
앱을 도커라이즈하기 전에 마지막으로 해야 할 일은 요구사항.txt 파일을 만드는 것입니다. 요구사항 .txt 파일은 프로젝트의 종속성을 지정하는 데 사용됩니다.
다음 명령을 실행하여 생성합니다:
$ (venv) pip freeze > requirements.txt
그러면 다른 사용자(Docker 컨테이너 포함)는 다음과 같이 요구 사항.txt 파일을 활용할 수 있습니다:
$ (venv) pip install -r requirements.txt
도커라이즈 앱
앱을 도커화하기 위해 도커파일을 사용합니다. 도커파일은 도커 이미지를 빌드하기 위한 지침을 정의하는 데 사용됩니다. 이를 통해 기본 이미지, 작업 디렉토리, 환경 변수, 실행 명령 등을 설정할 수 있습니다.
.dockerignore
Docker파일에서 작업하기 전에 .dockerignore 파일을 만들어 보겠습니다. .dockerignore 파일은 이미지에서 생략할 폴더와 파일을 지정하는 데 사용됩니다.
.git/
.idea/
instance/
__pycache__/
필요에 따라 .dockerignore 파일을 수정하세요.
도커파일
프로젝트 루트에 다음 내용으로 Dockerfile이라는 이름의 새 파일을 만듭니다:
# syntax=docker/dockerfile:1.4
FROM --platform=$BUILDPLATFORM python:3.10-alpine
WORKDIR /app
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install the requirements
COPY requirements.txt /app
RUN --mount=type=cache,target=/root/.cache/pip \
pip3 install -r requirements.txt
COPY . .
# initialize the database (create DB, tables, populate)
RUN python init_db.py
EXPOSE 5000/tcp
CMD ["gunicorn", "-w", "2", "-b", "0.0.0.0:5000", "app:app"]
이 도커파일은 python:3.10-alpine을
기본 이미지로 사용합니다. 그런 다음 작업 디렉터리를 설정하고, 요구 사항을 설치하고, 프로젝트를 복사하고, 데이터베이스를 초기화하며, 마지막으로 포트 5000에서
Gunicorn 서버를 시작합니다.
테스트
Docker파일이 작동하는지 확인하기 위해 로컬에서 빌드하고 실행할 수 있습니다. 이미지를 빌드하려면 실행합니다:
$ docker build -t flask-todo:1.0 .
이미지를 나열하면 새 이미지가 표시됩니다:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-todo 1.0 7ege66240eb1 3 hours ago 109MB
마지막으로 이미지를 사용하여 새 Docker 컨테이너를 스핀업합니다:
$ docker run -it -p 5000:5000 flask-todo:1.0
[2023-02-02 20:08:57 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-02-02 20:08:57 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-02-02 20:08:57 +0000] [1] [INFO] Using worker: sync
[2023-02-02 20:08:57 +0000] [7] [INFO] Booting worker with pid: 3
[2023-02-02 20:08:57 +0000] [8] [INFO] Booting worker with pid: 4
d를
사용하여 분리된 모드에서 Docker 컨테이너를 시작할 수 있습니다. 즉, 컨테이너가 터미널의 백그라운드에서 실행되며 입력을 받거나 출력을 표시하지 않습니다.
이제 앱이 컨테이너에서 실행되고 있습니다. 즐겨찾는 웹 브라우저에서 http://localhost:5000 으로 이동하여 웹 애플리케이션이 작동하는 모습을 확인합니다.
{
"name": "flask-todo",
"description": "a simple todo app written in flask",
"version": 1
}
GitHub로 푸시
다음 단계를 수행하려면 GitHub 계정이 있어야 합니다. 아직 계정이 없는 경우 가입하고 그렇지 않은 경우 로그인하세요. 또한 Git이 설치 및 구성되어 있는지 확인하세요.
GitHub에 로그인한 후 화면 오른쪽 상단의 ‘더하기’ 버튼을 사용하여 드롭다운을 엽니다. 그런 다음 “새 리포지토리”를 선택합니다:
리포지토리의 사용자 지정 이름을 선택합니다. 저는 “플라스크-토도”를 선택한 다음 “리포지토리 만들기”를 클릭합니다:
리포지토리가 생성되면 원격 URL을 기록해 두세요:
이제 로컬 프로젝트로 돌아가서 코드를 푸시해 보겠습니다.
Git으로 푸시하고 싶지 않은 파일이 몇 개 있으므로 프로젝트 루트에 .gitignore 파일을 만듭니다. 여기에 다음을 추가하겠지만 필요에 따라 자유롭게 수정하세요:
instance/*
!instance/.gitignore
.webassets-cache
.env
__pycache__/
*.py[cod]
*$py.class
그런 다음 명령줄을 열고 다음 명령을 실행합니다:
$ git init
$ git remote add origin <your_remote_url>
$ git add .
$ git commit -m "init"
$ git push origin master
그러면 새 Git 리포지토리가 초기화되고, 원격 오리진을 추가하고, 모든 파일을 VCS하고, 초기 커밋을 생성합니다. 마지막으로 소스 코드를 GitHub 리포지토리에 푸시합니다.
이제 끝났습니다. 이제 브라우저에서 리포지토리로 이동하면 모든 파일이 커밋된 것을 볼 수 있을 것입니다.
앱 배포
다음 단계를 수행하려면 Back4app 계정이 필요합니다. 이미 로그인한 계정이 있는 경우 무료 계정에 가입하세요.
로그인하면 앱의 대시보드로 리디렉션됩니다. ‘새 앱 만들기’ 버튼을 클릭하여 앱 만들기 프로세스를 시작합니다.
Back4app을 사용하면 서비스형 백엔드(BaaS)와 서비스형 컨테이너(CaaS)의 두 가지 유형의 앱을 빌드하고 배포할 수 있습니다. 여기서는 도커화된 앱을 배포하고자 하므로 “서비스형 컨테이너”를 사용하겠습니다.
다음으로 GitHub를 Back4app 계정과 연결합니다. 이전 단계에서 생성한 리포지토리에 Back4app 권한을 부여하세요. 그런 다음 녹색 “선택” 버튼을 클릭하여 선택합니다.
Back4app 컨테이너를 사용하면 배포 프로세스를 구성할 수 있습니다. 기본 브랜치, 루트 디렉터리를 설정하고, 자동 배포를 활성화/비활성화하고, 환경 변수를 설정할 수 있습니다. 이 중 어느 것도 필요하지 않으므로 앱 이름을 지정하고 “앱 만들기”를 클릭하기만 하면 됩니다.
Back4app은 컨테이너를 빌드하고 컨테이너 레지스트리에 업로드한 후 컨테이너를 실행하는 데 잠시 시간이 걸립니다. 컨테이너가 준비되면 상태가 “준비됨”으로 변경되고 화면 왼쪽에 녹색 URL을 볼 수 있습니다.
URL을 클릭하면 브라우저에서 웹 앱이 열립니다. Back4app에서 앱에 대한 SSL 인증서를 자동으로 발급하고 Python 앱을 무료로 호스팅할 수 있는 것을 확인할 수 있습니다.
결론
이 문서에서는 Python의 장점과 단점, 배포 옵션에 대해 알아보았습니다. 또한 간단한 Python RESTful API를 성공적으로 배포했습니다. 이제 간단한 API를 빌드하여 Back4app 컨테이너에 배포할 수 있을 것입니다.
최종 소스 코드는 GitHub에서 확인할 수 있습니다.
향후 단계
- 현재로서는 재배포할 때마다 모든 데이터가 지워집니다. 이는 데이터베이스가 Docker 이미지에 포함되어 있기 때문입니다. 관리형 데이터베이스 인스턴스로 전환하는 것을 고려해 보세요.
- 배포 프로세스의 속도를 높이기 위해 다단계 빌드를 살펴보세요.