-- 2026-08-07 · 최저가 수집 이력에 '몰별 확인 상태' 미러링 (기존 DB 보정) -- 배경: '그 몰에 더 싼 게 없었다'와 '그 몰이 막혀서 못 봤다'가 화면에서 똑같이 '–' 로 보인다. -- 사용자는 앞쪽으로 읽지만 실제로는 뒤쪽일 수 있다 — 안 본 걸 없다고 말하는 셈이다. -- by_mall 은 **가격이 있는 몰만** 담으므로 그 구분이 담길 자리가 없었다. -- LPS 가 lps_db.price_history.sources/partial 로 내려주기 시작했고(2026-08-07), -- lps_sync_service 가 이 컬럼으로 미러링한다. 상태 정의는 lps/docs/result-states.md. -- 멱등: ADD COLUMN IF NOT EXISTS — 여러 번 실행해도 안전. -- 적용: psql -h -p -U -d -f postgres-init/alters/2026-08-07-iilp-source-state.sql \connect negosium_db -- 몰별 확인 상태 — {"naver": {"state": "matched", "count": 40}, -- "coupang": {"state": "blocked", "error": "..."}} -- state: matched / no_match / empty / blocked / env_blocked / unavailable / skipped ALTER TABLE partner.item_internet_lowest_prices ADD COLUMN IF NOT EXISTS sources JSONB NULL; -- 결과가 완전한가. true = 못 본 몰이 있어 이 값이 최종이 아니다. -- sources 에서 유도할 수 있지만 컬럼으로 둔다 — 화면이 '어떤 상태가 확인된 것인가'라는 판단 -- 규칙까지 알아야 하면 상태 정의가 LPS 와 negodata 두 곳으로 흩어진다. 판단은 LPS 가 끝낸다. ALTER TABLE partner.item_internet_lowest_prices ADD COLUMN IF NOT EXISTS partial BOOLEAN NOT NULL DEFAULT FALSE; COMMENT ON COLUMN partner.item_internet_lowest_prices.sources IS '몰별 확인 상태 {몰: {state, count|error}} — lps_db.price_history.sources 미러링. state=SourceState'; COMMENT ON COLUMN partner.item_internet_lowest_prices.partial IS '못 본 몰이 있어 결과가 최종이 아님 — 화면은 이 값으로 "일부 확인 못함"을 표시'; -- 검증 SELECT column_name, data_type, column_default FROM information_schema.columns WHERE table_schema = 'partner' AND table_name = 'item_internet_lowest_prices' AND column_name IN ('by_mall', 'sources', 'partial') ORDER BY column_name;