# 원문 메모 · 영어학원 사이트 GKE 배포

확인 2026-09-18. 지어내지 않음.
절차는 공개 monolith-to-microservices 챌린지 패턴을 따름(학습자 완료 랩 노트와 Codelabs 본문으로 대조).

## 출처
- 저장소: https://github.com/googlecodelabs/monolith-to-microservices
- Codelabs: https://codelabs.developers.google.com/codelabs/cloud-monolith-to-microservices-gke
- Google Skills / Qwiklabs 계열 랩: Migrating a Monolithic Website to Microservices on Google Kubernetes Engine

## 적응 표 (스토리 ↔ 원문)

| 이 팩 (영어학원) | Codelabs / 랩 원문 | 비고 |
| --- | --- | --- |
| 영어학원 통합 사이트 (홈+커리큘럼+수강신청 한 통) | Fancy Store monolith | 이미지·배포 이름을 `academy-monolith`로 표기 |
| 수강신청(enrollments) API | Orders microservice | 원문 폴더는 `microservices/src/orders` 유지 |
| 커리큘럼/강의목록(courses) API | Products microservice | 원문 폴더는 `microservices/src/products` 유지 |
| 학원 홈/안내 프론트 | Frontend microservice | 원문 폴더 `microservices/src/frontend` |
| `academy-monolith:1.0.0` 등 | `monolith:1.0.0`, `orders:1.0.0` … | 태그·deployment 이름만 학원식으로 바꿈 |
| 클러스터 `academy-prod` | `fancy-cluster` (또는 랩 접미사 변형) | 예: zone `europe-west1-b`, 노드 3 |
| `REACT_APP_ORDERS_URL` → 수강신청 IP | 동일 변수명 | 스토리는 enrollments, 파일 키는 원문 유지 |
| `REACT_APP_PRODUCTS_URL` → 강의목록 IP | 동일 변수명 | 스토리는 courses, 파일 키는 원문 유지 |
| 포트 80→8080 / 8081 / 8082 | 동일 | frontend·monolith 8080, orders 8081, products 8082 |

## Qwiklabs·Skills 전용 vs 일반 GCP

### Qwiklabs / Skills 쪽에 가까운 것
- 일시 학생 프로젝트 ID, 자동 프로비저닝된 Cloud Shell
- 랩 UI의 **Check my progress** (점수·진행 체크). 이 팩은 버튼 조작을 만들지 않음. “랩에서만 있는 진행 확인”으로만 언급
- 랩마다 붙는 랜덤 접미사 이미지/클러스터 이름 (예: `fancy-monolith-203`). 영구 비밀·고정 ID가 아님
- 랩 종료 후 프로젝트 회수·정리 정책

### 일반 GCP / Codelabs에도 그대로인 것
- `git clone` + `./setup.sh`
- `gcloud services enable container.googleapis.com` (및 Cloud Build 사용 시 `cloudbuild.googleapis.com`)
- `gcloud container clusters create` + `get-credentials`
- `gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/…`
- `kubectl create deployment` / `expose … --type=LoadBalancer --port 80 --target-port …`
- `.env.monolith` 수정 → `npm run build:monolith` (또는 frontend용 `cp .env.monolith .env` + `npm run build`) → 이미지 재제출 → `kubectl set image`
- LoadBalancer `EXTERNAL-IP`가 `<pending>`일 수 있음 → 잠시 후 `kubectl get service` 재실행
- 프로젝트는 `${GOOGLE_CLOUD_PROJECT}` 또는 학습자 본인 프로젝트. Qwiklabs 학생 ID를 영구 값처럼 쓰지 않음
- 존은 학습자가 바꿀 수 있음. 예시는 `europe-west1-b`

## 이 팩에서 하지 않은 것
- Fancy Store UI 버튼·메뉴를 학원 UI로 새로 그려 넣지 않음
- Check my progress 화면을 재현하거나 점수 UI를 만들지 않음
- 원문 저장소에 없는 경로·스크립트·환경 변수 키를 발명하지 않음 (스토리 이름만 병기)
- `deploy-monolith.sh`에 묶인 고정 이름 `monolith` 대신, 학원 태그로 명시적 Cloud Build + kubectl 순서를 guide에 적음 (같은 결과, 이름만 적응)

## 포트·환경 변수 요약
| 서비스(스토리) | 원문 디렉터리 | targetPort | Service port |
| --- | --- | --- | --- |
| academy-monolith / academy-frontend | monolith / frontend | 8080 | 80 |
| academy-enrollments (수강신청) | orders | 8081 | 80 |
| academy-courses (강의목록) | products | 8082 | 80 |

`.env.monolith` 예 (IP는 학습자 값):
```
REACT_APP_ORDERS_URL=http://<ENROLLMENTS_IP>/api/orders
REACT_APP_PRODUCTS_URL=http://<COURSES_IP>/api/products
```
