앱은 잘 돌아갑니다. 개발 서버를 켜고 http://localhost:3000을 열었더니 의도한 대로 동작하죠. 그런데 누군가 링크를 달라고 하면, 화면에 보이는 그 URL이 나 말고는 누구에게도 아무 의미가 없다는 사실을 깨닫게 됩니다.
VPS 없이 localhost 앱에 공개 URL을 주는 방법은 세 가지이고, 상대방이 같은 로컬 네트워크에 있다면 더 빠른 옵션이 하나 더 있습니다. 어느 것을 고를지는 도구의 문제가 아닙니다. 앱이 얼마나 오래 접속 가능해야 하는지, 그리고 내 노트북이 아닌 다른 곳에서 실행될 수 있는지의 문제죠. 아래에서 각 경로와 URL을 얻는 명령어, 그리고 그 URL이 정확히 어떤 이유로 끊기는지를 정리합니다.
요약
- 같은 Wi-Fi에 있는 사람이 봐야 할 때: 개발 서버를 모든 네트워크 인터페이스에 바인딩하고 LAN IP를 알려주세요. 몇 초면 준비되지만, 방문자가 네트워크를 벗어나는 순간 끊깁니다.
- 앞으로 한 시간 동안 누구나 열 수 있는 링크가 필요할 때: 터널을 실행하세요(
cloudflared, ngrok, localtunnel, localhost.run). 1분 정도면 공개 HTTPS URL이 생기고 라우터 설정은 건드리지 않아도 되지만, 터널을 시작한 프로세스가 죽으면 URL도 함께 죽습니다. - 노트북을 덮어도 계속 떠 있어야 할 때: 앱을 무료 호스팅 티어에 올리세요. 앱이 노트북에서 분리되는 대신 신용카드, 상업적 이용, 재시작 후 데이터 보존 여부 같은 새 규칙이 따라옵니다.
- 요청 시점에 서버 코드가 필요 없는 앱일 때: 빌드해서 정적 결과물을 정적 호스트에 올리세요. 노트북 없이도 온라인을 유지하고 깨워야 할 앱 프로세스도 없습니다. 호스트의 계정 조건과 사용량 한도만 맞으면 됩니다.
- 알아둘 만한 기본값 하나:
next dev와python -m http.server은 플래그 없이도 이미 모든 네트워크 인터페이스에서 수신 대기합니다. 개발 서버가 내 노트북에서만 보이는 비공개 상태라고 생각했다면, 그렇지 않습니다.
내 앱에 맞는 경로는 무엇인가
이 네 경로 중 셋은 앱에 공개 인터넷 URL을 줍니다. 첫 번째는 내 네트워크 안에서만 닿기 때문에 가장 빠르면서도 가장 제한적입니다. URL이 얼마나 오래 살아 있어야 하는지로 정렬해 보면 선택은 거의 저절로 정해집니다.
| 길 | URL을 얻기까지 걸리는 시간 | 유지 기간 | 끊기는 원인 | 적합한 대상 |
|---|---|---|---|---|
| 같은 네트워크 | 몇 초 | 둘 다 같은 네트워크에 있는 동안 | 방문자가 다른 Wi-Fi로 옮겨갈 때 | 옆자리 동료, 또는 내 휴대폰 |
| 터널 | 1분 정도 | 프로세스가 실행되는 동안 | 노트북 덮기, 터미널 종료, 티어 한도 초과 | 데모, 고객 시연, 웹훅 테스트 |
| 무료 호스팅 티어 | 10~30분 | 조건부 무기한 | 유휴 시 절전, 휘발성 파일시스템, 또는 요금제 약관 | 내가 자는 동안에도 응답해야 하는 것 |
| 정적 빌드 | 10~20분 | 무기한 | 요청 시점에 서버 측 코드가 필요해지는 경우 | 빌드 시점에 전부 생성되거나 클라이언트에서 실행되는 앱 |
어떤 행이 열려 있는지는 프로젝트 안에서 직접 확인할 수 있는 세 가지에 달려 있습니다:
- 요청 시점에 내 서버 코드가 실행되어야 하는가? Flask나 FastAPI 라우트,
server.js엔드포인트, 요청별 서버 로직이 있다면 서버 측 호스트가 필요합니다. 빌드 시점의 서버 코드가 정적 배포를 자동으로 배제하지는 않습니다. Next.js Server Components는next build중에 실행될 수 있고, 정적GETRoute Handler는 프리렌더링할 수 있습니다. 런타임의 모든 요청을 정적 자산으로 제공하거나 브라우저에서 외부 API로 직접 보낼 수 있다면 정적 경로는 여전히 열려 있습니다. - 보관해야 할 파일을 읽거나 쓰는가? 데이터베이스 파일(
.db,.sqlite), 업로드 폴더, 앱이 편집하는 JSON 파일 같은 것들입니다. 그렇다면 배포 전에 호스트의 스토리지 모델을 확인하세요. Render 무료 웹 서비스와 Koyeb 무료 인스턴스는 휘발성 로컬 스토리지를 쓰고, Vercel Functions는 임시/tmp공간만 있는 읽기 전용 파일시스템입니다. 앱의 로컬 디스크가 살아남을 거라 가정하지 말고, 영속 상태는 내구성 있는 볼륨이나 데이터베이스, 오브젝트 스토리지에 두세요. - 런타임에 시크릿이 필요한가? 처음 두 경로에서는
.env파일의 키가 그대로 동작합니다. 앱이 여전히 내 컴퓨터에서 실행되기 때문이죠. 나머지 두 경로에서는 제공업체의 환경 설정에 키를 다시 입력해야 하며, 푸시하는 저장소 안에 키가 들어 있으면 안 됩니다.
내 네트워크 안에서 공유하기
next dev 은 이미 컴퓨터의 모든 네트워크 인터페이스에서 수신 대기합니다(화면에 보이는 0.0.0.0 이 뜻하는 게 바로 그것입니다). python -m http.server도 마찬가지입니다. 둘 다 플래그가 필요 없으니, 지금 실행 중인 개발 서버는 아마 같은 Wi-Fi의 휴대폰에서 이미 접속됩니다.
Next.js 문서는 -H 를 호스트명을 바꾸는 옵션으로 설명하며 기본값은 0.0.0.0입니다. Python 문서는 이 모듈이 모든 인터페이스에 바인딩된다 고 밝히며, 예외는 --bind 127.0.0.1을 넘길 때뿐입니다. 그래서 이것이 localhost 앱을 공유하는 가장 빠른 방법입니다. 계정도, 설치도, 배포도 없습니다. 다른 흔한 개발 서버들은 따로 알려줘야 합니다.
# Already listening on all interfaces. Nothing to add.
next dev
python -m http.server 8000
streamlit run app.py
# Needs the flag.
npm run dev -- --host # Vite
flask run --host=0.0.0.0
uvicorn main:app --host 0.0.0.0 # FastAPI
Vite 문서: server.host 의 기본값은 localhost이고, CLI에서는 --host 를, 설정 파일에서는 server.host: '0.0.0.0' 를 받습니다. Uvicorn의 기본값은 127.0.0.1이며, FastAPI를 실행하는 것이 Uvicorn이므로 FastAPI도 여기에 해당합니다. Streamlit은 server.address 를 비워 두며, 설정 레퍼런스에는 이 값을 설정하면 접근이 제한된다 고 적혀 있습니다. 그 주소 하나로만 제한되며, 비워 두면 제한이 없습니다.
다음은 상대에게 알려줄 주소입니다. 로컬 네트워크에서 내 컴퓨터가 가진 IP이지, localhost:
# macOS
ipconfig getifaddr en0
# Linux
hostname -I
# Windows (PowerShell)
ipconfig | findstr IPv4
방문자에게 http://<that-address>:3000 을 알려주면 바로 접속됩니다. 함정은 이 경로의 구조 자체에 있습니다. 그 주소는 내 네트워크 밖에서는 아무 의미가 없습니다. 상대가 다른 Wi-Fi나 셀룰러로 옮기거나 집에 가는 순간 링크는 죽습니다.
참고: 명령어는 잘 실행되는데 다른 기기에서 여전히 연결이 안 된다면, 거의 매번 명령어가 아니라 OS 방화벽이 원인입니다. Apple의 방화벽 문서에 따르면 macOS는 아직 허용하지 않은 앱에 대해 경고를 띄우고 사용자가 조치할 때까지 연결을 거부합니다. Windows는 대신 어떤 네트워크 프로필을 적용할지 묻고 개인 네트워크와 공용 네트워크에 별도의 규칙 을 둡니다. 집이나 사무실 네트워크에서는 개인을 고르세요. 공용은 절대 고르지 마세요.
터널 뒤에 두기
터널은 앱 옆에서 실행되며 앱에 공개 HTTPS 주소를 부여하는 작은 프로그램입니다. 명령어 하나면 1분 정도 만에 localhost로 가는 무료 터널이 생기는데, 그 명령어가 끝나는 순간 URL도 죽는다는 점은 미리 알아두세요:
cloudflared tunnel --url http://localhost:3000
라우터에서는 아무것도 바꿀 필요가 없습니다. 연결이 흐르는 방향 때문입니다. 내 컴퓨터가 제공업체의 엣지로 아웃바운드 연결을 열고(브라우저가 웹페이지를 불러올 때 여는 것과 같은 종류의 연결), 제공업체는 그 연결을 열어 둔 채 인바운드 요청을 그 통로로 되돌려 보냅니다. 내 쪽 인바운드 포트는 닫힌 채로 남기 때문에 호텔 Wi-Fi, 휴대폰 핫스팟, 라우터를 직접 관리할 수 없는 가정용 회선에서도 동작합니다.
참고: 마지막 경우는 포트 포워딩을 고려하기 전에 60초짜리 점검을 해볼 가치가 있습니다. 라우터 상태 페이지를 열어 표시된 WAN IP를 찾고, "내 IP 확인" 같은 서비스에서 얻은 실제 공인 IP와 비교하세요. WAN IP가
100.64.0.0/10범위 안에 있다면 CGNAT일 가능성이 높습니다. WAN IP와 공인 IP가 단순히 다르기만 하다면 상위에 NAT 계층이 하나 더 있다는 뜻이지만, 그것이 CGNAT일 수도 있고 평범한 이중 NAT일 수도 있습니다. 어느 쪽이든 이 라우터에서만 포트 포워딩해서는 부족할 수 있습니다. 이 대역은 RFC 6598이 공유 주소 공간으로 예약한 범위로, ISP가 주소가 부족할 때 사용자를 그 뒤에 두는 대역입니다.
옵션들의 차이는 주로 처음에 무엇을 요구하느냐에 있습니다.
Cloudflare 퀵 터널 은 위의 명령어 그대로입니다. 계정도 도메인도 필요 없고, 무작위 trycloudflare.com 서브도메인을 받습니다. Cloudflare는 이를 동시 처리 요청 200개로 제한하며, 초과 시 429를 반환하고, Server-Sent Events를 지원하지 않으며, 같은 문서에서 무료 터널은 테스트와 개발용이지 프로덕션 웹사이트 배포용이 아니라고 밝힙니다.
ngrok 은 먼저 가입한 뒤 ngrok http 3000. 현재 무료 플랜 은 매월 갱신되지 않는 일회성 사용 크레딧 5달러, 최대 3개의 온라인 엔드포인트, 1 GB 전송량, 20,000회의 HTTP/S 요청을 제공하며 방문자가 클릭해서 넘어가야 하는 경고 페이지가 끼어듭니다. 자동으로 배정되는 무료 개발용 도메인도 받는데, 이는 ngrok이 2023년에 발표한 것 으로 재시작할 때마다 URL이 바뀐다는 오랜 불만을 없애기 위한 조치였습니다.
localtunnel 은 가입도 필요 없고 npx 외에는 설치할 것도 없습니다: npx localtunnel --port 3000. 무작위 서브도메인을 받으며, README는 --subdomain 이름을 요청할 뿐 보장하지는 않는다.
localhost.run 은 아무것도 설치하지 않습니다. OS에 이미 들어 있는 SSH 클라이언트를 쓰기 때문입니다: ssh -R 80:localhost:3000 localhost.run. 문서에는 다운로드가 필요 없다 고 적혀 있고, 무료 도메인에는 계정 설정도 필요 없습니다.
VS Code 는 Ports 패널에서 이 기능을 제공합니다. 이미 에디터 안에서 사는 사람에게는 편리하죠. GitHub 또는 Microsoft 로그인이 필요하고, 기본값 때문에 발이 걸립니다: 포워딩된 포트는 기본적으로 비공개이므로, 포트를 공개로 바꾸기 전까지 방문자는 내 계정으로 로그인하라는 요구를 받습니다. (팀 동료라면 괜찮습니다. 링크만 클릭하고 싶은 고객에게는 쓸모가 없습니다.)
Tailscale Funnel 도 같은 일을 하지만, 보통 결정을 좌우하는 두 가지 제약이 있습니다. URL은 내 테일넷 도메인에서만 쓸 수 있고, 443, 8443, 10000 포트에서만 수신.
무엇을 고르든 내가 무엇을 내보냈는지는 분명히 알아야 합니다. 접근 제어가 없는 공개 터널에서는 개발 서버가 제공하는 모든 것이 그 URL을 가진 누구에게나 닿습니다. 한 번도 링크한 적 없는 라우트와 켜 둔 디버그 인터페이스까지 포함해서요. 15분짜리 데모라면 괜찮습니다. 공개 Discord에 붙여 넣는 URL이라면 훨씬 덜 괜찮습니다.
만료는 앱이 고장 난 것처럼 보이기 때문에 사람을 당황하게 합니다. 여기 소개한 빠른 경로 대부분은 여전히 노트북에서 실행되는 터널 소프트웨어에 의존합니다. cloudflared, ngrok, localtunnel, 또는 localhost.run SSH 세션을 멈추면 포워딩도 멈춥니다. Tailscale Funnel은 --bg옵션으로 실행하면 예외입니다. Funnel 설정을 백그라운드에서 유지하고 재부팅 후에도 복원하기 때문입니다. 하지만 노트북 자체가 오프라인이면 어느 것도 로컬 앱을 제공할 수 없습니다. 터널을 며칠씩 켜 둘 수는 있지만, 노트북을 덮거나 요청 한도에 닿는 순간까지만 동작합니다.
터널은 데모에는 맞는 도구이고 호스팅에는 틀린 도구입니다. 터널의 가동 시간은 곧 내 노트북의 가동 시간입니다.
앱을 내 컴퓨터 밖으로 내보내기
노트북이 더 이상 버팀목이 아닌 첫 번째 경로이자, 도구보다 약관이 더 중요한 첫 번째 경로입니다. 여기서 끝을 내는 것은 타이머가 아닙니다. 유휴 시 절전, 파일시스템 초기화, 또는 내 앱이 무료 인스턴스에 두고 싶은 종류가 아니라고 판단하는 요금제입니다.
아래 옵션은 상시 무료 플랜부터 짧은 체험판까지 다양합니다. 한도 안에서 앱을 무기한 온라인으로 유지할 수 있는 곳도 있고, 정해진 체험 기간이 끝나면 멈추거나 컴퓨팅에 유료 계정을 요구하는 곳도 있습니다. 배포 전에 결제, 절전, 스토리지 규칙을 확인하세요.
아래 무료 티어 조건은 2026년 9월 7일에 각 제공업체의 요금 또는 문서 페이지에서 확인한 내용입니다.
| 제공업체 | 상업적 이용 | 재시작 후 데이터 보존 | 함정 |
|---|---|---|---|
| Netlify | 허용 | 예, Netlify Blobs 또는 Database 사용 시 | 카드 없이 시작 가능. Free 플랜의 월간 크레딧을 모두 쓰면 업그레이드하지 않는 한 다음 결제 주기까지 프로젝트가 일시 중지됨 |
| Render | 명시되지 않음 | 재시작 시 소실 | 카드 없이 시작 가능. 15분 유휴 시 절전. 무료 Postgres는 생성 후 30일에 만료 |
| Cloudflare Pages / Workers | 명시되지 않음 | 예, KV, D1, R2 또는 Durable Objects 사용 시 | 월 500회 Pages 빌드. Workers 무료 티어는 하루 100,000회 요청 |
| Vercel | Hobby에서는 불가 | 재시작 시 소실 | Hobby는 개인 용도 전용. 함수 파일시스템은 읽기 전용 |
| GitHub Pages | 불허 | 정적 결과물만 | 온라인 사업, 전자상거래, 상업용 SaaS 불가. 배포 타임아웃 10분 |
| PythonAnywhere | 명시되지 않음 | 예 | 무료 계정은 허용 목록에 있는 외부 호스트에만 접근 가능. 무료 웹 앱은 한 달 뒤 만료 되며 갱신해야 유지됨 |
| Fly.io | 명시되지 않음 | 예, Fly Volume 사용 시 | 상시 무료 티어 없음. 머신 2시간 또는 7일. 체험 Machine은 5분 실행 후 자동 중지되고 체험판에 20 GB 볼륨 스토리지 포함. 체험 종료 시 카드를 등록할 때까지 앱 중지 |
| Koyeb | 명시되지 않음 | 내구성 있는 로컬 스토리지 없음 | 카드 필수. Koyeb은 29달러의 사전 승인을 걸었다가 취소하지만, 가입 시 기본으로 Pro가 선택되어 Starter로 바꾸지 않으면 일할 계산 요금이 청구됨 |
| Hugging Face Spaces | 명시되지 않음 | 재시작 시 소실 | Static Spaces는 무료. Gradio와 Docker는 보통 유료 플랜이 필요하지만, 자격을 갖춘 무료 개인 계정은 ZeroGPU에서 Gradio Space를 최대 두 개까지 호스팅 가능 |
| Railway | 명시되지 않음 | 예, 앱이 포함된 0.5 GB 볼륨을 쓸 경우 | 일회성 5달러 크레딧이 있는 30일 체험 후, 월 1달러 리소스 크레딧이 있는 0달러 Free 플랜으로 전환. 카드 불필요 |
"명시 없음"은 제공업체 자체 페이지가 무료 티어에 대해 답을 주지 않는다는 뜻입니다. 예나 아니오가 아니라 알 수 없음으로 받아들이세요.
이 중 세 행은 시작 전에 한 번 더 봐야 합니다. Fly.io는 상시 무료 티어가 없습니다. 체험판은 머신 2시간 또는 7일이 지나면 끝납니다. Koyeb은 무료 인스턴스를 제공하지만 가입과 결제 흐름을 배포 전에 주의해서 봐야 합니다. Hugging Face는 Static Spaces를 무료로 유지하지만, 새 Gradio와 Docker Space는 제한적인 ZeroGPU 예외를 빼면 유료 계정이 필요합니다. Railway는 더 이상 이 경고 목록에 속하지 않습니다. 5달러 크레딧이 있는 30일 체험 후 이제는 월 1달러 리소스 크레딧이 있는 0달러 Free 플랜으로 넘어갑니다.
다음은 데이터 문제입니다. 멀쩡히 돌아가던 앱이 조용히 고장 나는 지점이죠. Render의 무료 웹 서비스는 휘발성 파일시스템에서 실행되며, 문서는 업로드된 이미지와 로컬 SQLite 데이터베이스를 콕 집어 그곳에 쓴 것은 재배포, 재시작, 절전 때마다 사라진다고 잘라 말합니다. Vercel의 함수는 임시 작업 공간만 있는 읽기 전용 파일시스템에서 실행되므로, 앱이 쓰는 SQLite 파일은 거기서도 안전하지 않습니다. 앱이 상태를 파일에 보관한다면 내구성 있는 스토리지로 옮기세요. 호스팅된 데이터베이스, 오브젝트 스토리지, 또는 플랫폼이 지원한다면 영속 볼륨입니다.
절전은 결정하기 전에 직접 겪어 볼 가치가 있습니다. Render 무료 티어에서는 15분 유휴 상태면 서비스가 잠들고, 다음 요청이 들어오면 1분 정도에 걸쳐 로딩 페이지를 보여주며 깨어납니다. 링크를 클릭한 사람이 그 화면을 보게 되죠. 포트폴리오라면 어깨 한 번 으쓱하면 그만입니다. 통화 중에 링크를 여는 고객이라면 최악의 60초입니다.
PythonAnywhere의 함정은 더 미묘합니다. 유휴 절전은 없지만 무료 웹 앱에는 한 달짜리 만료가 있어서 PythonAnywhere가 이메일로 보내는 갱신 링크를 클릭하지 않으면 멈춥니다. 또 무료 계정은 아웃바운드 인터넷 접근이 제한 되어 허용 목록에 있는 외부 호스트에만 닿습니다. 그 목록 밖의 API를 호출하는 앱은 멀쩡히 온라인 상태로 있으면서 허용되지 않은 그 API로 가는 요청마다 실패합니다(어디에서도 장애처럼 보이지 않아 디버깅하기 끔찍합니다).
정적 사이트로 내보내기
앱이 하는 일 중 요청 시점에 서버 코드가 필요한 것이 없다면, 정적 호스트가 여기서 "설정하고 잊어버리기"에 가장 가까운 옵션입니다. 노트북 없이도 온라인을 유지하고, 깨어나기를 기다리는 앱 프로세스도 없습니다. 호스트의 계정 조건과 사용량 한도는 여전히 적용됩니다. 생각보다 많은 앱이 여기에 해당하기 때문에, 서버 측 호스트가 필요하다고 단정하기 전에 앞의 세 질문 중 첫 번째에 답해 볼 가치가 있습니다.
기준은 "백엔드가 있는가"보다 더 좁습니다. 앱이 보내는 모든 요청이 내 정적 파일로 가거나, 브라우저에서 다른 누군가의 API로 곧장 간다면 자격이 있습니다. 브라우저에서 Supabase나 공개 API를 호출하는 것은 괜찮습니다. 단, 브라우저 코드 안에 있는 키는 이미 공개한 키라는 점만 기억하세요. 문을 닫는 것은 요청마다 내 코드가 서버에서 실행되어야 한다는 조건입니다.
자격이 된다면 절차는 짧습니다:
npm run build # Vite writes to dist/, a Next.js static export writes to out/
그다음 빌드 결과물을 정적 호스트에 배포합니다. Cloudflare Pages, Netlify, Vercel은 연결된 저장소에서 바로 빌드할 수 있습니다. GitHub Pages는 브랜치에서 정적 파일을 게시하거나 GitHub Actions로 프레임워크 빌드를 실행해 생성된 결과물을 배포할 수 있습니다.
GitHub Pages의 제약은 처음부터 따져야 할 만큼 뚜렷합니다. 정적 전용, 계정당 사용자 또는 조직 사이트 하나, 그리고 사업체를 위한 무료 호스팅이 아니다라고 명시한 사용 제한입니다. 전자상거래 사이트나 상업용 SaaS도 마찬가지입니다. 앱이 결제를 받을 예정이라면 시작하기도 전에 제외됩니다.
이 경로에는 앱 프로세스 만료가 없습니다. 호스팅 계정이 활성 상태이고 한도 안에 있는 한 계속 동작하며, 앱이 요청 시점에 서버 측 작업을 필요로 하는 순간부터 맞지 않게 됩니다.
무료 경로가 끝나는 지점
무료 경로들은 한꺼번에가 아니라 서로 다른 지점에서 한계에 부딪힙니다. 정적 호스트는 이미 노트북 가동 시간 문제를 해결하고 안정적인 제공업체 URL을 줍니다. 무료 앱 호스트도 같은 일을 할 수 있고, 일부는 이제 영속 스토리지도 포함합니다. VPS가 의미를 갖기 시작하는 것은 요구 조건이 쌓일 때입니다. 내 서버 측 프로세스가 계속 온라인이어야 하고, 예측 가능한 영속 스토리지가 필요하며, 무료 플랜의 리소스나 사용 규칙이 더 이상 맞지 않을 때죠.
그 문턱은 존중할 가치가 있습니다. 데모 한 번은 서버를 살 이유가 아니고, 트래픽 적은 정적 프로젝트도 마찬가지입니다. 짧은 공유에는 터널을, 앱이 정말 정적인 동안에는 정적 호스트를, 한도가 실행 중인 것에 맞는 동안에는 무료 앱 호스트를 계속 쓰세요.
직접 제어하는 상시 가동 서버가 필요하고 그에 따르는 운영 작업을 떠안을 준비가 되었을 때 VPS로 옮기세요. Cloudzy Linux VPS 도 한 가지 선택지이고, 다른 제공업체의 비슷한 VPS도 같은 일을 할 수 있습니다. 가장 작은 플랜이면 충분하리라 가정하지 말고 앱에 맞춰 서버 크기를 정하세요.
루트 액세스, NVMe, AMD EPYC 성능을 갖춘 Linux VPS에서 개발하세요.
Linux 요금제 보기그렇게 하면 두 가지가 달라집니다. 플랫폼 호스트가 제공하던 git 푸시 배포 워크플로가 더 이상 자동이 아닙니다. Coolify나 Dokku같은 셀프 호스팅 PaaS로 다시 만들거나 직접 CI/CD 경로를 구축할 수 있지만, 어느 쪽이든 이제 업데이트와 유지보수는 내 몫입니다.
또 하나의 변화는 그 서버에 앱 말고도 더 많은 것을 둘 수 있다는 점입니다. 에디터까지 그곳에 두고 싶다면 Code Server와 Claude Code를 실행 하는 것도 얼마든지 가능합니다. 사람에 따라 반가운 보너스일 수도, 완전히 새로운 주말 프로젝트일 수도 있습니다.
자주 묻는 질문
노트북을 덮은 뒤 공개 URL이 왜 안 되나요?
터널이 앱이 아니라 터널을 만든 프로세스에 묶여 있었기 때문입니다. 노트북을 덮거나 터미널을 종료하면 그 프로세스가 끝나고 공개 URL은 죽지만, 앱 자체는 멀쩡합니다. 도구가 예약된 도메인을 배정해 주지 않는 한 터널을 다시 시작하면 새 URL이 생깁니다. 노트북이 잠들어도 링크가 살아 있어야 한다면, 앱이 내 컴퓨터를 떠나야 합니다.
로컬 앱을 공개 URL에 올리려면 도메인 이름이 필요한가요?
거의 모든 경우 필요 없습니다. Cloudflare 퀵 터널, ngrok이 배정하는 개발용 도메인, localtunnel, localhost.run, 그리고 위의 무료 호스팅 티어 모두 자사 도메인의 서브도메인을 무료로 배정합니다. 예외는 Cloudflare 네임드 터널로, Cloudflare DNS에 이미 추가한 도메인이 필요합니다.
다른 Wi-Fi 네트워크에 있는 사람이 내 로컬 IP 주소를 열 수 있나요?
아니요. 192.168.1.42 같은 주소는 지금 접속한 네트워크에서 그 주소를 가진 기기를 가리킬 뿐이며, 다른 네트워크에서는 전혀 다른 기기이거나 아무것도 아닙니다. 내 Wi-Fi 밖에 있는 사람에게는 터널, 무료 호스팅 티어, 또는 정적 호스트가 필요합니다.
앱에 로그인과 데이터베이스가 있다면 어떤 방법이 되나요?
같은 네트워크 경로와 터널 경로는 앱이 여전히 내 컴퓨터에서 실행되므로 그대로 동작합니다. 로그인과 데이터베이스 요청이 브라우저에서 호스팅된 서비스로 직접 가고 요청마다 실행되어야 하는 비공개 서버 측 코드가 없다면 정적 배포도 가능합니다. 내 인증이나 데이터베이스 코드가 요청 시점에 서버를 필요로 한다면 서버 측 호스트를 쓰세요. 무료 앱 호스트에서는 앱의 로컬 파일시스템이 살아남을 거라 가정하지 말고 영속 데이터를 내구성 있는 스토리지에 두세요.

토론
댓글
토론에 참여하려면 로그인하세요.