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