Victor

[연재] Cloudflare Pages — 무료로 세상에 내놓기

연재 · 2026-08-18

여섯 벌을 만들었는데 다섯 벌은 아무도 안 읽습니다

 

검색엔진한테 "우리 사이트엔 이런 주소들이 있어요"라고 알려주는 파일이 두 장 있습니다. robots.txtsitemap.xml 이요. 도구를 하나 만들 때마다 이걸 꼬박꼬박 같이 만들어 올렸어요. 배포할 때 알아서 만들어지게 해뒀고, 만들어진 걸 열어서 주소가 제대로 들어갔는지도 봤습니다.

 

여섯 개를 한 집으로 합치던 날, 그게 대부분 헛일이었다는 걸 알았어요.

 

한 도메인에서는 뿌리에 있는 것만 읽힙니다. victor-house.com/leave/robots.txt 는 아무도 안 봐요. 구글도 네이버도 victor-house.com/robots.txt 딱 한 장만 읽고 갑니다. 도구마다 한 벌씩 만들어둔 여섯 벌 중 다섯 벌은, 한 집으로 들어오는 순간 그냥 파일이 된 거예요.

 

합치면서 남긴 기록에 이렇게 적혀 있습니다.

 

배포 — 본진과 도구 여섯을 한 도메인 아래로 묶는다

각 도구가 자기 sitemap 을 들고 오면 merge-seo 가 뿌리 한 벌로 합친다 —
한 도메인에는 뿌리에 있는 것만 읽히므로 /leave/robots.txt 는 아무도 안 본다.

 

무서운 건 이런 게 에러를 안 낸다는 점이에요. 배포는 성공했다고 뜨고, 파일도 그 자리에 멀쩡히 있고, 열어보면 내용도 맞습니다. 그냥 아무도 안 읽을 뿐이에요. "했다"와 "됐다" 사이가 이렇게 벌어져 있는데, 화면 어디에도 그 말은 안 나옵니다.

 

오늘은 만든 걸 남에게 보여주는 이야기입니다. 여기서부터 몇 편은 전부 그 얘기예요.

 

 

서버가 없으면 남은 어떻게 보나요

 

4편에서 서버를 안 쓰기로 했다는 얘기를 드렸어요. 페이지를 미리 다 만들어두고 그대로 나눠주는 방식이요. 그때는 좋은 점 위주로 얘기했는데, 그 선택엔 대가가 하나 딸려 있습니다.

 

미리 만들어둔 파일은 제 맥미니 안에만 있다는 거예요.

 

제 화면에서는 완벽합니다. 계산기도 돌고 지도도 그려지고 카드도 뜹니다. 그런데 그건 제 컴퓨터에서 제 파일을 연 것뿐이에요. 다른 분이 그걸 보려면 그 파일들이 어딘가 늘 켜져 있는 곳에 있어야 합니다. 만드는 문제가 끝나면 바로 이 문제가 나와요.

 

답은 Cloudflare Pages 였습니다. 파일 뭉치를 통째로 올려두면 전 세계 어디서 들어오든 그쪽이 나눠줍니다. 호스팅 비용이 0원이라는 얘기는 4편에서 이미 드렸으니 여기선 넘어갈게요. 이 편에서 하고 싶은 얘기는 가격이 아니라 주소입니다.

 

올리는 일 자체는 허무할 만큼 간단합니다. 카드 도구를 올리려고 만든 첫 배포 스크립트가 열두 줄이었어요. 그중 실제로 인터넷에 올리는 건 마지막 한 줄입니다.

 

npx wrangler pages deploy "$STAGE" --project-name=card-wallet --branch=main --commit-dirty=true

 

나머지 열한 줄은 올릴 파일을 한 폴더에 모으는 일이고요. 미리 한 번 로그인해두는 것 말고는 준비할 것도 없습니다. 서버를 빌리고 설정하고 하는 일이 통째로 없어요.

 

그래서 문제가 생겼습니다. 너무 쉬우니까 도구를 만들 때마다 그냥 하나씩 올렸거든요.

 

도구가 여섯이 되니 사이트도 여섯이 됐습니다

 

한동안 제가 만든 것들은 이렇게 살고 있었어요.

 

parental-pay.pages.dev       육아휴직 급여 계산기
card-wallet.pages.dev        카드 혜택
equity-holdings.pages.dev    지분·지배구조
bible-map.pages.dev          성경 아틀라스
sigong-study.pages.dev       기술사 스터디
victor-simpson.pages.dev     글

 

