3 minute read

맥미니를 사놓고 홈서버를 굴려보겠다고 덤빈 게 화근이었다(물론 후회는 안 한다).

7년차 iOS 개발자가 백엔드 초보의 시선으로, 맥미니 홈서버에 PM2를 도입하며 겪은 좌충우돌 삽질기를 정리해 본다.

들어가며: iOS 개발자의 서버 도전기

개인 SaaS 프로젝트를 돌릴 서버가 필요했다. AWS나 클라우드 서비스를 쓰면 편하겠지만, 내 손으로 직접 서버를 굴려보고 싶은 쓸데없는 호기심(과 장비 욕심)에 맥미니를 덜컥 중고로 집어왔다. 저전력에 성능도 짱짱하고, 무엇보다 macOS 환경이라 익숙하니까 만만해 보였다.

하지만 현실은 냉혹했다. iOS 개발만 7년 파다 보니 서버 쪽은 완전 백지상태, 쌩초보다. 그래서 이 글은 나처럼 백엔드 앞에만 서면 작아지는 모바일 개발자들을 위해, 바닥부터 구르며 건져 올린 기록이다.

첫 번째 시도: 그냥 node 실행

설레는 마음으로 맥미니 터미널을 띄우고 코드를 돌렸다.

$ node server.js
Server running on port 3000...

너무 잘 돌아간다. 속으로 ‘어? 서버 별거 없네?’ 싶었다(물론 거대한 착각이었다).

며칠 돌려보자마자 제대로 현실의 벽에 부딪혔다.

  1. 터미널을 닫으면 서버도 죽는다: 서버 개발자들에겐 숨 쉬듯 당연한 상식이겠지만 모바일 앱만 만들던 나는 몰랐다. 터미널 창을 끄는 순간 서버도 같이 증발했다. nohup으로 백그라운드 실행을 할 수 있다는 것도 나중에 알았는데, 로그 관리하기가 진짜 골치 아팠다.
  2. 밖에서 상태 확인이 어렵다: 주말에 카페에서 놋북으로 작업하다가 “서버 지금 살아있나?” 궁금해도 맥미니 앞에 앉기 전까진 확인할 길이 막막했다.
  3. 에러 나면 그냥 죽어있다: 예기치 못한 에러 하나로 프로세스가 터지면, 집에 터덜터덜 들어가서 다시 켜줄 때까지 내 서비스는 영원히 다운 상태였다.

iOS 개발할 때는 Xcode가 크래시 로그도 예쁘게 찍어주고, TestFlight나 Firebase로 실시간 모니터링이 척척 되는데… 서버는 왜 이 모양이지? 분명 뭔가 도구가 있을 텐데??

구글링과 삽질 끝에 PM2(Process Manager 2)라는 구원투수를 만났다.

PM2란?

PM2는 Node.js 프로세스를 관리해 주는 도구다.

iOS 개발에 빗대어 보자면, Xcode Instruments + Crashlytics + 백그라운드 자동 재시작 기능을 몽땅 짬뽕해 둔 느낌이다. 서버가 크래시 나서 죽으면 알아서 벌떡 다시 살려내고, 로그도 깔끔하게 정리해서 보여준다.

설치 및 설정 과정

Node.js랑 npm만 깔려 있다면 PM2 설치는 명령어 딱 한 줄로 끝난다.

1. PM2 설치

npm install pm2 -g

2. 서버 실행

기존의 node server.js 대신 pm2를 써서 띄운다. --name 옵션으로 앱 이름을 붙여두는 게 나중에 정신건강에 이롭다.

pm2 start server.js --name "my-server"

명령어를 치자마자 터미널 프롬프트가 바로 복귀한다. 백그라운드에서 지 혼자 알아서 잘 돌고 있다는 뜻이다.

3. 자주 쓰는 명령어

처음엔 명령어가 너무 많아 보여서 겁부터 덜컥 났는데, 실전에서 손에 익는 건 몇 개 없다.

# 실행 중인 프로세스 목록 확인
pm2 list

# 로그 보기 (실시간으로 계속 출력됨)
pm2 logs

# 특정 서버 로그만 보기
pm2 logs my-server

# 최근 100줄 로그 확인
pm2 logs --lines 100

# 서버 재시작 (코드 수정 반영 시 사용)
pm2 restart my-server

# 서버 중지
pm2 stop my-server

# 서버 삭제 (PM2 리스트에서 제거)
pm2 delete my-server

# CPU/메모리 모니터링 (시각적으로 예쁘게 보여줌)
pm2 monit

특히 pm2 monit은 처음 봤을 때 입이 떡 벌어졌다. 까만 터미널 창에서 이런 화려한 대시보드가 뜬다는 게 신기했다(터미널 갬성 합격).

4. 재부팅해도 자동 실행되게 설정

솔직히 이 부분이 가장 중요했다. 홈서버는 맥미니가 혼자 껐다 켜져도 서버가 알아서 살아나야 진짜 완성이다.

# 1. 스타트업 스크립트 생성
pm2 startup

# 2. 터미널에 출력되는 명령어를 복사해서 그대로 실행
#    (sudo env PATH=... 형태의 긴 명령어가 나옵니다)

# 3. 현재 실행 중인 프로세스 목록 저장
pm2 save

이렇게 세팅해 두면 집이 정전되거나 macOS가 제멋대로 업데이트 후 재부팅돼도, 맥미니가 켜지면서 알아서 서버가 부활한다. 마음의 평화가 찾아오는 순간이다.


마치며

PM2를 도입하고 나서 삶의 질이 확 달라졌다.

이전 이후
터미널 닫으면 서버 종료 백그라운드에서 계속 실행
에러 나면 그냥 죽어있음 자동 재시작
로그 확인 어려움 pm2 logs로 간편하게
재부팅하면 수동 실행 자동 복구

솔직히 백엔드 쌩초보 입장에서 PM2 없이 맨땅에 서버 굴리는 건 이제 상상도 못 하겠다.

iOS 개발로 치면 Crashlytics나 Firebase 모니터링도 안 붙여놓고 앱 스토어에 출시한 다음 기도 메타로 버티는 꼴이었다(끔찍하다). 물론 인프라 고수분들이야 Docker나 Kubernetes 같은 걸 쓰겠지만, 나처럼 맥미니 하나로 조촐하게 개인 SaaS 굴리는 용도로는 PM2 하나면 충분하고도 넘친다.

다음에는 밖에서 맥미니 서버로 접속하기 위해 삽질했던 이야기(Tailscale 등)를 정리해 볼 생각이다.


혹시 백엔드에 발 담그고 고통받는 동료 모바일 개발자가 있다면… 비슷한 삽질 경험은 언제든 댓글로 환영한다!