만들면서 배운 것

붐비는 곳 대신 여유로운 곳을 알려주려다, 공식 공지부터 다시 읽어야 했다 🧭

reactions/생각.png — 지도를 보며 갸웃하는 초록이 아빠

주말에 원주로 나들이를 가려고 관광지를 검색했는데, 어디를 눌러도 사람 많은 사진뿐이었어요. 여긴 붐비고, 저긴 주차장부터 막히고. 그럼 덜 붐비는 곳은 어디 있는지 알려주는 서비스는 왜 없을까, 하다가 마침 한국관광공사가 관광 데이터로 여는 공모전을 발견했습니다.

붐비는 곳과 한산한 곳을 양쪽에서 보여주고, 붐비는 곳을 고르면 “그럼 대신 여기, 대신 이 시간에”를 제안하는 여행 플래너를 만들어보기로 했어요. 이름은 「여유」. 정부가 공개한 오픈API로 관광지 혼잡도를 30일치 예보로 받아올 수 있다는 걸 확인하고 나서는, 개념 자체는 어려울 게 없어 보였습니다.

실제로 붙어보니 어려운 건 코드가 아니라 다른 데 있었어요.

왜 이걸 혼자, 주말엔 로봇 손을 빌려서 만들었나

개발 기간은 7월 말부터 9월 셋째 주까지 두 달 남짓인데, 그 사이에 아이 백일이 껴 있었어요. 평일엔 육아와 본업으로 시간이 안 나고, 온전히 집중할 수 있는 건 밤과 주말 정도였습니다.

그래서 리듬을 하나 정했어요. 평일엔 제가 무엇을 만들지 판단하고, 주말엔 그 판단을 코드로 옮기는 일을 에이전트에게 맡긴다. 맥미니에 예약 작업을 걸어두고, 토요일 아침이 되면 정해둔 작업 목록을 하나씩 구현하게 했습니다. 대신 규칙은 확실히 박았어요. 브랜치를 새로 파서 그 안에서만 작업하고, 빌드와 검증이 통과할 때만 커밋하고, 뭘 해야 할지 애매하면 코드를 건드리지 말고 질문만 남기게.

이 리듬 덕분에 제가 못 붙어있는 시간에도 진도가 나갔습니다. 문제는 그 리듬이 처음부터 매끄럽게 돌지는 않았다는 거예요.

지역코드부터 막혔다

관광지 혼잡도를 받아오는 API는 지역코드와 시군구코드를 반드시 같이 넣어야 값을 돌려줍니다. “전국 관광지 혼잡도 한 번에 주세요”가 안 되는 구조예요. 그런데 이 API는 하루에 부를 수 있는 횟수가 개발 단계에서는 천 번으로 막혀 있었습니다.

전국 시군구가 250곳쯤 되니, 하루 한 번씩만 순회해도 한도의 4분의 1을 씁니다. 화면을 새로고침할 때마다 매번 새로 부르는 방식으로는 며칠 안에 한도를 넘길 게 뻔했어요. 그래서 하루 한 번 전체를 미리 불러다 저장해두고, 화면에서는 그 저장된 값을 꺼내 쓰는 방식으로 바꿨습니다. 어차피 혼잡도 예보는 하루에 한 번만 갱신되는 데이터라, 매번 새로 부를 이유가 애초에 없었던 거예요.

이건 예상했던 종류의 벽이라 큰 삽질은 아니었습니다. 진짜 삽질은 다음이었어요.

규정을 다시 읽었더니, 정반대였다 🔍

공모전 안내문을 처음 볼 때 “공사 명칭이나 로고를 서비스 화면에 쓰면 안 된다”는 문구를 봤어요. 그래서 화면 어딘가 남아있던 “KTO”라는 글자까지 찾아서 지웠습니다. 규정을 지키는 중이라고 생각했죠.

그런데 접수를 앞두고 운영사무국 공지를 다시 훑다가, FAQ에 이런 문장이 있는 걸 발견했어요. “출처: ⓒ한국관광공사” 표기는 금지가 아니라 필수라고요. 금지되는 건 서비스명이나 로고에 공사 이름을 써서 마치 공사가 직접 운영하는 서비스처럼 보이게 하는 것이었습니다. 저는 정반대로 읽고, 있어야 할 출처 표기까지 지워버린 상태였던 거예요.

제일 큰 삽질은 코드가 아니라, 다 읽었다고 생각한 공지를 사실은 안 읽은 것이었다.

