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에서 저장소 만들기

  1. github.com에 로그인한다
  2. 우측 상단 +New repository 클릭
  3. Repository name: my-infra-lab 입력
  4. Public 또는 Private 선택 (학습용이므로 어느 쪽이든 무관)
  5. “Add a README file” 체크 해제 (이미 로컬에 코드가 있으므로)
  6. 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

  • // 댓글을 불러오는 중...
main ⚠ 0 ✕ 0 Ln 1, Col 1 Spaces: 2 UTF-8 LF Markdown