여섯 곳입니다. 각자 잘 돌아갔어요. 하나 고쳐도 나머지가 안 깨지고, 주소도 짧고, 만들기도 제일 쉽습니다. 아무 문제 없어 보이시죠.

 

문제는 검색엔진 눈에 이게 서로 남이라는 거예요.

 

구글은 사이트 단위로 신뢰를 쌓습니다. 어떤 도메인에 사람이 오래 머물고, 다른 데서 링크가 걸리고, 글이 꾸준히 늘면 그 도메인에 점수가 붙어요. 그런데 제 건 여섯 갈래로 갈라져 있으니, 어느 쪽에도 점수가 안 쌓입니다. 카드 도구가 아무리 잘 돼도 그 덕을 계산기가 못 봐요. 반대도 마찬가지고요.

 

여섯 개로 나눈 밭에 씨를 나눠 뿌린 셈이에요. 어느 밭도 무릎 높이를 못 넘습니다.

 

이게 이 편에서 사람이 붙잡은 첫 번째 지점입니다. 여섯이 다 멀쩡한데 합쳐야 한다는 판단은, 고장 난 걸 고치는 판단이 아니거든요. 어느 화면에도 빨간 등이 안 켜져요. 에러 로그에도 안 남습니다. AI한테 "이 도구 어디 잘못됐냐"고 물으면 아무 문제 없다고 답할 거고, 실제로 그 말이 맞습니다. 도구 하나하나는 정말 멀쩡했으니까요.

 

"각자 살면 다 죽는다"는 건 도구를 들여다봐서 나오는 답이 아니라, 여섯 개를 한꺼번에 위에서 봐야 나오는 답이에요.

 

경로 하나에 도구 하나

 

그래서 2026년 7월 23일에 한 도메인으로 모았습니다. 구조는 이렇게 갔어요.

 

victor-house.com/          글
                /leave/    육아휴직 급여 계산기
                /cards/    카드 혜택
                /equity/   지분·지배구조
                /bible/    성경 아틀라스
                /study/    기술사 스터디
                /switch/   키보드 스위치 찾기

 

victor-house.com 이라는 집이 하나 있고, 방마다 도구가 하나씩 들어간 모양입니다. 배포 스크립트에도 방이 이 순서대로 번호가 붙어 있어요 — 뿌리가 1번, /switch/ 가 7번입니다. 방을 하나 더 트는 게 이때부터는 그냥 번호 하나 더 붙이는 일이 됐어요.

 

중요한 건 화면과 기능은 하나도 안 건드렸다는 겁니다. 바꾼 건 배포 구조뿐이에요. 지금 각 방을 열어보면 전부 그대로예요.

 

 

/leave/ 육아휴직 급여 계산기입니다. 통상임금을 넣으면 월별로 얼마씩 받는지, 총 얼마인지, 복직일이 언제인지 나와요.

 

 

/cards/ 카드 혜택. 카드사별 장수가 그대로 붙어 있습니다. 신한 182장, KB국민 173장, NH농협 120장… 이런 식으로요.

 

 

/equity/ 지분·지배구조. 첫 화면이 삼성 그룹인데 계열사 66개, 총수 일가 5명, 순환출자 고리 1개가 뜹니다.

 

 

/bible/ 성경 아틀라스. 지형도 위에 언약 공동체와 영향이 미친 땅을 두 겹으로 얹은 지도예요.

 

 

/study/ 기술사 스터디. 첫 화면이 출제 경향 히트맵입니다. 철근콘크리트 140, 건설관리 105, 철골 92…

 

 

/switch/ 키보드 스위치 찾기. 합치던 날 일곱 번째 자리에 들어간 방이 이겁니다.

 

전부 예전에 각자 자기 주소에서 돌던 것들이에요. 옮긴 게 아니라 주소만 바뀐 거고요.

 

소스에 박아둔 옛 주소가 남습니다

 

여기서 걸림돌이 하나 나옵니다.

 

도구마다 자기 주소를 소스 안에 여기저기 적어둡니다. 검색엔진에게 "이 페이지의 정식 주소는 여기야"라고 말하는 자리, 카톡이나 페이스북에 링크를 붙였을 때 뜨는 미리보기 정보, 화면에 "이 주소를 복사하세요" 하고 보여주는 안내 문구… 이런 데 전부 자기 주소가 박혀 있어요.

 

주소가 바뀌면 그게 전부 거짓말이 됩니다. 화면은 새 주소에서 잘 뜨는데, 그 안에서는 계속 옛 주소를 가리키고 있는 거예요.

 

길은 두 갈래였습니다.

 

