Step 0-1. 앱 만들기 + 버전 관리
인프라 파이프라인 핸즈온의 첫 번째 단계. 로컬 PC에서 클라우드 비용 없이 직접 구축하는 시리즈.
Step 0. 앱 만들기 (사전 준비)
왜 앱부터 만드는가?
인프라(Infrastructure)는 앱을 배포하고 운영하기 위한 토대다. 토대를 연습하려면 “올려놓을 앱”이 있어야 한다. 단, 이 시리즈의 주인공은 인프라이지 앱이 아니다. 앱이 복잡하면 인프라 학습에 집중하지 못하므로, 가능한 한 단순하게 만든다.
비유: 이사 연습을 하려면 짐이 필요하다. 하지만 짐을 만드는 게 목적이 아니니 박스 하나면 충분하다.
Express란?
- Express — 영어 뜻: “빠른, 급행”. IT 의미: Node.js 위에서 HTTP 서버를 빠르게 만들어주는 프레임워크.
- 비유: 웹 서버를 처음부터 직접 짓는 대신, 조립식 키트를 사용하는 것.
프로젝트 생성
# 프로젝트 폴더를 만들고 그 안으로 이동한다
mkdir my-infra-lab && cd my-infra-lab
# package.json을 기본값으로 자동 생성한다 (-y = 모든 질문에 yes)
npm init -y
# Express 패키지를 설치한다
npm install express
앱 코드 작성
app.js 파일을 만든다.
// Express 모듈을 불러온다
const express = require("express");
// Express 앱 인스턴스를 생성한다
const app = express();
// 포트 번호를 지정한다 (3000번)
const PORT = 3000;
// GET /health — 서버가 살아있는지 확인하는 엔드포인트
app.get("/health", (req, res) => {
res.json({ status: "ok" });
});
// GET /info — 앱의 이름과 버전 정보를 반환한다
app.get("/info", (req, res) => {
res.json({ app: "my-infra-lab", version: "1.0.0" });
});
// 서버를 시작하고, 터미널에 주소를 출력한다
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
실행 및 확인
# 서버를 실행한다
node app.js
# 다른 터미널을 열어서 health 엔드포인트를 호출한다
curl http://localhost:3000/health
# 기대 결과: {"status":"ok"}
# info 엔드포인트도 확인한다
curl http://localhost:3000/info
# 기대 결과: {"app":"my-infra-lab","version":"1.0.0"}
/health엔드포인트는 나중에 Docker, CI/CD, Kubernetes에서 “이 앱이 정상인가?”를 자동으로 판단하는 데 사용된다. 지금은 단순하지만, 인프라 전체를 관통하는 핵심 엔드포인트다.
Step 1. Version Control — 버전 관리
왜 버전 관리가 필요한가?
코드를 수정하다 문제가 생기면 “어제 버전으로 돌아가고 싶다”는 순간이 온다.
버전 관리 없이는 Ctrl+Z를 무한히 누르거나, 파일을 app_v2_final_진짜최종.js로 복사하게 된다.
Version Control (버전 관리)은 이 문제를 해결하는 시스템이다.
- Version — 영어 뜻: “판(版), 개정판”. IT 의미: 특정 시점의 파일 상태.
- Control — 영어 뜻: “통제, 관리”. IT 의미: 변경 이력을 추적하고 관리하는 것.
- 비유: 문서의 “변경 이력 보기” 기능을 코드 전체에 적용한 것.
- 실무에서는 “형상 관리(Configuration Management)” 또는 “소스 관리(Source Control)” 라고도 부른다.
Git이란?
- Git — 이름의 유래: 리누스 토르발스가 만들었으며, 영국 속어로 “멍청한 놈”이라는 뜻. IT 의미: 가장 널리 쓰이는 분산 버전 관리 시스템(DVCS).
- 비유: 코드의 타임머신. 언제든 과거 시점으로 돌아갈 수 있다.
왜 인프라 파이프라인에서 Git이 첫 번째인가?
이후 단계인 CI/CD(자동 빌드/배포)는 Git에 코드가 올라오는 것을 감지해서 작동한다. Git이 없으면 파이프라인 자체가 시작되지 않는다.
[코드 작성] → [Git에 Push] → [CI가 감지] → [자동 빌드] → [자동 배포]
↑ 여기가 Step 1
Git 저장소 초기화
# 현재 폴더를 Git 저장소로 만든다
# init = initialize(초기화). 빈 .git 폴더가 생긴다.
git init
.gitignore 작성
Git에 올리면 안 되는 파일을 지정하는 파일이다.
# .gitignore 파일을 생성한다
# node_modules/ — 설치된 패키지 폴더. 용량이 크고, npm install로 재생성 가능
# .env — 환경 변수 파일. 비밀번호/API 키가 들어갈 수 있어 위험
# *.log — 로그 파일. 운영 중 생기는 임시 파일
.gitignore 파일 내용:
node_modules/
.env
*.log
첫 커밋 만들기
Commit(커밋)이란?
- 영어 뜻: “확정하다, 기록에 남기다”. IT 의미: 현재 파일 상태를 하나의 스냅샷으로 저장하는 것.
- 비유: 게임의 세이브 포인트.
# 모든 파일을 스테이징(staging) 영역에 추가한다
# staging = "무대에 올리다". 커밋할 파일을 선별하는 대기 공간이다.
# 교육에서는 이 대기 공간을 "슬롯"이라 부르기도 하지만,
# 실무 용어는 "스테이징 영역(Staging Area)" 또는 "인덱스(Index)"다.
git add .
# 첫 번째 커밋을 만든다
# -m 뒤에 커밋 메시지(이 변경이 뭔지 설명하는 메모)를 적는다
git commit -m "feat: 초기 Express 앱 생성"
“슬롯”은 학습용 비유 표현이다. 실무에서는 사용하지 않으며, 정확한 용어는 Staging Area (스테이징 영역) 또는 Index (인덱스)다.
GitHub에 올리기
GitHub란?
- GitHub — Git 저장소를 인터넷에 호스팅하는 서비스. Git이 로컬 타임머신이라면, GitHub는 그 타임머신을 클라우드에 백업하는 것.
- 왜 필요한가: 내 PC가 고장 나도 코드가 살아있고, 다른 사람과 협업할 수 있다. 또한 CI/CD가 코드를 가져갈 수 있는 중앙 저장소 역할을 한다.
GitHub에서 저장소 만들기
- github.com에 로그인한다
- 우측 상단
+→New repository클릭 - Repository name:
my-infra-lab입력 - Public 또는 Private 선택 (학습용이므로 어느 쪽이든 무관)
- “Add a README file” 체크 해제 (이미 로컬에 코드가 있으므로)
Create repository클릭
로컬과 GitHub 연결
# GitHub 저장소를 원격(remote)으로 등록한다
# origin = 원격 저장소의 별명. 관례적으로 "origin"이라 부른다.
# <URL>은 GitHub에서 복사한 주소로 교체한다
git remote add origin https://github.com/<본인계정>/my-infra-lab.git
# 기본 브랜치 이름을 main으로 설정한다
git branch -M main
# 코드를 GitHub에 업로드한다
# -u = upstream 설정. 이후 git push만 입력해도 같은 곳에 올라간다.
git push -u origin main
확인
# 브라우저에서 https://github.com/<본인계정>/my-infra-lab 접속
# app.js, package.json, .gitignore가 보이면 성공
체크리스트
- Express 앱이 로컬에서 동작한다 (
curl localhost:3000/health→{"status":"ok"}) - GitHub에 코드가 올라갔다 (브라우저에서 저장소에 파일이 보인다)
현재 디렉토리 구조
my-infra-lab/
├── .git/ # Git이 관리하는 내부 폴더 (직접 건드리지 않는다)
├── .gitignore # Git에서 제외할 파일 목록
├── app.js # Express 서버 코드
├── node_modules/ # 설치된 패키지 (Git에는 올라가지 않음)
├── package.json # 프로젝트 정보 + 의존성 목록
└── package-lock.json # 정확한 패키지 버전 기록
다음 단계: 02-ci-and-docker.md — CI 파이프라인과 Docker 컨테이너화
Comments
// admin login