📘 Netlify 저장 연동 가이드 — 대안(코드 방식)

KSmate 안전보건팀 · 구글 없이 Netlify 자체 저장소(Blobs)에 데이터 저장 · 사이트 화면 [저장]이 실제 저장
언제 이 방식?
구글시트를 쓰지 않고, 지금 사이트 안에서 [저장]이 실제로 저장되게 하고 싶을 때. 별도 시트 없이 Netlify가 데이터를 보관합니다. (구글시트 연동과 둘 중 하나만 선택하면 됩니다.)

선택 기준 — 구글시트 vs Netlify

구글시트 연동Netlify 저장(이 문서)
입력 방법익숙한 시트에서 직접 입력사이트 화면에서 입력·[저장]
추천 대상엑셀에 익숙한 팀 · 여러 명 관리사이트 화면에서 끝내고 싶을 때
구글 계정필요불필요
난이도중(코드 파일 2개)

1단계 · 함수 파일 2개 추가

  1. 사이트 폴더 최상단에 netlify.toml 파일 생성 → 아래 내용:
    [functions]
      directory = "netlify/functions"
  2. netlify/functions/ 폴더를 만들고 그 안에 data.mjs 파일 생성 → 아래 코드:
    import { getStore } from "@netlify/blobs";
    
    export default async (req) => {
      const store = getStore("ksdata");
      const url = new URL(req.url);
      const tab = url.searchParams.get("tab") || "";
      const cors = {
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Methods": "GET,POST,OPTIONS",
        "Content-Type": "application/json"
      };
      if (req.method === "OPTIONS") return new Response("", { headers: cors });
    
      if (req.method === "GET") {
        const data = (await store.get(tab, { type: "json" })) || [];
        return new Response(JSON.stringify(data), { headers: cors });
      }
      if (req.method === "POST") {
        const body = await req.json();          // { tab, rows }
        await store.setJSON(body.tab, body.rows || []);
        return new Response(JSON.stringify({ ok: true }), { headers: cors });
      }
      return new Response("[]", { headers: cors });
    };

2단계 · 배포하면 주소 생성

  1. 이 파일들을 포함해 Netlify에 배포(또는 GitHub 커밋)하면 함수가 자동 활성화됩니다.
  2. 함수 주소: https://당신사이트.netlify.app/.netlify/functions/data
확인 필요 — Netlify Blobs는 최근 플랜에서 자동 지원되나, 계정·플랜에 따라 활성화가 필요할 수 있습니다(Netlify 대시보드에서 확인). 무료 사용 범위도 확인하세요.

3단계 · 사이트에 주소 넣기 (한 줄)

  1. data/_localdata.js를 열어 맨 위 줄 수정:
    window.KS_DATA_URL = "https://당신사이트.netlify.app/.netlify/functions/data";
  2. 저장 후 다시 배포. 이제 사이트가 이 저장소에서 데이터를 읽습니다.

4단계 · 초기 데이터 넣기 (1회)

저장소가 처음엔 비어 있으므로, 현재 데이터를 한 번 넣어야 합니다. 브라우저 콘솔에서 각 탭에 대해 아래를 실행(또는 각 화면 저장버튼을 POST로 연결):

// 예: compliance 초기 데이터 업로드 (F12 콘솔에서)
fetch('/.netlify/functions/data', {
  method:'POST', headers:{'Content-Type':'application/json'},
  body: JSON.stringify({ tab:'compliance', rows: /* compliance.json 내용 붙여넣기 */ [] })
}).then(r=>r.json()).then(console.log);
사이트 화면의 [저장]이 실제 저장되게 하려면, 각 화면의 exportJson()(내려받기)을 위 POST 방식으로 바꾸면 됩니다. 원하시면 이 작업(화면 저장 → 자동 서버저장)을 적용해 드립니다.

정리

구분내용
읽기사이트가 ?tab=X로 함수에서 JSON 읽음(자동)
쓰기POST로 저장 · 화면 저장버튼 연결 시 [저장]=실제 저장
제외docs-index 등 정적자료는 사이트 파일 그대로 사용