언제 이 방식?
구글시트를 쓰지 않고, 지금 사이트 안에서 [저장]이 실제로 저장되게 하고 싶을 때. 별도 시트 없이 Netlify가 데이터를 보관합니다. (구글시트 연동과 둘 중 하나만 선택하면 됩니다.)
선택 기준 — 구글시트 vs Netlify
| 구글시트 연동 | Netlify 저장(이 문서) |
| 입력 방법 | 익숙한 시트에서 직접 입력 | 사이트 화면에서 입력·[저장] |
| 추천 대상 | 엑셀에 익숙한 팀 · 여러 명 관리 | 사이트 화면에서 끝내고 싶을 때 |
| 구글 계정 | 필요 | 불필요 |
| 난이도 | 중 | 중(코드 파일 2개) |
1단계 · 함수 파일 2개 추가
- 사이트 폴더 최상단에
netlify.toml 파일 생성 → 아래 내용:
[functions]
directory = "netlify/functions"
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단계 · 배포하면 주소 생성
- 이 파일들을 포함해 Netlify에 배포(또는 GitHub 커밋)하면 함수가 자동 활성화됩니다.
- 함수 주소:
https://당신사이트.netlify.app/.netlify/functions/data
확인 필요 — Netlify Blobs는 최근 플랜에서 자동 지원되나, 계정·플랜에 따라 활성화가 필요할 수 있습니다(Netlify 대시보드에서 확인). 무료 사용 범위도 확인하세요.
3단계 · 사이트에 주소 넣기 (한 줄)
data/_localdata.js를 열어 맨 위 줄 수정:
window.KS_DATA_URL = "https://당신사이트.netlify.app/.netlify/functions/data";
- 저장 후 다시 배포. 이제 사이트가 이 저장소에서 데이터를 읽습니다.
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 등 정적자료는 사이트 파일 그대로 사용 |