아카이브 / 개발
season-app — 여행지 제철 재료 가이드 프로토타입
목차 — 프로젝트 요약 · 담당 범위 · 문제와 구현 접근 · 이 작업에서 한 일 · 결과물과 원문 · 구현 상세
프로젝트 요약
월과 지역을 고르면 그때 그곳의 제철 재료와 주산지, 고르는 법·보관법을 보여주고, 더 깊은 질문은 AI 검색으로 넘기는 모바일 우선 Next.js 프로토타입.
담당 범위
기획·구현을 맡은 개인 프로젝트다. 공개 저장소에 코드와 사용 방법을 남겼다.
문제와 구현 접근
여행지 음식을 식당 평점이 아니라 제철과 원산지로 탐색한다는 아이디어를 PRD와 기술 설계 문서(TDD)로 정리하고, 같은 방향으로 구현했다.
월 선택(기본값은 현재 월)과 17개 시·도 지역 필터, SVG 지도 오버레이로 재료를 거른다. 상세 페이지의 여섯 버튼은 템플릿으로 한국어 프롬프트를 만들어 Perplexity 검색으로 넘기며, 대부분의 프롬프트에 지역을 담는다.
sitemap, AI 크롤러를 허용하는 robots.txt, JSON-LD(Product·BreadcrumbList)를 넣었다. 재료 데이터는 직접 작성한 샘플이라 공식 출처와 대조하지 않았다. 자동화된 테스트가 없고 배포하지 않은 프로토타입이다.
이 작업에서 한 일
아이디어를 실제로 작동하는 코드로 만들고, 다른 사람이 설치하고 사용할 수 있도록 설명서를 함께 작성했다.
결과물과 원문
관련 등록공보·논문·저장소는 아래 링크에서 볼 수 있다.
구현 상세
README공개 저장소의 구조·기능·실행 문서
Season (시즌)
A mobile-first prototype of a seasonal food guide for travelers. Pick a month, and optionally a region, to see which Korean ingredients are in season, where they are mainly produced, and how to choose and store them.
The idea, from the product notes in docs/PRD.md: explore food on a trip by season and place of origin rather than by restaurant ratings. The tagline is "지금, 여기서만 먹을 수 있는 것", roughly "what you can only eat here, right now". The site shows the core facts and hands deeper questions (recipes, where to eat or buy) to an AI search engine.
Status: prototype. It is not deployed, it has no tests or CI, and the ingredient data is hand-written sample data (see Limitations).
Features
- Home (
/) - A month selector, which defaults to the current month.
- An optional region filter covering Korea's 17 시/도.
- A "지도보기" button that opens a full-screen overlay with a simplified SVG map of the 17 regions. Tapping a region applies it as the filter.
- The matching ingredients, each with its season months and main producing regions.
- Ingredient detail (
/ingredients/[id]) - A description, the season, the main producing regions, how to choose the ingredient, and how to store it.
generateStaticParamslists all 20 ingredient ids. The page reads?month=and?region=from the query string, so Next.js renders it on the server for each request. It is not a static export.- "AI로 알아보기": six buttons on the detail page (recipe, restaurants, where to buy, YouTube, blog, 고향사랑기부제 rewards). Each button builds a Korean prompt from a template in
src/lib/prompts.tsand opens it as a Perplexity search in a new tab. Most prompts include a region: the one passed from the list, or the ingredient's first producing region if none was passed. Only the recipe prompt also uses the month passed from the list, and the YouTube prompt uses neither. - Crawler-friendly output
src/app/sitemap.tslists the home page and every ingredient page.public/robots.txtexplicitly allows common AI crawlers.- Detail pages carry JSON-LD
ProductandBreadcrumbListdata. For items flaggedhasDonation, theProductalso includes a genericOffer(see Limitations).
Tech stack
- Next.js 14.2 (App Router), React 18, TypeScript 5
- Tailwind CSS 3.4
- ESLint (
eslint-config-next) - Geist and Geist Mono fonts, bundled in
src/app/fonts/under the SIL Open Font License 1.1 (seesrc/app/fonts/OFL.txt) - No backend or database. All data lives in static TypeScript files under
src/data/.
Getting started
Requires Node.js 18.17 or newer (the minimum for Next.js 14).
npm install
npm run dev # http://localhost:3000
npm run build # production build
npm run start # serve the production build
npm run lint
NEXT_PUBLIC_SITE_URL is optional. It sets the absolute base URL used in page metadata, the sitemap and JSON-LD, and defaults to http://localhost:3000. public/robots.txt is a static file that still names the default domain, so edit it by hand if you change the URL.
Project layout
src/
app/
page.tsx home: month selector, region filter, map overlay, list
ingredients/[id]/page.tsx ingredient detail + AI search buttons + JSON-LD
sitemap.ts
layout.tsx
components/
home/ MonthSelector, RegionFilter, MapOverlay
search/ AISearchButtons
seo/ JSON-LD helpers
data/ ingredients.ts (20 items), regions.ts (17 regions)
lib/ prompts.ts, constants.ts, utils.ts, hooks/
types/ shared types
docs/
PRD.md product requirements (Korean)
TDD.md technical design (Korean)
Limitations
- Sample data. The ingredient seasons, producing regions, nutrition notes, tips and donation flags were written by hand for the prototype. They have not been checked against official sources. The "🎁 기부" badge only reflects a
hasDonationflag in the data, and no donation amounts or specific rewards are listed. For the 19 flagged items, the detail page's JSON-LD still emits a genericOffersaying the item can be received as a 고향사랑기부제 reward, with a link to ilovegohyang.go.kr. ThatOffercomes from the same unverified flag. - Filters are not in the URL. The home page keeps the month and region in component state and does not read them from the URL. The detail page's back link passes
?month=and?region=, but the home page ignores them. - Unused components. The components under
src/components/{ingredient,map,season,ui}are from an earlier iteration and are not rendered. - Planned features.
docs/TDD.mddescribes some planned features that are not implemented, such as per-region pages and a search page. - No tests. There are no automated tests.