허탈했지만 다행히 접수 전에 발견했습니다. 지웠던 “출처: ⓒ한국관광공사” 표기를 화면 아래에 다시 넣는 작업을 그 주 할 일 목록 맨 위에 올렸어요. 이 일로 알게 된 게, 공식 문서는 한 번 읽고 기억에 저장해두는 게 아니라 결정적인 순간마다 원문을 다시 대조해야 한다는 거였어요. 제 기억이 아니라 문서가 기준이니까요.


데이터가 한 달 늦게 온다는 걸, 실제로 불러보고서야 알았다

방문자 수 데이터도 붙이려고 했는데, 8월 데이터를 요청하면 빈 값이 돌아왔습니다. 처음엔 제가 요청 방식을 잘못 짰나 싶어서 코드를 한참 들여다봤어요. 그러다 7월 데이터로 같은 요청을 넣어보니 값이 멀쩡하게 나오더라고요.

정리해보니 이 데이터는 집계와 검증을 거쳐 한 달 정도 늦게 공개되는 구조였습니다. 최신 월을 요청하면 당연히 비어있는 게 맞았던 거예요. 문서 어디에도 이 지연이 몇 주인지 숫자로 박혀 있지 않아서, 실제로 여러 달을 하나씩 불러보고서야 확인할 수 있었습니다. 그래서 화면에는 그냥 방문자 수만 보여주지 않고 “몇 월 기준”이라는 문구를 같이 넣기로 했어요.

주말 로봇이 조용히 멈춰 있었다

삽질에 멘붕한 초록이 아빠 — 주말 자동화가 멈춰 있던 것을 발견

가장 허탈했던 삽질은 따로 있어요. 어느 주말, 예약해둔 자동화가 아무 것도 하지 않고 그대로 지나갔습니다. 로그를 보니 실행은 됐는데 중간에 멈춰서 응답이 없는 상태로 하루를 넘긴 거였어요.

원인을 찾아보니, 화면 없이 예약 작업으로 실행되는 환경에서는 평소 터미널로 직접 실행할 때와 실행 조건이 미묘하게 달랐습니다. 사람이 로그인해서 화면을 띄운 상태를 전제로 도구가 응답을 기다리다가, 그런 화면이 없으니 하염없이 대기만 하고 있었던 거예요. 해결책은 그 도구를 화면 있는 환경이 아니라, 원격 접속하듯 텍스트로만 오가는 환경에서 실행하도록 바꾸는 거였습니다. 이후로는 매주 같은 시간에 조용히, 그리고 확실하게 돌아갑니다.

지금은 이렇게 돌아간다

개념도 — 평일 사람 판단·주말 에이전트 구현 리듬

지금 「여유」는 강원 원주시를 예로 들면, 붐비는 곳(뮤지엄산 같은 곳)과 한산한 곳을 양쪽 순위로 보여주고, 붐비는 명소를 누르면 “이 시간 말고 이 시간”, “여기 말고 여기”를 대안으로 안내합니다. 자체적으로 매겨본 완성도 점수는 초반 56점에서 지금 74점까지 올라왔어요. 이 점수는 제가 임의로 매기는 게 아니라, 심사 기준표에 있는 항목을 하나씩 대조해서 채점하는 방식으로 뽑습니다.

배포 주소에 로그인 없이 들어가서 실제 데이터로 확인할 수 있는 상태고요. 계정을 만들 필요 없이 지역만 고르면 바로 결과가 나옵니다.


따라 하기

이번엔 코드 명령어보다, 제가 삽질하면서 실제로 AI에게 시킨 확인 작업 위주로 남깁니다. 공공데이터든 다른 외부 API든, 뭔가 붙이기 전에 이 세 가지부터 시키면 저와 같은 삽질을 줄일 수 있어요.

1. 내가 이해한 규정과 원문을 다시 맞춰보기

규정은 한 번 읽고 넘어가면 기억이 슬쩍 바뀝니다. 저처럼 “금지”와 “필수”를 반대로 기억할 수도 있어요. 그래서 원문 링크를 다시 주고, 제가 이해한 내용과 문장 단위로 대조시킵니다.

📋 프롬프트 — 복사해서 AI에 붙여넣으세요

너는 공식 문서를 꼼꼼히 대조하는 역할이야.
아래는 이 공지/약관 원문 링크(또는 붙여넣은 원문)이고,
그 아래는 내가 지금까지 이해하고 있던 내용을 정리한 거야.

