1. 개요
PARAPIA 홈페이지는 프레임워크 없는 순수 정적 사이트(HTML/CSS/JS)입니다. 서버 로직이 없어 빠르고, 유지보수가 단순합니다.
- 호스팅: GitHub Pages (무료, 무중단) — 내 PC를 켜둘 필요 없음
- 도메인: papi.kr (반값도메인 등록 → DNS로 GitHub 연결)
- 콘텐츠: 코드 기본값 + (선택) 구글 시트 실시간 연동
- 다국어: 한국어/영어 자동 전환
기술 스택: HTML5, 순수 CSS(다크 테마), Vanilla JavaScript, Pretendard 폰트, EmailJS(문의 메일), Google Apps Script(시트 연동), DiceBear(아바타).
2. 전체 아키텍처
[방문자 브라우저]
│ https://papi.kr 요청
▼
[반값도메인 DNS] papi.kr → GitHub Pages IP / www → github.io
│
▼
[GitHub Pages] ← 저장소 YudaeSong/papi-kr (main 브랜치)
│ 정적 파일 전송 (index.html, css, js, assets)
▼
[브라우저에서 JS 실행]
│ 1) language.js 기본 콘텐츠로 즉시 렌더
│ 2) (새로고침 시) 구글시트 데이터 fetch
▼
[Apps Script 웹앱] doGet() → 시트를 JSON으로 변환
│
▼
[Google Sheet] ← 운영자가 내용 편집하는 곳
─ 부가 ─
[EmailJS] 연락처 폼 → 이메일 발송
[GitHub] 코드 수정 → push → Pages 자동 재배포(1~2분)
핵심 한 줄: 코드(GitHub)는 "껍데기와 기본값", 구글 시트는 "실시간 내용"입니다. 글자만 바꿀 땐 시트를, 구조·디자인을 바꿀 땐 코드를 수정합니다.
3. 파일 구조
| 경로 | 역할 |
|---|---|
index.html | 메인 페이지. 모든 섹션 + 인라인 스크립트(시트 로드, 설정버튼, FAQ) |
legal.html | 개인정보 보호정책 + 서비스 약관 (탭 전환) |
manual.html | 이 운영자 매뉴얼 |
css/styles.css | 전체 디자인. 라이트 기본 + body.theme-dark 다크 오버라이드 |
js/language.js | 콘텐츠 기본값(한/영) + 다국어 엔진. 가장 자주 보는 파일 |
js/google-sheets-api.js | Apps Script 웹앱 URL, 시트 편집 URL, fetch 로직 |
js/main.js | 모바일 메뉴, 스크롤 애니메이션, 연락처 폼(EmailJS) |
js/content-data.js / content-manager.js | 구버전 보조 스크립트(현재 핵심 동작과 무관, 유지만) |
assets/logos/ | logo.png(영문명, 실제 사용), 원본(.ai/.psd/.pdf) |
assets/team/ | avatar1~4.png 팀 아바타 |
CNAME | papi.kr (GitHub Pages 커스텀 도메인 지정) |
.nojekyll | GitHub Pages의 Jekyll 처리 비활성(파일 그대로 서빙) |
server.js / package.json | 로컬 미리보기용. 배포(Pages)에는 사용되지 않음 |
4. 호스팅 & 도메인
GitHub
- 저장소:
YudaeSong/papi-kr(공개) - 배포 브랜치:
main/ 루트(/) - 설정 위치: 저장소 Settings → Pages
도메인 DNS (반값도메인)
| 타입 | 호스트 | 값 |
|---|---|---|
| A | papi.kr | 185.199.108.153 |
| CNAME | www | yudaesong.github.io |
※ 반값도메인은 같은 이름 A레코드 중복이 안 되어 IP 1개만 등록(정상 동작). GitHub 공식 IP는 108/109/110/111.153 네 개이며 여러 개 등록 가능한 DNS라면 4개 모두 권장.
HTTPS: DNS 반영 후 Settings → Pages → Enforce HTTPS 체크 시 무료 SSL 자동 적용(자물쇠).
5. 콘텐츠 관리 (핵심)
모든 텍스트는 HTML에 data-i18n="키" 형태로만 들어있고, 실제 글자는 두 곳에서 채워집니다.
- 기본값 —
js/language.js의translations.ko/translations.en - 실시간 값(선택) — 구글 시트 → Apps Script → 페이지 로드 시 덮어씀
① 시트로 수정 (권장 · 코드 안 건드림)
- 구글 시트에서 해당 셀의 한국어/영어 값을 수정 → 자동 저장
- papi.kr에서 F5(새로고침) → 반영
자동 주기 갱신은 꺼져 있습니다. 새로고침할 때만 시트 내용을 가져옵니다.
② 코드로 수정 (기본값 자체 변경)
js/language.js에서 해당 키의 ko/en 문자열 수정- git commit → push → 1~2분 뒤 자동 반영 (아래 12장)
data-i18n 동작
<h2 data-i18n="services_title"></h2> <!-- 빈 껍데기 --> // language.js: services_title: "우리의 서비스" // → 페이지 로드 시 applyTranslations()가 채움
입력칸 안내문은 data-i18n-placeholder="키" 를 사용합니다.
6. 구글 시트 & 설정 버튼
시트 구조
시트는 섹션별 탭으로 구성되고, 각 탭은 구분 / 항목 / 한국어 / 영어 4열입니다.
MenuHomeServices PortfolioTeamTestimonials ContactFooterBrands WhyChooseUsFAQ
각 행은 순서대로 번역 키에 매핑됩니다(매핑표는 Apps Script 코드 안 MAP 객체). 행 순서를 바꾸면 매핑이 어긋나니 주의.
Apps Script 웹앱 (시트 → JSON)
- 시트 → 확장 프로그램 → Apps Script 의
doGet()가 시트를 읽어{ko:{…}, en:{…}}JSON으로 반환 - 사이트는
js/google-sheets-api.js의SHEET_WEBAPP_URL로 이 JSON을 가져옴 - 시트에 탭/행을 추가했으면 Apps Script
MAP에도 키를 추가한 뒤 배포 → 배포 관리 → 새 버전으로 재배포해야 반영됨
설정(⚙️) 버튼 — 시트 빠른 열기
- 위치: 푸터 맨 아래 "서비스 약관" 오른쪽(배경과 같은 톤이라 거의 안 보임)
- 클릭 → 암호 입력창 → 암호가 맞으면 구글 시트가 새 탭으로 열림
- 관리자 암호:
parapia****
암호는 소스에 평문이 아니라 SHA-256 해시로만 저장됩니다. 단, 클라이언트 측 잠금이라 강력한 보안은 아닙니다(14장 참고). 암호 변경은 새 해시를 계산해
index.html 의 ADMIN_HASH 값을 교체.7. 다국어
- 접속 국가가 한국이면 한국어, 그 외는 영어로 자동 표시 (IP 기반 + 브라우저 언어 폴백)
- 강제 지정: 주소 뒤에
?lang=ko또는?lang=en - 선택 언어는 브라우저에 저장됨
- 관련 코드:
js/language.js의detectLanguage()
8. 디자인 / 테마
- 전부
css/styles.css한 파일. 색/여백/반응형 모두 여기서. - 다크 테마는
<body class="theme-dark">+.theme-dark …규칙으로 적용(범위 한정) - 브랜드 포인트 색: 파랑
#2f6bff/ 그라데이션 변수--brand-grad - 폰트: Pretendard (CDN
@import) - 새 섹션(브랜드 스트립·Why·FAQ·히어로 비주얼) 스타일도 같은 파일 하단에 위치
9. 팀 아바타 / 로고
- 아바타:
assets/team/avatar1~4.png(DiceBear "lorelei" 라인 스타일) - 교체: 새 이미지를 같은 파일명으로 덮어쓰거나,
index.html의 팀<img src>수정 - 로고:
assets/logos/logo.png(한글 파일명은 Pages 호환 위해 영문 사용)
10. 연락처 폼 (EmailJS)
- 코드:
js/main.js의 폼 submit 핸들러 +emailjs.send(...) - SDK:
index.html하단에서 EmailJS 스크립트 로드 - 설정값(EmailJS 대시보드와 일치해야 함): service ID, template ID, public key
- 변경 시 위 세 값을 본인 EmailJS 계정 값으로 교체
11. 약관 페이지
legal.html한 파일에서 [개인정보 보호정책] / [서비스 약관] 탭 전환- 푸터 링크:
legal.html#privacy,legal.html#terms - 내용은 표준 템플릿 — 실제 사업 형태에 맞게 문구 검토 권장
12. 수정 & 배포 절차
코드(디자인·구조·기본값)를 바꾸면 아래로 배포합니다. 시트 글자만 바꿀 땐 불필요(5장).
cd d:/Projects/papi.kr git add -A git commit -m "수정 내용 설명" git push # → GitHub Pages가 1~2분 뒤 자동 재배포
- 배포 상태: 저장소 Actions 탭 또는 Settings → Pages
- 반영 후 papi.kr에서 Ctrl+Shift+R(강력 새로고침)으로 확인
- 로컬 미리보기:
npm start→http://localhost:8080
13. 문제 해결
| 증상 | 점검 |
|---|---|
| 시트를 바꿨는데 반영 안 됨 | ① Ctrl+Shift+R 강력 새로고침 ② Apps Script 웹앱이 "모든 사용자" 권한으로 배포됐는지 ③ 새 탭/행 추가 시 Apps Script 재배포 했는지 |
| 화면 일부가 비어 보임 | 해당 키가 시트에서 빈 값이거나 기본값 누락. js/language.js 에 기본값 있는지 확인 |
| papi.kr 접속 안 됨 | DNS 반영 대기(최대 수시간) / A·CNAME 레코드 값 확인 / Settings→Pages 도메인 초록체크 |
| 자물쇠(HTTPS) 없음 | Settings→Pages의 Enforce HTTPS 체크(인증서 발급 후 활성화) |
| 로고/이미지 깨짐 | 파일 경로·파일명(영문) 확인, 대소문자 일치 |
| 콘솔(F12)에 빨간 오류 | 메시지 그대로 확인. 시트 연동 실패 시에도 사이트는 기본값으로 계속 동작 |
14. 보안 참고
- 저장소가 공개이므로 소스 전체가 열람 가능. 따라서 코드에 진짜 비밀(키/비번)을 두지 않음.
- 구글 시트는 Apps Script가 대신 읽어 API 키가 노출되지 않음.
- 설정(⚙️) 암호는 가벼운 가림용(클라이언트 측). 민감정보는 시트에 두지 말 것.
- 시트 공유 범위는 필요한 만큼만(편집 권한 최소화). Apps Script 실행 계정은 본인.
문의/추가 변경이 필요하면 이 매뉴얼의 해당 장(예: "5. 콘텐츠 관리")을 기준으로 요청하시면 됩니다.