"웹 원장 읽음 — 1건"은 거짓말이었다 — PowerShell 5.1의 배열 함정
"웹 원장 읽음 — 1건"은 거짓말이었다 — PowerShell 5.1의 배열 함정
결과부터 — 몇 건이 있든 항상 "1건"이었다
비용·수익 대시보드를 만들면서 값을 Supabase로 옮겼어요. PowerShell 스크립트가 REST로 읽어 와서 화면에 접습니다. 로그는 매번 이렇게 찍혔어요:
웹 원장 읽음 — 비용 1건 · 수익 1건 · 출시홍보 1건
그런데 실제 테이블은 비용 0건 · 수익 0건 · 출시홍보 4건이었습니다. 0건도 1건, 4건도 1건. 몇 건이 있든 전부 1건 — 이게 결정적 힌트였어요.
범인 — Invoke-RestMethod는 배열을 풀지 않는다
Windows PowerShell 5.1의 Invoke-RestMethod 는 JSON 배열을 받으면 원소를 하나씩 내보내는 게 아니라 배열 통째를 한 객체로 내보냅니다. 그걸 @() 로 감싸면?
# JSON 이 [] 든 [r1, r2, r3, r4] 든 —
$rows = @(Invoke-RestMethod $url -Headers $h)
$rows.Count # 항상 1. "배열 하나"가 들어 있으니까.
뒤이은 foreach 는 "행"이 아니라 "배열 통째"를 한 번 돌고, 행에 있어야 할 속성이 없으니 조용히 건너뜁니다. 결과: 성공 메시지는 찍히는데 값은 하나도 반영되지 않는 완벽한 조용한 실패.
수정은 한 줄, 검증은 산출물로
# 파이프라인을 한 번 통과시키면 배열이 풀린다
$rows = @(Invoke-RestMethod $url -Headers $h | ForEach-Object { $_ })
$rows.Count # 0건이면 0, 4건이면 4
고치고 나서 로그가 "0건·0건·4건"으로 바뀐 걸 확인했지만, 여기서 멈추면 같은 실수예요. 성공 메시지를 믿다가 당한 건데 또 메시지를 믿을 수는 없죠. 그래서:
- 표식을 붙인 시험 행(₩1,234)을 실제로 삽입
- 대시보드 HTML에
월 순익 -1,234가 실제로 그려지는지 확인 - 시험 행 삭제 후 원상 복구까지 확인
재발 방지 — 성공을 가장하지 못하게
응답이 표 형태가 아니면(프록시가 뱉은 HTML, 스키마 캐시 오류 등) 성공한 척하지 않고 경고를 내며 파일 폴백으로 물러나는 검증 함수를 넣었습니다. 교훈은 하나예요:
성공 메시지 말고 산출물을 봐라. 로그는 코드가 하는 말이고, 산출물은 코드가 한 일이다.
공유
댓글
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요.