본문으로 건너뛰기
개인FE+BE 웹 · 오늘 날짜 정각 15개 slot 재조회 · singleton KST · 고정 DTO projection

대신물류 배차 운영 원장

기획·FE·BE·배포·운영 단독

2026-01-01 — present

외부 배차 정보를 오늘 날짜로 수집해 노선·차량 검색과 통계를 제공하고, 수집 중복과 브라우저 데이터 경계를 분리한 운영 원장

검증된 결과

오늘 데이터 수집

오늘 날짜 · 월~토 06:00–20:00 · 정각 15개 slot

오전·지연 공개 재수집

이전: 14시 이전 전일 선택

replica 중복

singleton 15개 slot

singleton 복구

이전: replica별 15개 slot

브라우저 데이터 경계

차량정보 공개 · 내부 ID·credential URL 제외

고정 public route DTO

이전: 원천·내부 필드 구분 불명확

← 좌우로 스크롤해 시나리오 보기 →

합성 데이터로 재현한 날짜별 배차현황, 노선 검색, 노선 상세의 세 단계 사용 흐름
실제 React UI 구조를 고정 synthetic fixture로 재현한 사용 시나리오이며 실시간 데이터 근거로 사용하지 않습니다.

문제 해결 과정

1

Why — 오전에도 원천에 오늘 데이터가 있었지만 14시 이전에는 전일을 선택하는 규칙 때문에 누락됐다

해결 과정

How — 기본 수집일을 오늘 날짜로 고정하고 singleton KST scheduler가 월~토 06:00–20:00의 정각 15개 cron slot에서 재조회하도록 변경했다

결과

Result — 오전 데이터와 늦게 공개된 변경분을 정적 날짜·건수 문구 없이 후속 실행에서 반영할 수 있도록 변경

← 좌우로 스크롤해 시나리오 보기 →

오전 누락을 막는 오늘 날짜 재조회
오전 누락을 막는 오늘 날짜 재조회.14시 이전 전일 선택 규칙을 제거하고 월~토 06:00–20:00의 정각 15개 cron slot에서 오늘 날짜를 독립 재조회한다. 실패는 기록하며 즉시 retry/backoff 없이 다음 스케줄이 다시 확인한다.
2

Why — web replica마다 scheduler가 시작되어 동일 수집이 중복 실행됐다

해결 과정

How — 수집 책임을 web process 밖의 singleton KST scheduler 하나로 분리했다

결과

Result — replica별 15개 cron slot 구성에서 singleton의 15개 slot으로 축소(프로세스 시작 시 1회 동기화 제외)

← 좌우로 스크롤해 시나리오 보기 →

replica별 중복 수집을 singleton 책임으로 분리
replica별 중복 수집을 singleton 책임으로 분리.각 web replica가 15개 cron slot을 등록하던 구조에서 수집 책임을 별도 singleton KST scheduler 하나로 이동했다.
3

Why — 운영 화면에 필요한 원천 필드는 제공하면서 내부·credential 필드는 차단해야 했다

해결 과정

How — method/path allowlist, 필수 필드 검증, 고정 출력 projection과 원천 URL contract로 운영 화면 필드만 통과시키고 내부 ID·알 수 없는 필드·credential-bearing tracking URL을 제외했다

결과

Result — 고정 출력 projection과 원천 URL allowlist를 redirect·payload·배포 회귀 경계와 함께 검증

← 좌우로 스크롤해 시나리오 보기 →

공개 route 응답과 인증 경로의 분리
공개 route 응답과 인증 경로의 분리.Next.js proxy 전체가 아니라 public route 응답에만 allowlist projection을 적용한다. exact method/path·schema·payload limit·redirect 차단을 거치며 인증 경로는 allowlist된 method/path만 별도로 forward한다.

시스템 아키텍처와 운영 경계

수집은 오늘 날짜를 각 정각에 독립 재조회해 crawler와 SQLite로 전달합니다. 조회는 Next.js proxy의 public route DTO branch에서 공개 필드만 투영한 뒤 Traefik과 Express active slot을 거칩니다. 인증 경로는 별도로 전달하고, 비활성 slot은 health check 통과 뒤 전환합니다.

← 좌우로 스크롤해 수집·조회·배포 흐름 전체 보기 →

오늘 날짜 독립 재조회 수집 흐름, Next.js proxy의 public route DTO branch 조회 흐름, health-gated slot switch와 manual rollback 경계

운영 한계

수집 실패는 기록하고 다음 정각 실행에서 다시 확인한다. 즉시 retry/backoff는 없다.
SQLite는 현재 read-heavy 운영에 맞지만 수평 쓰기 확장에는 한계가 있다.
비활성 slot health check 후 전환하며 문제 발생 시 운영자가 이전 slot으로 되돌린다.

Claim → 공개 근거

저장소 홈이 아니라 각 주장과 직접 연결되는 코드·테스트·CI를 제공합니다.

BE clean CI run

BE 저장소의 clean CI가 성공했는가?

기술 스택

TypeScriptExpressNext.jsReactPrismaSQLiteCheerioTSyringeTanStack QueryDockerTraefikTailwind CSSVitest