Day 8 — pm2 / 프로세스 매니저 개념

짱효·2026년 4월 26일

📚 2년차 프론트엔드 개발자의 12주 기초 챌린지
Week 2: 배포 환경 이해하기 (Day 6-10)


🍳 레스토랑 비유로 시작하기

Day 7에서 SSH로 서버에 접속해서 yarn start를 실행하면 사이트가 켜진다는 걸 배웠다.
그런데 전화(SSH)를 끊으면 셰프가 불을 끄고 퇴근해버린다.

레스토랑이라면 주방 매니저가 있어서:

  • 전화가 끊겨도 셰프가 계속 요리하게 관리하고
  • 셰프가 쓰러지면(에러) 자동으로 대타 셰프를 투입하고
  • 가게를 닫았다 열어도(서버 재부팅) 자동으로 영업 재개한다

이 주방 매니저가 바로 pm2다!


1. 프로세스란?

프로세스 = 실행 중인 프로그램

서버에서 yarn start를 하면 Node.js 프로세스가 하나 생긴다.

레스토랑 비유:

  • 프로세스 = 일하고 있는 셰프 한 명
  • 사이트 = 셰프가 만드는 음식
  • 서버 = 주방 건물
  • pm2 = 주방 매니저

💡 "프로세스가 죽는다" = 개발자 관점 (셰프가 쓰러졌다)
💡 "사이트가 죽는다" = 사용자 관점 (음식이 안 나온다)
같은 현상을 다른 관점에서 보는 것!


2. 크래시(Crash)란?

크래시 = 프로그램이 예상 못한 에러를 만나서 스스로 멈춰버리는 것

셰프가 요리하다가 갑자기 쓰러지는 것. 계획된 퇴근이 아니라 예상 못한 사고.

const data = response.data.items[0].name
// items가 빈 배열이면?
// → Cannot read property 'name' of undefined
// → 💥 크래시! 프로세스가 죽어버림

3. pm2 없이 서버를 켜면 생기는 문제 3가지

문제설명
SSH 끊으면 죽음yarn start는 SSH 세션의 자식 프로세스라서 부모가 죽으면 같이 죽는다
에러 나면 죽음크래시 발생 시 수동으로 다시 켜야 한다 (새벽 3시에 죽으면?)
서버 재부팅하면 날아감컴퓨터 껐다 켜면 실행 중이던 프로그램이 전부 꺼진다

4. pm2가 해결해주는 것

문제pm2 없이pm2 있으면
SSH 끊으면?사이트 죽음계속 살아있음
에러로 크래시?수동으로 재시작자동 재시작
서버 재부팅?전부 수동 재시작자동으로 다시 켜짐

5. pm2 기본 명령어

앱 시작하기

# pm2 없이 (SSH 끊으면 죽음)
yarn start -p 5008

# pm2로 시작 (SSH 끊어도 살아있음)
pm2 start yarn --name "my-app" -- start -p 5008
부분의미
pm2 startpm2야, 프로세스 하나 시작해
yarnyarn 명령어를 실행할 거야
--name "my-app"이 프로세스 이름을 "my-app"으로 붙여줘
-- start -p 5008yarn에게 전달할 옵션: start -p 5008

프로세스 목록 보기

pm2 list
┌──────────┬────┬────────┬──────┬────────┐
│ name     │ id │ ↺      │ status│ memory │
├──────────┼────┼────────┼──────┼────────┤
│ prod-app │ 0  │ 0      │ online│ 120mb  │
│ dev-app  │ 1  │ 0      │ online│ 98mb   │
└──────────┴────┴────────┴──────┴────────┘
항목의미비유
name프로세스 이름셰프 이름
id프로세스 번호셰프 번호표
재시작 횟수셰프가 쓰러졌다 부활한 횟수
status상태근무중 / 퇴근 / 쓰러짐
memory메모리 사용량셰프가 차지하는 주방 공간

⚠️ ↺ 숫자가 계속 올라간다면?
앱이 계속 크래시 → pm2가 살리고 → 또 크래시 반복 중이라는 뜻.
코드에 심각한 버그가 있다는 신호! pm2 logs로 에러 확인 필요.

자주 쓰는 명령어 모음

pm2 list              # 실행 중인 프로세스 목록
pm2 logs my-app       # 로그(기록) 보기
pm2 restart my-app    # 재시작
pm2 stop my-app       # 멈추기
pm2 delete my-app     # 완전 삭제
pm2 monit             # 실시간 모니터링
명령어레스토랑 비유
pm2 list"지금 누가 일하고 있어?"
pm2 logs"김셰프 오늘 뭐했어? 기록 보여줘"
pm2 restart"잠깐 쉬었다 다시 시작해"
pm2 stop"오늘 퇴근해"
pm2 delete"해고"
pm2 monit"주방 CCTV 실시간 감시"

6. 서버 재부팅에도 살아남기: pm2 startup + save

pm2 startup   # 서버 켜지면 pm2가 자동 출근하게 설정
pm2 save      # "이 셰프들 다시 불러야 해" 명단 저장

서버 재부팅되면 셰프들(프로세스)이 전부 퇴근한 상태인데,
주방 매니저(pm2)가 자동 출근(startup)해서 명단표(save)를 보고 셰프들을 다시 불러온다.

서버 재부팅
    ↓
pm2 자동 실행 (startup)
    ↓
저장된 명단 확인 (save)
    ↓
prod-app(5008), dev-app(5007) 자동 시작!

7. 내 프로젝트에 적용하면

# 프로덕션 앱 (사용자용)
pm2 start yarn --name "prod-app" -- start -p 5008

# 개발 확인용 앱 (내부 테스트용)
pm2 start yarn --name "dev-app" -- devStart -p 5007

# 서버 재부팅 대비 설정
pm2 startup
pm2 save

이제 SSH를 끊어도, 에러가 나도, 서버가 재부팅돼도 두 앱 모두 살아남는다!


📌 오늘의 핵심 정리 (비유 구조)

레스토랑서버
주방 건물서버 컴퓨터
셰프프로세스 (yarn start)
음식사이트
주방 매니저pm2
셰프가 쓰러짐크래시 (에러로 프로세스 죽음)
음식이 안 나옴사이트 접속 불가
자동 출근 알람pm2 startup
출근 명단표pm2 save

셰프(프로세스)가 쓰러지면 음식(사이트)이 안 나오고,
주방 매니저(pm2)가 셰프를 다시 깨워서 요리를 이어가게 한다.
가게가 닫혔다 열려도(재부팅) 매니저가 명단표 보고 셰프를 자동 소집한다.


🔮 다음 시간 (Day 9): Nginx란? 리버스 프록시 개념
사용자는 https://my-site.com으로 접속하지, https://my-site.com:5008로 접속하지 않는다.
포트 번호 없이 접속하게 해주는 홀 매니저(Nginx)를 배운다!

profile
✨🌏확장해 나가는 프론트엔드 개발자입니다✏️

0개의 댓글