1. 도구 여섯 개 소스를 전부 찾아서 새 주소로 고친다 2. 도구는 그대로 두고, 올리기 직전에 갈아 끼운다

 

1번이 깔끔해 보이는데, 이걸 고르면 앞으로 주소가 바뀔 때마다 여섯 군데를 뒤져야 합니다. 게다가 도구들이 혼자서는 못 도는 물건이 돼요. 이제 통합 사이트 안에서만 말이 되는 주소를 갖게 되니까요.

 

그래서 2번으로 갔습니다. 배포 직전에 이런 치환이 돕니다.

 

rewrite-urls.py "$OUT" "https://victor-house.com/leave"    "$BASE_URL/leave"
rewrite-urls.py "$OUT" "https://victor-house.com/cards"     "$BASE_URL/cards"
rewrite-urls.py "$OUT" "https://victor-house.com/equity" "$BASE_URL/equity"

 

주소의 앞부분만 통째로 바꾸는 방식이라, 뒤에 뭐가 붙어 있든 그대로 이어집니다. 옛 주소의 그림 파일 하나를 가리키고 있었다면 새 경로의 같은 그림을 가리키게 되고요.

 

이 선택 덕분에 도구들은 아직도 혼자 떼어내면 혼자 돌아갑니다. 통합된 주소를 아는 건 배포 스크립트 하나뿐이에요. 어느 도구를 다시 독립 사이트로 떼어낼 일이 생겨도 그 자리만 들어내면 됩니다.

 

고칠 곳을 한 줄로 줄였습니다

 

그리고 여기서 규칙을 하나 스스로 걸었어요. 주소는 한 곳에서만 고친다.

 

site.conf 라는 파일이 있는데, 값이 딱 세 개 들어 있어요. 맨 위에 이렇게 적혀 있습니다.

 

# 통합 사이트의 주소 — 여기 한 줄만 고치면 전부 따라온다.
BASE_URL="https://victor-house.com"
PROJECT="victor-house"

 

이 한 줄을 바꾸고 다시 올리면 정식 주소도, 링크 미리보기도, 사이트맵도, robots.txt 도 전부 따라옵니다. 도구 소스에 박힌 옛 주소는 방금 그 치환이 알아서 갈아 끼우고요. (나머지 한 값은 나중에 광고를 붙일 때 쓰는 값인데, 그건 한참 뒤 편 얘기예요.)

 

별거 아닌 것 같지만 이게 바로 앞에서 겪은 사고를 없앤 규칙입니다. 여섯 군데에 흩어진 주소는, 다섯 군데를 고치고 한 군데를 빠뜨려도 아무 소리를 안 내거든요. 화면은 멀쩡하고 배포도 성공하고, 그 한 군데만 조용히 틀린 데를 가리킵니다.

 

빠뜨릴 수 있는 자리를 없애는 게 조심하는 것보다 낫더라고요.

 

옛 주소는 지우면 안 됩니다

 

합치고 나면 옛 주소 여섯 개가 남습니다. 이걸 어떻게 할 거냐가 이 편에서 제일 오래 붙잡은 대목이에요.

 

제일 간단한 건 지우는 겁니다. 이제 안 쓰니까요. 그런데 지우면 어떻게 되냐면, 옛 주소로 들어온 분이 이 화면을 봅니다.

 

 

없는 주소. 사람도 못 읽고, 검색엔진 입장에서는 "그 페이지 사라졌음" 한 마디만 듣게 돼요. 거기 쌓여 있던 평가도 같이 사라집니다. 합치는 목적이 흩어진 걸 한 군데로 모으는 건데, 지워버리면 모으기는커녕 버리는 거예요.

 

그래서 옛 주소 여섯 개는 지우지 않고, 내용물만 걷어내고 새 경로로 넘기는 표지판만 남겼습니다. 코드 주석에 이유가 그대로 적혀 있어요.

 

301 을 쓰는 이유: 검색엔진이 옛 주소에 쌓인 평가를 새 경로로 넘긴다.
302(임시)면 넘어가지 않는다. 통합의 목적이 흩어진 권위를 한 도메인에
모으는 것이므로 반드시 301 이어야 한다.

 

301은 "여기 영구히 이사했습니다", 302는 "잠깐 저쪽 좀 봐주세요"입니다. 사람 눈에는 똑같이 새 페이지로 넘어가니 차이가 안 보여요. 검색엔진만 다르게 알아듣습니다. 한 글자 차이인데 하는 일이 정반대예요.

 

지금 확인해보면 이렇게 넘어갑니다.

 

