Fujimod
Try your camera firmware in the browser and build Fujimod SD boot files.
출발지와 도착지를 검색하고 두 장소 사이의 자동차 거리와 직선거리를 간편하게 확인하세요.
Translation pending
LifestyleTypeScriptGitHub @Chyeon2650OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Nominatim으로 출발지와 도착지를 조회하고 자동차 경로 거리 또는 직선거리를 확인하는 한국어 웹앱입니다. Next.js App Router + TypeScript로 작성했으며 GitHub 저장소를 Vercel에 Import해서 배포합니다.
오른쪽 그림은 경로 개요입니다. 배경 지도나 내비게이션이 아니며, 정확한 지도는 결과의 링크에서 확인합니다. 자동차 예상 시간은 실시간 교통을 반영하지 않습니다. 지도 사이트의 데이터 갱신이나 도로 스냅에 따라 링크에서 다시 계산한 값은 다를 수 있습니다. Nominatim 데이터에 없는 장소는 검색되지 않으며, 이름이 같은 장소는 주소를 보고 선택해야 합니다.
Node.js 22 이상과 npm이 필요합니다.
npm ci
npm run dev
http://localhost:3000 에 접속합니다. 개발 모드에서는 메모리 캐시와 단일 프로세스 요청 제한을 사용하므로 환경변수 없이 확인할 수 있습니다. 검색창에 서울역을 입력하고 검색을 누른 다음 결과를 선택합니다. 도착지도 같은 방법으로 선택한 후 거리 계산하기를 누릅니다. 공개 API에 자동완성 요청을 보내지 않습니다.
node_modules, .next, .env.local은 올리지 않습니다. package-lock.json은 함께 올립니다.npm run build로 둡니다. Output Directory는 기본값을 유지하고 Node.js는 22 이상을 선택합니다.| 환경변수 | 필수 | 값 |
|---|---|---|
UPSTASH_REDIS_REST_URL | 공개 배포 필수 | Upstash Redis의 HTTPS REST URL |
UPSTASH_REDIS_REST_TOKEN | 공개 배포 필수 | Upstash의 쓰기 가능한 REST Token. Readonly Token 아님 |
APP_USER_AGENT | 공개 배포 필수 | 예: BetweenDistance/1.0 (+https://your-project.vercel.app) 또는 실제 운영자 연락 이메일을 포함한 식별자 |
NOMINATIM_BASE_URL | 선택 | 기본 https://nominatim.openstreetmap.org |
OSRM_BASE_URL | 선택 | 기본 https://routing.openstreetmap.de/routed-car |
자동으로 제공되는 VERCEL_URL과 별개로 APP_USER_AGENT를 직접 지정합니다. 아직 도메인이 없으면 운영자 연락 이메일을 먼저 사용해도 됩니다. 서버 환경변수에 NEXT_PUBLIC_를 붙이지 마세요. Redis 토큰은 서버에서만 사용합니다. .env.example에 설정 예시가 있습니다. 로컬 환경변수는 .env.local에 저장합니다.
Redis와 앱 식별자가 빠진 공개 배포에서는 외부 API 요청을 보내지 않고 설정 안내를 표시합니다. 따라서 GitHub Import에 더해 위 환경변수 설정이 필요합니다. npm run build 자체에는 외부 API나 Redis 연결이 필요하지 않습니다. npm run start는 운영 모드이므로 로컬에서도 위 설정이 필요하고, 개발용 확인은 npm run dev를 사용합니다.
Nominatim 공개 서비스는 앱 전체 초당 최대 1회, 사용자 동작에 따른 조회, 식별 가능한 User-Agent, 출처 표시를 요구하며 입력 중 자동완성을 금지합니다. 운영자는 Nominatim 사용 정책을 확인하고 준수해야 합니다. 공개 API는 적당한 사용자 수의 가벼운 사용을 위한 서비스입니다.
이 앱은 다음과 같이 제한합니다.
SET NX PX로 API 호스트별 앱 전체 요청을 잠급니다. 외부 요청 종료 후에도 1.1초 동안 잠금을 유지합니다. 잠금 중 다른 요청은 429와 재시도 안내를 받으며 자동 재시도하지 않습니다.공개 경로 서버도 FOSSGIS 사용 안내에 따라 초당 1회 이하로 사용하며 대량 사용과 서비스 보장을 전제로 하지 않습니다. 앱에 OpenStreetMap 저작자, OSRM/FOSSGIS, 지도 수정 링크를 표시합니다.
검색어는 Nominatim에, 경로 좌표는 OSRM에 전달되며 해당 제공자의 로그에 남을 수 있습니다. 검색어 원문은 캐시 키에서 SHA-256으로 변환하고, 선택 후보와 경로는 서버/Redis에 일시 캐시됩니다. 사용자에게 검색창으로 민감한 개인정보를 입력하도록 요구하지 마세요. 공개 운영 시 Redis 사용량과 Vercel 요청량도 확인하세요.
npm test
npm run build
npm run typecheck
거리 계산 경계값, 좌표 검증, 지도 링크, 캐시, 동시 요청 제한, Redis 장애 시 중단, 검색 결과 변환, 경로 실패를 검증합니다. 단위 테스트는 외부 서비스를 모의 응답으로 대체합니다.
브라우저 통합 테스트는 최초에 npx playwright install chromium으로 브라우저를 설치하고 npx playwright test로 실행합니다. 설치된 Chrome을 쓰려면 PowerShell에서 $env:PLAYWRIGHT_CHANNEL = 'chrome'을 설정한 뒤 실행합니다. 검색의 수동 실행, 결과 선택, 지도 링크, 모바일 레이아웃, 경로 실패를 확인하며 API는 모의 응답을 사용합니다.
src/app/page.tsx: 입력·선택·거리 결과 화면src/components/place-search.tsx: 사용자 동작에 따른 검색과 결과 선택src/app/api/search/route.ts: Nominatim 프록시src/app/api/route/route.ts: OSRM 자동차 경로 프록시src/lib/providers.ts: 공용 캐시, 분산 요청 제한, 외부 서비스 설정src/lib/distance.ts: 직선거리, 단위, 지도 링크참고: Nominatim Search API, OSRM API, Upstash REST API, Next.js on Vercel.