모놀리식(또는 모놀리식 앱)을 사용하여 모듈로 분리하고 모듈을 컨테이너화하고 컨테이너 이미지를 Google Kubernetes Engine(GKE) 클러스터에 배포하는 방법을 보여주는 시리즈의 첫 번째 튜토리얼을 시작합니다. 해당 약관을 이해하지 못해도 괜찮습니다. 시리즈를 진행하면서 그 의미를 알아봅니다.
학습 과정은 다음 튜토리얼로 구성됩니다.
- 개요
- 모놀리식 이해(이 튜토리얼)
- 모놀리식 모듈화
- 컨테이너화를 위한 모듈식 앱 준비
- 모듈식 앱 컨테이너화
- GKE 클러스터에 앱 배포
이 튜토리얼에서는 다음 단계를 수행하여 모놀리식을 알아봅니다.
- 로컬 머신에서 앱 설정
- 브라우저에서 기능 살펴보기
- 코드 검토
모놀리식이란 무엇인가요?
Cymbal Books 샘플 모놀리식을 설정하고 실행하기 전에 먼저 모놀리식이 무엇인지 이해해야 합니다.
모놀리식은 모든 구성요소가 상호 연결되어 있고 독립적으로 확장될 수 없는 앱입니다. 예를 들어 사용자 다수가 갑자기 앱의 로그인 페이지에 방문하면 로그인 구성요소만 독립적으로 확장할 수는 없습니다. 대신 제품 카탈로그나 주문 처리 시스템과 같은 관련 없는 구성요소를 포함하여 전체 애플리케이션을 확장해야 합니다.
반면 애플리케이션이 독립적인 모듈로 분할되면 각 모듈은 리소스 니즈에 따라 별도로 확장될 수 있습니다. GKE 클러스터에서 모듈식 앱을 호스팅하면 GKE에서 확장을 자동화할 수도 있습니다.
모놀리식이라는 용어는 코드가 잘 구성되지 않았다는 의미가 아닙니다. 모놀리식은 잘 구조화되어 있을 수 있으며 구성요소는 코드의 고유한 영역에서 구현될 수 있습니다. 모놀리식의 특징은 이러한 구성요소를 독립적으로 실행하거나 확장할 수 없다는 점입니다.
비용
이 튜토리얼을 무료로 완료할 수 있습니다. 하지만 이 시리즈의 마지막 튜토리얼에 나온 단계를 수행하면Google Cloud 계정에 비용이 청구됩니다. GKE를 사용 설정하고 Cymbal Books 앱을 GKE 클러스터에 배포하면 비용이 청구됩니다. 이러한 비용에는 가격 책정 페이지의 설명대로 GKE의 클러스터당 요금과 Compute Engine VM 실행 요금이 포함됩니다.
불필요한 요금이 청구되지 않게 하려면 이 튜토리얼을 완료한 후 GKE를 사용 중지하거나 프로젝트를 삭제하세요.
시작하기 전에
이 튜토리얼을 사용하려면 로컬 머신에 Python 버전 3.13이 설치되어 있어야 합니다. 머신에 설치된 Python 버전을 확인하려면 다음 명령어를 실행합니다.
python3 --version
Python 버전이 3.13 이전이면 공식 Python 웹사이트에서 최신 버전을 다운로드하여 설치합니다.
환경 설정
이 튜토리얼 시리즈에서는 다음과 같이 여러 위치에서 애플리케이션의 서로 다른 버전을 실행합니다.
- 로컬 머신의 모놀리식 버전
- 로컬 머신의 모듈식 버전
- Cloud Shell 및 GKE 클러스터의 컨테이너화된 버전
이 섹션에서는 모놀리식이 실행될 수 있는 로컬 머신에 가상 환경을 설정합니다.
코드 다운로드
로컬 컴퓨터에서 터미널을 엽니다.
튜토리얼의 GitHub 저장소를 로컬 머신에 클론합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
kubernetes-engine-samples/quickstarts/monolith-to-microservices
폴더에는monolith/
,modular/
,containerized/
등 폴더 3개가 포함되어 있습니다. 이 튜토리얼에서는monolith/
폴더의 파일만 다룹니다.
가상 환경 만들기 및 활성화
가상 환경은 앱을 실행할 수 있는 격리된 공간을 제공합니다. 앱에 설치해야 하는 Python 라이브러리가 시스템의 다른 Python 프로젝트와 간섭되지 않게 합니다.
다음 단계를 수행하여 가상 환경을 만들고 활성화합니다.
이전 섹션에서 연 터미널에서 이전에 머신에 클론한 저장소의 다음 폴더로 이동합니다.
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices
book-review-env
가상 환경을 만듭니다.python3 -m venv book-review-env
가상 환경은 앱을 격리된 상태로 실행할 수 있는 영역이므로 가상 환경을 만드는 것이 좋습니다. 이렇게 하면 앱의 종속 항목과 구성이 시스템의 다른 소프트웨어나 라이브러리와 충돌하지 않습니다.
운영체제의 명령어를 사용하여 가상 환경을 활성화합니다.
macOS 및 Linux
source book-review-env/bin/activate
Windows
book-review-env\Scripts\activate
모놀리식의 Python 종속 항목을 설치합니다. 종속 항목은 앱이 올바르게 작동하는 데 사용하는 외부 Python 라이브러리입니다. 이러한 라이브러리는
requirements.txt
파일에 표시되어 있으며 다음 명령어를 실행하면 모든 라이브러리가 가상 환경에 설치됩니다.pip install -r monolith/requirements.txt
브라우저에서 Cymbal Books 실행 및 탐색
Cymbal Books 앱은 의도적으로 간단하며 다음과 같은 기능이 있습니다.
- 라이브러리함의 모든 도서를 보여주는 홈페이지
- 도서에 대한 세부정보를 보여주는 페이지
- 클릭하면 도서 리뷰를 보여주는 세부정보 페이지의 버튼
- 도서 표지 이미지를 표시하는 기능
홈페이지에는 도서 3권이 표시되고 각 도서 옆에 세부정보 보기 버튼이 표시됩니다.
가상 환경이 활성화되었고 앱 종속 항목이 해당 환경에 설치되었습니다. 지금부터는 다음 단계를 수행하여 앱을 실행합니다.
로컬 머신에서 모놀리식 디렉터리로 이동합니다.
cd monolith/
앱을 시작합니다.
python3 mono.py
웹브라우저를 열고 앱 홈페이지(
http://127.0.0.1:8080
)로 이동합니다.도서 세부정보 페이지로 이동하려면 세부정보 보기를 클릭합니다. 세부정보 페이지에는 저자, 출판 연도와 같은 도서에 대한 추가 정보가 제공됩니다.
도서 리뷰 목록을 표시하려면 세부정보 페이지에서 리뷰 표시를 클릭합니다. 다음 이미지에서는 Zephyr's Timepiece 도서의 도서 세부정보 페이지와 첫 번째 도서 리뷰를 보여줍니다.
/monolith
폴더의 파일 탐색
잠시 시간을 내어 /monolith
폴더의 파일을 살펴봅니다.
monolith/
├── mono.py
├── data/
│ ├── book-1.json
│ ├── book-2.json
│ ├── book-3.json
│ ├── reviews-1.json
│ ├── reviews-2.json
│ └── reviews-3.json
├── images/
│ ├── fungi_frontier.jpg
│ ├── melodic_mechanics.jpg
│ └── zephyrs_timepiece.jpg
├── static/
│ ├── styles_for_details.css
│ └── styles_for_home.css
└── templates/
├── book_details.html
└── home.html
주요 폴더와 파일은 다음과 같습니다.
images/
폴더에는 앱에 표시되는 다음과 같은 도서 표지 이미지가 포함되어 있습니다.fungi_frontier.jpg
melodic_mechanics.jpg
zephyrs_timepiece.jpg
data/
폴더에는 다음과 같은 JSON 파일이 포함됩니다. 이러한 파일에는 Cymbal Books 라이브러리의 도서 3권에 대한 리뷰와 각 도서에 대한 세부정보가 포함되어 있습니다.reviews-1.json
,reviews-2.json
,reviews-3.json
book-1.json
,book-2.json
,book-3.json
실제 앱에서는 데이터베이스를 사용하는 경우가 많지만 앱의 데이터를 JSON 파일에 저장하면 구현이 간소화됩니다. Cymbal Book 샘플 앱은 JSON 파일을 사용하므로 복잡한 코드를 처리할 필요가 없습니다. 대신 이 튜토리얼 시리즈의 주요 목표인 모놀리식을 모듈화하고 컨테이너화하는 방법을 알아보는 데 집중할 수 있습니다.
다음 폴더의 파일은 앱 레이아웃과 디자인에 중요하지만 앱 로직과 직접적인 관련이 없으므로 다음 폴더를 무시해도 됩니다.
static/
: 앱 스타일을 정의하는 CSS 파일이 포함되어 있습니다.templates/
: 앱 레이아웃과 콘텐츠를 정의하는 HTML 파일이 포함되어 있습니다.
모놀리식을 Flask 애플리케이션으로 이해
이 튜토리얼의 모놀리식은 웹 애플리케이션을 빌드하는 데 사용되는 Python 라이브러리인 Flask를 사용하여 빌드됩니다. 그러나 Flask는 동시 실행을 지원하지 않으므로 일반적으로 프로덕션 환경에서 사용되지 않습니다. 동시 실행은 과부하 상태에서 성능 병목 현상을 초래할 수 있습니다. Flask 애플리케이션에는 강력한 오류 처리 및 확장성 기능도 없습니다.
Cymbal Books 앱은 단순성과 최소한의 설정으로 모듈화 및 컨테이너화 개념을 더 쉽게 이해할 수 있으므로 Flask를 사용합니다. Python을 사용하는 프로덕션 등급 애플리케이션의 경우 FastAPI 또는 Django와 같은 Flask의 대안을 사용하는 것이 좋습니다. Java의 Spring Boot 또는 Node.js의 Express.js와 같이 다른 언어에 맞게 조정된 프레임워크도 사용할 수 있습니다. 이러한 프레임워크는 실시간 애플리케이션 요구사항이 충족되도록 더욱 우수한 동시 실행, 확장성, 프로덕션에 즉시 사용 가능한 기능을 제공할 수 있습니다.
mono.py 살펴보기
모든 모놀리식 로직은 mono.py
라는 단일 파일에 포함되어 있습니다. 이 파일은 Flask 애플리케이션을 만듭니다. Flask 애플리케이션은 웹 서버 내에서 실행되고 엔드포인트라고 하는 특정 URL을 리슨하며 이러한 URL로 보내진 요청에 응답합니다. 사용자가 웹브라우저에서 이러한 URL 중 하나를 방문하거나 프로그래매틱 방식으로 요청하면 Flask는 해당 요청을 처리하기 위해 상응하는 코드를 실행합니다.
다음 화면 캡처에서는 mono.py
파일을 보여줍니다. 상자는 앱의 경로 핸들러를 강조 표시합니다. 한 핸들러는 사용자 대상 홈페이지를 제공하는 반면, 다른 핸들러는 주로 JSON 형식 또는 정적 이미지 파일로 데이터를 전송하는 모듈 간 통신에 사용됩니다. 다음 섹션에서 이러한 엔드포인트에 대한 자세한 내용을 설명합니다.
화면 캡처에서 상자는 앱의 경로 핸들러를 강조 표시합니다. 경로 핸들러는 다음 두 부분으로 구성됩니다.
- URL 패턴을 정의하는
@app.route()
줄(예:/book/<id>/reviews
) - 엔드포인트가 호출될 때 실행되는 함수
엔드포인트는 @app.route()
줄에 정의된 패턴과 일치하는 URL입니다.
예를 들어 사용자가 도서 세부정보 페이지에서 리뷰 표시를 클릭하면 앱이 요청을 http://localhost:8080/book/1/reviews
에 보냅니다. 도서 리뷰 경로 핸들러는 다음 단계를 수행하여 이 요청에 응답합니다.
- 이 URL이
/book/<id>/reviews
패턴과 일치하는 것으로 인식합니다. - JSON 파일에서 도서 1의 리뷰를 가져옵니다.
- 이러한 리뷰를 JSON 형식으로 프런트엔드에 다시 보냅니다.
그러면 도서 세부정보 구성요소가 이러한 리뷰를 웹페이지에 인간이 읽을 수 있는 형식으로 표시합니다. Cymbal Books 모놀리식은 Flask라는 Python 라이브러리를 사용하여 경로 핸들러 구현을 간소화합니다. 다음 튜토리얼에서는 모놀리식이 모듈식 앱으로 변환되는 방법을 알아볼 때 Flask와 경로 핸들러가 중요한 역할을 한다는 것을 알 수 있습니다.
모놀리식 엔드포인트가 모듈화에 중요한 이유
엔드포인트는 Cymbal Books 앱을 비롯한 Flask 애플리케이션에서 중요한 역할을 합니다. 그러나 앱을 독립적인 모듈로 분할하는 데 엔드포인트를 이해하는 것이 중요하므로 엔드포인트 중요성은 모놀리식 설계를 넘어섭니다. 이유는 다음과 같습니다.
- 핵심 기능: 엔드포인트는 페이지 표시 또는 데이터 검색과 같은 앱 기본 기능을 구현합니다. 각 기능은 특정 엔드포인트에 연결됩니다.
- 모듈화: 엔드포인트는 앱을 더 작은 모듈로 나누기 위한 자연스러운 경계나 단층선 역할을 합니다. 다음 튜토리얼에서 볼 수 있듯이 앱 모듈식 버전의 각 모듈은 자체 엔드포인트가 있는 기능에 해당합니다.
- 커뮤니케이션: 모듈식 설계에서 엔드포인트를 사용하면 자율 모듈이 서로 통신할 수 있습니다.
mono.py
에서 엔드포인트가 구현되는 방식을 이해하면 다음 튜토리얼에서 Cymbal Books 앱을 독립형 모듈로 쉽게 모듈화할 수 있습니다.
모놀리식 경로 핸들러 테스트
각 경로 핸들러에서 반환하는 데이터 종류를 보려면 브라우저에서 다음 엔드포인트에 방문하세요.
- 홈페이지 경로 핸들러:
http://localhost:8080/
으로 이동하여 방문도서 카탈로그를 표시하는 전체 HTML 페이지를 확인합니다. - 책 세부정보 경로 핸들러:
http://localhost:8080/book/1
로 이동하여 특정 도서에 대한 세부정보를 보여주는 HTML 페이지를 확인합니다. 이 페이지는 서버에서 도서에 대한 JSON 데이터를 가져와 HTML 템플릿을 사용하여 인간이 읽을 수 있는 형식으로 표시합니다. URL에서 ID 번호(1, 2, 3)를 변경하여 다른 도서의 세부정보를 확인해 보세요. - 책 리뷰 경로 핸들러:
http://localhost:8080/book/3/reviews
로 이동하여 책 리뷰의 JSON 데이터를 확인합니다. 이 데이터는 Melodic Mechanics의 도서 세부정보 페이지에서Show Reviews
를 클릭하면 읽을 수 있는 형식으로 처리됩니다. - 이미지 경로 핸들러:
http://localhost:8080/images/fungi_frontier.jpg
로 이동하여 이미지 파일을 확인합니다. 홈페이지와 도서 세부정보 페이지는 이 엔드포인트를 호출하여 도서 표지 이미지를 표시합니다.
요약
이 튜토리얼에서는 모놀리식 Cymbal Books 앱을 설정하고 실행했습니다. 그런 다음 모놀리식은 엔드포인트라고 하는 특정 URL을 리슨하고 이러한 URL로 보내진 요청에 응답하는 Flask 애플리케이션으로 구현된다는 것을 알아봤습니다.
다음 단계
다음 튜토리얼인 모놀리식 모듈화에서는 모놀리식을 독립적인 모듈로 분할하는 방법을 알아봅니다.