parental-pay.pages.dev      301 → victor-house.com/leave/
card-wallet.pages.dev       301 → victor-house.com/cards/
equity-holdings.pages.dev   301 → victor-house.com/equity/
bible-map.pages.dev         301 → victor-house.com/bible/
sigong-study.pages.dev      301 → victor-house.com/study/
victor-simpson.pages.dev    301 → victor-house.com/

 

뿌리만 넘기는 게 아니라 주소 뒤에 뭐가 붙어 있어도 그대로 이어서 넘깁니다. 옛 주소 어딘가를 즐겨찾기 해두셨어도 새 집의 같은 자리로 도착해요.

 

그리고 표지판만으로 안 될 때를 대비해 눈에 보이는 안내문 한 장도 같이 올려뒀습니다. 리디렉트를 안 따라가는 기계도 있거든요. "이 페이지는 저쪽으로 옮겼습니다"라고 적힌 페이지 한 장이요.

 

여기에 딸린 판단이 하나 더 있었어요. 옛 주소가 표지판만 들고 있으려면, 거기에 뭘 올리는 일이 다시는 없어야 합니다. 예전 배포 스크립트 하나를 무심코 돌리면 표지판 위에 옛날 사이트가 그대로 덮여요. 그러면 어제까지 쌓인 게 그날로 끊깁니다.

 

그래서 도구별로 갖고 있던 옛 배포 스크립트들을 지웠습니다. 남겨두면 언젠가 누가 돌릴 테니까요. 지금 필요한 배포 명령은 딱 하나만 남아 있고, 표지판이 덮였을 때 되돌리는 명령도 따로 적어뒀습니다.

 

이게 이 편에서 제일 마음에 드는 결정이에요. 조심하자고 다짐하는 대신 사고를 낼 수 있는 물건을 치운 것이라서요.

 

뿌리에 한 벌

 

이제 맨 처음 얘기로 돌아옵니다.

 

도구들이 각자 들고 오는 robots.txtsitemap.xml 을 걷어내고, 거기 적힌 주소만 뽑아서 뿌리에 한 벌로 다시 만듭니다. 지금 victor-house.com/robots.txt 를 열면 이게 전부예요.

 

 

세 줄입니다. "누구나 들어와서 다 봐도 된다", 그리고 "목록은 여기 있다". 그 목록이 이겁니다.

 

 

/bible/, /cards/, /equity/, /housing/, /leave/, /market/, /phone/… 전부 같은 도메인 아래 한 목록에 들어와 있죠. 예전 같으면 이 목록이 여섯 장으로 갈라져 있었고, 그중 다섯 장은 아무도 안 읽었을 겁니다.

 

주소 옆에 날짜도 같이 붙습니다. 이건 나중에 한 번 고친 자리인데, 처음엔 전부 "일주일에 한 번쯤 바뀝니다"라고 똑같이 적어 보냈어요. 그 값을 구글이 아예 안 읽는다는 걸 나중에 알았습니다. 실제로 보는 건 마지막으로 바뀐 날짜 쪽이에요. 수백 장이 전부 똑같아 보이면 뭐부터 읽을지 못 고르니까요. 도구가 날짜를 안 적어 보내면 그 자리는 그냥 비웁니다. 지어내면 그것도 거짓말이라서요.

 

글도 같은 집에 삽니다.

 

 

왼쪽 목록에 글 분류가 있고 그 아래에 도구들이 붙어 있어요. 글에서 도구로, 도구에서 글로 왔다 갔다 할 수 있습니다. 예전엔 이 둘이 서로 남이었어요.

 

접속 기록 같은 것도 이제 한 군데로 모입니다. 개인정보처리방침에 어디에 뭐가 가는지 표로 적어뒀는데, 접속 기록 칸에 Cloudflare 라고 적혀 있는 게 그 얘기예요.

 

 

하나는 일부러 안 합쳤습니다

 

여기까지 읽으시면 "그럼 전부 합치면 되겠네"로 들릴 것 같은데, 하나는 일부러 밖에 뒀어요.

 

건설사 환경 공시라는 별도 사이트가 있습니다. 성격이 달라서 이 집에 안 들이고 독립 사이트로 남겼어요. 배포도 따로 돌아갑니다.

 

기준은 "합치면 이득인가"가 아니라 "같은 사람이 같은 이유로 찾아오는 곳인가" 였습니다. 계산기를 보러 온 분이 카드 혜택도 볼 수 있고 글도 읽을 수 있어요. 그 사이를 오가는 게 자연스럽습니다. 그런데 저건 그 흐름 밖에 있어요. 억지로 한 집에 넣으면 집이 뭘 하는 곳인지가 흐려집니다.

 