[원문 링크 또는 원문 붙여넣기]

[내가 이해한 내용 요약]

문장 단위로 대조해서, 내가 잘못 이해했거나
반대로 알고 있는 부분이 있으면 원문 인용과 함께 짚어줘.
애매한 표현은 "애매함"이라고 표시하고 임의로 해석하지 마.

✅ 이렇게 되면 성공 — 내가 맞다고 믿던 항목 중 최소 하나는 “원문과 다름” 또는 “애매함”으로 표시돼서 돌아옵니다. 하나도 안 걸리면 오히려 한 번 더 의심해보세요.

⚠️ 막히면 — 원문이 너무 길면 AI가 앞부분만 읽고 판단할 수 있습니다. “문서 전체를 다 확인했어? 뒷부분에 예외 조항 없어?”라고 되물어보세요.

2. 가정을 실제 응답으로 검증하기

문서에 안 적혀 있는 것(데이터가 며칠 늦게 오는지 같은)은 문서를 아무리 다시 읽어도 안 나옵니다. 직접 여러 값을 불러서 비교시켜야 해요.

📋 프롬프트 — 복사해서 AI에 붙여넣으세요

이 API에 [최근 3~6개 기간]을 각각 요청해서 응답을 비교해줘.
- 어느 시점부터 값이 비기 시작하는지 찾아줘.
- 빈 값과 "0건"과 "에러"를 구분해서 알려줘.
- 발견한 패턴(예: n개월 지연)을 문장으로 정리해줘.

✅ 이렇게 되면 성공 — “n월 이전은 값이 있고, 그 이후는 비어있다” 같은 구체적인 경계가 나옵니다.

⚠️ 막히면 — 한 번 요청으로 결론 내지 말고 최소 두세 개 지역·기간으로 반복시키세요. “다른 지역에서도 같은 패턴이야?”라고 물어보면 됩니다.

3. 주말 자동화에 멈추는 조건 박아두기

자동화가 무섭게 실패하는 것보다, 조용히 멈춰서 아무 일도 안 하는 게 더 무섭습니다. 실패했다는 신호조차 없거든요. 그래서 판단이 안 서면 반드시 멈추고 흔적을 남기도록 시킵니다.

📋 프롬프트 — 복사해서 AI에 붙여넣으세요

너는 화면 없는 예약 작업 환경에서 혼자 실행돼.
아래 작업 목록을 순서대로 처리해줘.

- 각 작업은 새 브랜치에서만 진행하고, 빌드/검증이 통과할 때만 커밋해.
- 무엇을 할지 애매하거나 판단이 필요한 지점을 만나면,
  코드를 넘겨짚어 고치지 말고 멈춰서 질문을 파일로 남겨.
- 작업을 시작할 때와 끝낼 때 각각 한 줄로 로그를 남겨서,
  다음에 내가 "정말 끝까지 돌았는지" 확인할 수 있게 해줘.

✅ 이렇게 되면 성공 — 다음 날 로그 파일에 시작·종료 기록이 남아 있고, 판단이 필요했던 지점은 질문으로 정리돼 있습니다.

⚠️ 막히면 — 로그도 없이 그냥 멈춰 있다면, 화면 있는 환경을 전제로 한 도구가 섞여 있을 가능성이 큽니다. “화면 없는 환경에서 막히는 도구나 명령이 있는지 점검해줘”라고 물어보세요.

배운 것

reactions/화이팅.png — 다짐하는 초록이 아빠

이번에 제일 크게 배운 건, 삽질의 8할은 새로운 걸 몰라서가 아니라 이미 안다고 믿은 걸 다시 확인 안 해서 생긴다는 거였어요. 규정도, 데이터 지연도, 자동화가 멈춘 이유도 전부 “다시 들여다보니” 풀렸습니다.

그리고 주말에 대신 일해주는 손이 있다는 게, 육아기에는 생각보다 큰 차이를 만든다는 것도요. 대신 그 손에 아무거나 맡기면 안 되고, 판단이 끝난 조각만 맡겨야 한다는 것도 이번에 확실히 배웠습니다.

오늘도 한 걸음. 🐴

이 글은 산업 구조와 만드는 과정을 정리한 개인 기록입니다.
특정 종목의 매수·매도 추천이 아니며, 투자 판단과 그 결과는 독자 본인에게 있습니다.

← 글 목록으로