폼 전송이 아직 설정되지 않았습니다 — 서버 없는 홈페이지에 폼 붙이기
문의 페이지를 열었더니 폼 자리에 "폼 전송이 아직 설정되지 않았습니다"가 떠 있었다. 방문자가 읽을 문장이 아니었다. 서버 없는 정적 사이트에 폼을 붙이면서 키를 어디에 둘지, 브라우저가 어디로 보내게 둘지, 받는 쪽은 무엇을 막아야 할지를 하나씩 정했다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
문의 페이지를 열었더니 폼 자리에 "폼 전송이 아직 설정되지 않았습니다"가 떠 있었다. 방문자가 읽을 문장이 아니었다. 서버 없는 정적 사이트에 폼을 붙이면서 키를 어디에 둘지, 브라우저가 어디로 보내게 둘지, 받는 쪽은 무엇을 막아야 할지를 하나씩 정했다.
회사 홈페이지 상단의 EN 버튼을 눌렀더니 주소 끝에 슬래시가 두 개 붙어 있었다. 경로를 만드는 함수 하나의 실수였는데, 그 함수를 언어 전환·hreflang·canonical 이 모두 쓰고 있었다. 서버 없이 HTML 만 올리는 회사 홈페이지를 Astro 로 만들고 IIS 에 배포하기까지의 이야기.
검색창에 '전역'을 쳤는데 Git 커밋 수정 스니펫이 떴다. 화면의 글자와 검색어 사이에, 아직 조합 중인 한 글자가 끼어 있었다. 복사하는 순간 날짜·환경 변수·전역 변수를 알아서 채우는 Cliply 0.3.0 과, 그걸 만들다 드러난 WPF 한글 입력 버그 이야기다.
관리자 태그 화면에 글 수가 0인 줄이 하나둘 쌓이고, 한글 태그 주소는 tag-숫자로 남아 있었다. 글이 늘어나며 생긴 정리 거리를 손보다가, 지워도 되는 빈 태그와 지우면 안 되는 빈 태그를 가르고, 한글 음절을 산수로 쪼개 영문 주소를 만들고, 연재 끝에 앱 받기 카드를 붙였다.
애드센스 사이트 상태가 '준비됨'으로 바뀌었다. 광고를 켜는 일만 남은 줄 알았는데, 막상 남은 건 어디를 끄느냐였다. 위치별 광고 여섯 자리 중 세 곳만 남기고 자동 광고는 한 가지만 남긴 이유, 처음 구성이 너무 많아 다시 줄인 과정와, 애드센스 미리보기가 끝내 뜨지 않은 이유를 정리했다.
달력 공유 초대를 보냈다. 받는 사람이 푸시를 꺼 두었거나 브라우저로 쓰고 있으면 그 초대는 어디에도 남지 않았다. 알림을 푸시가 아니라 기록으로 다시 세우고, 앱이 알림 채널과 공유하기와 큰 화면을 받아 주게 만든 이야기이자 연재의 마지막 편이다.
계란, 대파, 두부, 양파. 냉장고에 있는 걸 적으면 만들 수 있는 요리를 골라 주는 칸을 홈에 달았다. 언어 모델에게 레시피 전체를 넘기지 않고, 서버가 먼저 후보를 좁히고 모델은 그 안에서만 고르게 했다. 그러고 나니 원래 있던 규칙 기반 추천도 다시 손봐야 했다.
AI 식단 버튼이 처음 제대로 돌던 날, 정작 대답하지 못한 질문은 "이 버튼 한 번에 얼마냐"였다. 수익이 없는 서비스에 사용자 수만큼 늘어나는 청구서를 묶고, 공급자를 재시작 없이 갈아 끼우고, 그 과정에서 null 하나로 기능 하나를 통째로 멈춘 이야기.
한 달 치 점심과 저녁 한 상을 언어 모델에게 맡겼다. 미리보기는 꽉 찼는데 메뉴마다 '자동' 표시가 붙어 있었다. 모델은 한 줄도 고르지 못했고, 화면을 채운 건 서버의 보충 규칙이었다.
초성 퀴즈를 하면 다들 정답을 입으로 먼저 외치고 그다음에 자판을 찾는다. 그 외침을 그대로 답으로 받기로 했다. Unity 에서 Android 음성 인식을 플러그인 없이 부르고, 세 갈래로 흩어진 스레드를 정리하고, 다섯 개의 후보 중 하나를 고르기까지.