원칙을 세우면 예외가 거슬리는데, 예외 없는 원칙이 더 위험하더라고요. "흩어진 건 모아야 한다"를 끝까지 밀면 상관없는 것까지 모으게 됩니다.

 

그래서 사람은 어디에 있었나

 

오늘 편은 코드가 별로 안 나왔어요. 실제로 손이 많이 간 것도 아닙니다. 파일을 한 폴더에 모으고, 주소를 갈아 끼우고, 표지판을 세운 게 전부니까요.

 

AI가 잘한 것. 여섯 개를 한 폴더로 모으는 절차를 짠 것, 소스에 박힌 옛 주소를 배포 직전에 갈아 끼우는 방식을 제안한 것, 301 표지판을 만들어 옛 주소마다 올리는 스크립트를 쓴 것. 정확하고 빨랐습니다. 이런 건 정말 손이 빨라요.

 

사람이 붙잡은 것. 네 군데였습니다.

 

첫째, 합치기로 한 결정. 여섯 개가 다 멀쩡했어요. 고장이 없으니 아무도 문제라고 말해주지 않습니다. 도구 하나씩만 보면 영원히 안 보이는 문제고, 여섯 개를 한꺼번에 위에서 봐야 보입니다.

 

둘째, 옛 주소를 안 지운 것. 안 쓰는 걸 지우는 건 정리처럼 느껴지죠. 그런데 여기서는 그게 그동안 쌓은 걸 버리는 일이었어요. 표지판을 세우는 쪽이 손은 더 갑니다.

 

셋째, 고칠 곳을 한 곳으로 줄인 것. 여섯 군데를 잘 고치자가 아니라, 고칠 자리를 하나만 남기자로 바꾼 겁니다. 안 빠뜨리려고 애쓰는 것보다 빠뜨릴 자리를 없애는 게 낫더라고요.

 

넷째, 사고 낼 수 있는 물건을 치운 것. 옛 배포 스크립트를 남겨두고 "돌리지 말자"고 다짐하는 대신 지웠습니다. 남아 있으면 언젠가는 돌아가거든요.

 

네 개 다 코드 문제가 아니에요. 전부 "무엇을 하지 않을 것인가" 쪽이었습니다. 지우지 않기, 고치지 않기, 합치지 않기. 만드는 일은 AI가 훨씬 빠른데, 안 하기로 정하는 일은 아직 사람 몫이더라고요.

 

그리고 오늘의 교훈 하나. 에러가 안 난다고 잘 되고 있는 건 아닙니다. /leave/robots.txt 는 지금도 만들면 잘 만들어져요. 배포도 잘 되고요. 그냥 아무도 안 읽을 뿐이죠. 잘못된 걸 알려주는 화면이 없는 종류의 문제는, 결국 사람이 한 번씩 위에서 내려다봐야 잡힙니다.

 

다음 편에

 

한 집에 모았더니 새 문제가 생겼어요. 올리는 일이 여섯 번이 됐습니다. 하나 고칠 때마다 어느 스크립트를 어떤 순서로 돌려야 하는지 기억해야 했고, 기억이 틀리면 낡은 화면이 그대로 살아 있었어요.

 

다음 편은 그 여섯 번을 한 번으로 만든 이야기입니다. 그리고 한 번으로 만들었더니 도구 하나가 넘어지면 아홉 개가 같이 안 올라가더라는 얘기도요.

 

#클라우드플레어 #CloudflarePages #무료호스팅 #정적사이트 #서버비0원 #웹사이트만들기 #홈페이지제작 #개인홈페이지 #도메인통합 #301리디렉트 #검색엔진최적화 #SEO #사이트맵 #robotstxt #배포자동화 #wrangler #CDN #웹개발 #1인개발 #사이드프로젝트 #AI코딩 #클로드 #ClaudeCode #바이브코딩 #휴먼인더루프 #AI활용법 #개발일지 #육아휴직계산기 #카드혜택 #빅터하우스

댓글

    로그인 없이 쓰는 대신, 등록한 댓글은 직접 지울 수 없습니다. 지워야 할 댓글은 옆의 신고를 눌러주세요.
    네이버 블로그글 원문 보러가기 →유튜브 쇼츠만드는 장면 20초로 보기 →
    관리자 Victor · 문의는 우상단 신고·제안으로 남겨주세요.
    글과 화면은 정적 파일로 만듭니다. 댓글과 조회수만 외부 데이터베이스에 저장합니다 — 개인정보처리방침

    오류 신고 · 제안

    관리자 Victor에게 전달됩니다