์ด ๋ฌธ์๋ ์ฌ์ดํธ ๋ด๋น์์ ๊ฐ๋ฐ์ ๋ชจ๋๋ฅผ ์ํ ์ธ์์ธ๊ณ ์๋ฃ์ ๋๋ค.
๋น๊ฐ๋ฐ์๋ ์ฝํ ์ธ ์์ ยท๋ฐฐํฌ ๋ฐฉ๋ฒ์ ์ดํดํ ์ ์๋๋ก ์์ฑ๋์์ต๋๋ค.
- ์ฌ์ดํธ ๊ฐ์
- ๋ก์ปฌ ๊ฐ๋ฐ ์๋ฒ ์คํ
- ๊ด๋ฆฌ์ ํจ๋ ์ฌ์ฉ๋ฒ
- ์ฝํ ์ธ ๋ฐ์ ํ๋ฆ (๋ด๋ณด๋ด๊ธฐ)
- ์ด๋ฏธ์ง ํ์ผ ๊ด๋ฆฌ
- ๋ฐฐํฌ ์ ์ฐจ
- ๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
- ์ฌ์ดํธ ๊ตฌ์กฐ โ ํ์ด์ง ๋ชฉ๋ก
- ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
- ๊ธฐ์ ์คํ
- ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์ฌ์ดํธ๋ช | ํ์ผ์จ์คํฐ ๊ณต์ ํํ์ด์ง |
| ์ธ์ด ์ง์ | ํ๊ตญ์ด / ์์ด (์ฐ์ธก ์๋จ ํ ๊ธ) |
| ๊ด๋ฆฌ์ ํจ๋ | ์ฌ์ดํธ์ฃผ์/#/admin |
| ์ฝํ ์ธ ์ ์ฅ ๋ฐฉ์ | public/content.json ํ์ผ 1๊ฐ๋ก ์ ์ฒด ์ฝํ
์ธ ๊ด๋ฆฌ |
| ํธ์คํ ์ ํ | ์ ์ ํ์ผ ํธ์คํ (๋ณ๋ ์๋ฒยทDB ๋ถํ์) |
- Node.js 18 ์ด์
- npm 9 ์ด์
# 1. ์ ์ฅ์ ํด๋ก ํ ์์กด์ฑ ์ค์น
npm install
# 2. ํ๊ฒฝ๋ณ์ ํ์ผ ์์ฑ (.env ํ์ผ์ด ์์ผ๋ฉด ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ ๋ถ๊ฐ)
# .env ํ์ผ์ด ์ด๋ฏธ ์๋ค๋ฉด ์ด ๋จ๊ณ ์๋ต
cp .env.example .env # ๋๋ ์๋ 7๋ฒ ํญ๋ชฉ ์ฐธ๊ณ ํ์ฌ ์ง์ ์์ฑ
# 3. ๊ฐ๋ฐ ์๋ฒ ์์ (http://localhost:5173)
npm run dev
# 4. ํ๋ก๋์
๋น๋ (๊ฒฐ๊ณผ๋ฌผ: dist/)
npm run build
# 5. ๋น๋ ๊ฒฐ๊ณผ ๋ก์ปฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
npm run previewhttp://localhost:5173/#/admin
@/ โ src/ ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์: import SubPageLayout from '@/components/SubPageLayout'
์ฌ์ดํธ์ ํ
์คํธยท์ด๋ฏธ์งยทํญ๋ชฉ์ ๊ด๋ฆฌ์ ํจ๋์์ ๋ชจ๋ ์์ ํ ์ ์์ต๋๋ค.
์ฝ๋๋ฅผ ๋ชฐ๋ผ๋ ๋ฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์
์ฌ์ดํธ์ฃผ์/#/admin์ ๋ ฅ - ๋น๋ฐ๋ฒํธ ์
๋ ฅ ํ ๋ก๊ทธ์ธ
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๋ฐฉ๋ฒ์ 7๋ฒ ํญ๋ชฉ ์ฐธ๊ณ
- 5ํ ์ฐ์ ์ค๋ฅ ์ ๋ ฅ ์ 15๋ถ ์๋ ์ ๊ธ
| ํญ | ๊ด๋ฆฌํ ์ ์๋ ๋ด์ฉ |
|---|---|
| ํ๋ก์ ํธ | ๊ณต์ฌ์์ฃผ ํํฉ ๋ชฉ๋ก โ ํ๋ก์ ํธ๋ช (ํ/์), ๋ฐ์ฃผ์ฒ(ํ/์), ์ฐ๋, ์ด๋ฏธ์ง, ๋ฉ์ธ ๋ ธ์ถ ์ฌ๋ถ |
| ๋ด์ค/๊ณต์ง | ๋ด์ค ๋ฐ ๊ณต์ง์ฌํญ โ ์ ๋ชฉ, ๋ ์ง, ํ๊ทธ, ์ด๋ฏธ์ง, ๋ ธ์ถ ์ฌ๋ถ |
| ๊ฑฐ๋์ฒ | ๋ฉ์ธ ํ๋ฉด ๊ฑฐ๋์ฒ ๋ก๊ณ ์ฌ๋ผ์ด๋ โ ๋ก๊ณ ์ด๋ฏธ์ง, ์ด๋ฆ, ๋ ธ์ถ ์์ |
| ํ์ฌ์๊ฐ | ์ธ์ฌ๋ง, ๊ฒฝ์์ด๋ , ์ฐํ, ์กฐ์ง๋, ์ ยท๋ฉดํยท์ธ์ฆ, ์ค์๋๊ธธ |
| ์ ํ๋ธ | YouTube ์ฑ๋ ID ๋ฐ ์์ ๋ชฉ๋ก |
| ์ธ์ฌ์ฑ์ฉ | ๋ณต๋ฆฌํ์ ์นด๋, ์ฑ์ฉFAQ, ์ฑ์ฉ๊ฐ์ด๋, ์ง๋ฌด์๊ฐ (ํ/์) |
| ํธํฐ ์ ๋ณด | ์ฃผ์(ํ/์), ๋ํ๋ฒํธ, FAX, ์ด๋ฉ์ผ, ๋ํ์๋ช |
| HTML/JS | ์ธ๋ถ ์คํฌ๋ฆฝํธ ์ฝ์ โ ํต๊ณ ์ฝ๋, ์ฑํ ์์ ฏ ๋ฑ |
| ๋ด๋ณด๋ด๊ธฐ | ํธ์งํ ์ ์ฒด ๋ด์ฉ์ content.json์ผ๋ก ๋ค์ด๋ก๋ |
- ๋น๋ฐ๋ฒํธ๋ ํ๋ฌธ์ด ์๋ PBKDF2-SHA256 (10๋ง ํ ๋ฐ๋ณต ํด์) ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๋น๋ฐ๋ฒํธ ์๋ฌธ์ ์ฝ๋ ์ด๋์๋ ์กด์ฌํ์ง ์์ผ๋ฉฐ,
.envํ์ผ์ ํด์๊ฐ๋ง ๋ณด๊ดํฉ๋๋ค. - ๋ก๊ทธ์ธ ์ฑ๊ณต ์ HMAC-SHA256 ์๋ช ์ธ์ ํ ํฐ์ด ๋ฐ๊ธ๋๋ฉฐ, ํญ์ ๋ซ์ผ๋ฉด ์๋ ๋ก๊ทธ์์๋ฉ๋๋ค.
- 5ํ ์ค๋ฅ ์ 15๋ถ ์ ๊ธ์ด ๋ธ๋ผ์ฐ์ ๋จ์์ ์ ์ฉ๋ฉ๋๋ค.
๊ด๋ฆฌ์ ํจ๋์์ ์์ ํ ๋ด์ฉ์ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์๋ง ์์ ์ ์ฅ๋ฉ๋๋ค.
์ค์ ์ฌ์ดํธ์ ๋ฐ์ํ๋ ค๋ฉด ์๋ ๋จ๊ณ๋ฅผ ์๋ฃํด์ผ ํฉ๋๋ค.
โ ๊ด๋ฆฌ์ ํจ๋ ์ ์ (์ฌ์ดํธ์ฃผ์/#/admin)
โ
โก ์ํ๋ ํญ์์ ๋ด์ฉ ์์
โ
โข [๋ด๋ณด๋ด๊ธฐ] ํญ ํด๋ฆญ โ "content.json ๋ค์ด๋ก๋" ๋ฒํผ ํด๋ฆญ
โ
โฃ ํธ์คํ
ํ์ผ ๊ด๋ฆฌ์์์ public/content.json ์ ๋ค์ด๋ก๋ํ ํ์ผ๋ก ๊ต์ฒด
โ
โค ์ฌ์ดํธ ์๋ก๊ณ ์นจ์ผ๋ก ๋ฐ์ ํ์ธ
์ฃผ์: ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ฑฐ๋ ์๋ก๊ณ ์นจํ๋ฉด ์์ ์ค์ธ ๋ด์ฉ์ด ์ฌ๋ผ์ง๋๋ค.
๋ฐ๋์ ๋ด๋ณด๋ด๊ธฐ โ ๋ค์ด๋ก๋ โ ํธ์คํ ์ ๋ก๋ ์์๋ก ์๋ฃํ์ธ์.
์ด๋ฏธ์ง๋ ์ฝ๋๊ฐ ์๋ ํ์ผ ์ง์ ์ ๋ก๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
| ํด๋ | ์ฉ๋ |
|---|---|
public/images/logo/ |
๋ก๊ณ ํ์ผ (logo.png, logo-dark.png, logo-light.png) |
public/images/hero/ |
๋ฉ์ธ ํ๋ฉด ์ฌ๋ผ์ด๋ ์ด๋ฏธ์ง |
public/images/company/ |
ํ์ฌ์๊ฐ ํ์ด์ง ์ด๋ฏธ์ง (์ธ์ฌ๋ง, ์ฐํ ๋ฑ) |
public/images/projects/ |
ํ๋ก์ ํธ ์ธ๋ค์ผ ์ด๋ฏธ์ง |
public/images/news/ |
๋ด์ค ์ธ๋ค์ผ ์ด๋ฏธ์ง |
public/images/clients/ |
๊ฑฐ๋์ฒ ๋ก๊ณ ์ด๋ฏธ์ง |
public/images/esg/ |
ESG ํ์ด์ง ์์ยท์ด๋ฏธ์ง |
public/images/job/ |
์ฑ์ฉ ๊ด๋ จ ์ด๋ฏธ์ง (๋ณต๋ฆฌํ์ ์์ด์ฝ, ์ง๋ฌด ์ฌ์ง) |
- ์ด๋ฏธ์ง ํ์ผ์ ์ ํด๋ ์ค ์ ์ ํ ์์น์ ํธ์คํ ํ์ผ ๊ด๋ฆฌ์๋ก ์ ๋ก๋
- ๊ด๋ฆฌ์ ํจ๋ ํด๋น ํญ์์ ์ด๋ฏธ์ง ๊ฒฝ๋ก ์
๋ ฅ
์:/images/projects/์ํ๋ก์ ํธ.jpg - ๋ด๋ณด๋ด๊ธฐ โ ๋ฐฐํฌ
| ์ฉ๋ | ๊ถ์ฅ ํฌ๊ธฐ | ํ์ |
|---|---|---|
| ํ๋ก์ ํธ ์ธ๋ค์ผ | 800 ร 500 px | JPG |
| ๋ด์ค ์ธ๋ค์ผ | 800 ร 500 px | JPG |
| ๊ฑฐ๋์ฒ ๋ก๊ณ | 200 ร 80 px (ํฌ๋ช ๋ฐฐ๊ฒฝ) | PNG |
| ๋ณต๋ฆฌํ์ ์์ด์ฝ | 64 ร 64 px | PNG |
| ๋ฉ์ธ ์ฌ๋ผ์ด๋ | 1920 ร 1080 px | JPG |
์ด ์ฌ์ดํธ๋ ์ ์ ํ์ผ ํธ์คํ
๋ฐฉ์์
๋๋ค.
์๋ฒ ์ฌ์์ ์์ด ํ์ผ ๊ต์ฒด๋ง์ผ๋ก ๋ฐ์๋ฉ๋๋ค.
1. ๊ด๋ฆฌ์ ํจ๋์์ ์์
2. [๋ด๋ณด๋ด๊ธฐ] โ content.json ๋ค์ด๋ก๋
3. ํธ์คํ
ํ์ผ ๊ด๋ฆฌ์ ์ ์
4. public/content.json ํ์ผ์ ๋ค์ด๋ก๋ํ ํ์ผ๋ก ๊ต์ฒด
5. ์๋ฃ โ ๋ณ๋ ๋น๋ ๋ถํ์
# 1. ๋ณ๊ฒฝ์ฌํญ ์์ ํ ๋น๋
npm run build
# 2. dist/ ํด๋ ์ ์ฒด๋ฅผ ํธ์คํ
๋ฃจํธ์ ์
๋ก๋ (๊ธฐ์กด ํ์ผ ๋ฎ์ด์ฐ๊ธฐ)
# 3. ๋น๋ ์ dist/content.json ์ด ์ด๊ธฐํ๋ ์ ์์ผ๋ฏ๋ก
# ๊ด๋ฆฌ์์์ ์์ ํ ์ต์ content.json ์ ๋ณ๋๋ก ๋ฎ์ด์ฐ๊ธฐ ๊ถ์ฅ๋น๋ ๊ฒฐ๊ณผ๋ฌผ:
dist/ํด๋ ์์ ํ์ผ ์ ์ฒด๋ฅผ ํธ์คํ ์ ์ฌ๋ฆฌ๋ฉด ๋ฉ๋๋ค.
๋น๋ฐ๋ฒํธ๋ ์ฝ๋๊ฐ ์๋ .env ํ์ผ์ ํด์(PBKDF2-SHA256)๋ก ์ ์ฅ๋ฉ๋๋ค.
๋ณ๊ฒฝ์ ์ ๊ณต๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๋ ์์๋ฅผ ๋ฐ๋ฅด์ธ์.
โ ์ ๋น๋ฐ๋ฒํธ๋ก ํด์๊ฐ ์์ฑ (Node.js ํ์)
node scripts/gen-admin-hash.mjs ์๋น๋ฐ๋ฒํธ์คํํ๋ฉด ์๋์ฒ๋ผ ์ถ๋ ฅ๋ฉ๋๋ค:
โ
.env ํ์ผ์ ์๋ ๊ฐ์ผ๋ก ๊ต์ฒดํ์ธ์:
VITE_ADMIN_HASH=77b79e937e5d...
VITE_ADMIN_SALT=bdc08c5d40d4...
VITE_ADMIN_SECRET=52e5b1f949...
๋น๋ฐ๋ฒํธ๋ 10์ ์ด์์ด์ด์ผ ํฉ๋๋ค.
โก ํ๋ก์ ํธ ๋ฃจํธ์ .env ํ์ผ์ ์ด๊ณ ์ ์ธ ์ค๋ก ๊ต์ฒด
VITE_ADMIN_HASH=์ถ๋ ฅ๋_HASH_๊ฐ
VITE_ADMIN_SALT=์ถ๋ ฅ๋_SALT_๊ฐ
VITE_ADMIN_SECRET=์ถ๋ ฅ๋_SECRET_๊ฐ
VITE_ADMIN_SECRET์ ์ธ์ ํ ํฐ ์๋ช ์ฉ์ ๋๋ค.
๋น๋ฐ๋ฒํธ๋ง ๋ฐ๊ฟ ๊ฒฝ์ฐ SECRET ์ ์ ์งํด๋ ๋ฉ๋๋ค.
SECRET ์ ๋ฐ๊พธ๋ฉด ๊ธฐ์กด ๋ก๊ทธ์ธ ์ธ์ ์ด ์ฆ์ ๋ฌดํจํ๋ฉ๋๋ค.
โข ๋น๋ ํ ๋ฐฐํฌ
npm run build
# โ dist/ ํด๋๋ฅผ ํธ์คํ
์ ์
๋ก๋
.envํ์ผ ์์ฒด๋ ์ ๋ ์ปค๋ฐํ๊ฑฐ๋ ๊ณต๊ฐ ์ ์ฅ์์ ์ฌ๋ฆฌ์ง ๋ง์ธ์.
.env ํ์ผ์ ์ ๊ทผํ ์ ์๋ค๋ฉด ์ ์ ์ฐจ๋๋ก ์ ๋น๋ฐ๋ฒํธ๋ก ๊ต์ฒดํ๋ฉด ๋ฉ๋๋ค.
.env ํ์ผ๋ ์๋ค๋ฉด ๊ฐ๋ฐ์์๊ฒ ์ฐ๋ฝํ์ฌ ์ฌ๋ฐ๊ธ ๋ฐ์ผ์ธ์.
| URL | ํ์ด์ง๋ช | ๊ด๋ฆฌ ๋ฐฉ๋ฒ |
|---|---|---|
/ |
๋ฉ์ธ(ํ) | ๊ฐ ์น์ ๋ณ ๊ด๋ฆฌ์ ํญ |
/company/greeting |
์ธ์ฌ๋ง | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/philosophy |
๊ฒฝ์์ด๋ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/history |
์ฐํ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/organization |
์กฐ์ง๋ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/clients |
์ฃผ์๊ฑฐ๋์ฒ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/certification |
์ธ์ฆ์ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/company/location |
์ค์๋๊ธธ | ๊ด๋ฆฌ์ โ ํ์ฌ์๊ฐ |
/projects/contracts |
๊ณต์ฌ์์ฃผ ํํฉ | ๊ด๋ฆฌ์ โ ํ๋ก์ ํธ |
/projects/map |
์๊ณต ํํฉ ์ง๋ | ๊ด๋ฆฌ์ โ ํ๋ก์ ํธ (์ขํ ์ ๋ ฅ ํ์) |
/sustainability |
ESG ๊ฒฝ์ | ์ฝ๋ ์์ ํ์ |
/media/news |
๋ด์ค/๊ณต์ง | ๊ด๋ฆฌ์ โ ๋ด์ค/๊ณต์ง |
/media/youtube |
YouTube | ๊ด๋ฆฌ์ โ ์ ํ๋ธ |
/careers/jobs |
์ง๋ฌด์๊ฐ | ๊ด๋ฆฌ์ โ ์ธ์ฌ์ฑ์ฉ |
/careers/hr |
์ธ์ฌ์ ๋ | ์ฝ๋ ์์ ํ์ |
/careers/guide |
์ฑ์ฉ๊ฐ์ด๋ | ๊ด๋ฆฌ์ โ ์ธ์ฌ์ฑ์ฉ |
/careers/benefits |
๋ณต๋ฆฌํ์ | ๊ด๋ฆฌ์ โ ์ธ์ฌ์ฑ์ฉ |
/careers/faq |
์ฑ์ฉFAQ | ๊ด๋ฆฌ์ โ ์ธ์ฌ์ฑ์ฉ |
/#/admin |
๊ด๋ฆฌ์ ํจ๋ | โ |
์ฝ๋ ์์ ํ์ํ์ด์ง๋ ์ฝํ ์ธ ๊ฐ ์ฝ๋์ ๋ด์ฅ๋์ด ์์ด
๊ฐ๋ฐ์๊ฐ ์ง์ ์์ ํ ๋น๋ยท๋ฐฐํฌํด์ผ ํฉ๋๋ค.
tailcntweb/
โ
โโโ .env โ
๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ ํด์ ์ ์ฅ (์ ๋ ์ปค๋ฐ ๊ธ์ง)
โโโ public/
โ โโโ content.json โ
ํต์ฌ ์ฝํ
์ธ ํ์ผ โ ๊ด๋ฆฌ์ ํจ๋๋ก ์์ฑยท๊ต์ฒด
โ โโโ favicon.png
โ โโโ images/ # ๋ชจ๋ ์ด๋ฏธ์ง ํ์ผ
โ โโโ logo/
โ โโโ hero/
โ โโโ company/
โ โโโ projects/
โ โโโ news/
โ โโโ clients/
โ โโโ esg/
โ โโโ job/
โ
โโโ scripts/
โ โโโ gen-admin-hash.mjs โ
๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ ํด์ ์์ฑ ์คํฌ๋ฆฝํธ
โ
โโโ src/
โ โโโ main.jsx # ์ฑ ์ง์
์
โ โโโ App.jsx # ๋ผ์ฐํ
, ๋ฉ์ธ ํ์ด์ง ์ค๋
์คํฌ๋กค
โ โโโ index.css # ์ ์ญ ์คํ์ผ
โ โ
โ โโโ config/
โ โ โโโ routes.js # ๋ชจ๋ URL ๊ฒฝ๋ก ์์
โ โ โโโ navTabs.js # ์๋ธํ์ด์ง ํญ ๋ค๋น๊ฒ์ด์
๋ฐ์ดํฐ
โ โ
โ โโโ contexts/
โ โ โโโ ContentContext.jsx โ
content.json ๋ก๋ยท์ ์ญ ์ ๊ณต (useContent)
โ โ โโโ LanguageContext.jsx # ํ๊ตญ์ด/์์ด ์ ํ ์ํ (useLanguage)
โ โ
โ โโโ i18n/
โ โ โโโ translations.js # ํค๋ยท๊ณตํต UI ๋ฒ์ญ ๋ฌธ์์ด
โ โ
โ โโโ components/ # ๋ฉ์ธ ํ์ด์ง ์น์
์ปดํฌ๋ํธ
โ โ โโโ Header.jsx
โ โ โโโ Hero.jsx
โ โ โโโ Projects.jsx
โ โ โโโ Clients.jsx
โ โ โโโ ESG.jsx
โ โ โโโ Newsroom.jsx
โ โ โโโ Footer.jsx
โ โ โโโ SubPageLayout.jsx # ์๋ธํ์ด์ง ๊ณตํต ๋ ์ด์์
โ โ
โ โโโ pages/
โ โโโ admin/
โ โ โโโ AdminPage.jsx โ
๊ด๋ฆฌ์ ํจ๋ (๋ก๊ทธ์ธยท์ฌ์ด๋๋ฐยทํญ ๋ผ์ฐํ
)
โ โ โโโ tabs/
โ โ โโโ shared.jsx # ๊ณตํต UI (Field, Toggle, ItemShell...)
โ โ โโโ ProjectsTab.jsx
โ โ โโโ NewsTab.jsx
โ โ โโโ ClientsTab.jsx
โ โ โโโ CompanyTab.jsx
โ โ โโโ YouTubeTab.jsx
โ โ โโโ CareersTab.jsx
โ โ โโโ FooterTab.jsx
โ โ โโโ SnippetsTab.jsx
โ โ โโโ ExportTab.jsx
โ โ
โ โโโ company/
โ โโโ projects/
โ โโโ sustainability/
โ โโโ media/
โ โโโ careers/
โ
โโโ package.json
โโโ vite.config.js # Vite ์ค์ (@/ ๋ณ์นญ, base './')
โโโ index.html
{
"_version": 2,
"projects": [...],
"news": [...],
"clients": [...],
"youtube": { "title": "", "videos": [...] },
"footer": { "address_ko": "", "tel": "", "fax": "", "email": "", "ceo_ko": "" },
"greeting": { "ceo_names": "", "img": "" },
"philosophy": { ... },
"history": { "items": [...] },
"organization": { "img": "" },
"certification": { "items": [...] },
"location": { "address_ko": "", "address_en": "", "lat": 0, "lng": 0 },
"careers": {
"benefits": [...],
"faq_ko": [...],
"faq_en": [...],
"guide_ko": [...],
"guide_en": [...],
"job_roles": [...]
},
"snippets": [...]
}import { useContent } from '@/contexts/ContentContext'
export default function SomePage() {
const content = useContent()
// content๊ฐ null์ด๋ฉด ์์ง ๋ก๋ฉ ์ค
const items = content?.someKey ?? []
}CMS ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ์ปดํฌ๋ํธ ๋ด ํ๋์ฝ๋ฉ ๊ธฐ๋ณธ๊ฐ์ผ๋ก fallbackํ๋ ํจํด์ ๋ฐ๋ฆ ๋๋ค.
| ๋ถ๋ฅ | ์ฌ์ฉ ๊ธฐ์ |
|---|---|
| ํ๋ ์์ํฌ | React 18 + Vite 5 |
| ๋ผ์ฐํฐ | React Router v6 (HashRouter) |
| ์คํ์ผ | Tailwind CSS |
| ์ ๋๋ฉ์ด์ | Framer Motion |
| ์์ด์ฝ | Lucide React |
| ์ง๋ | react-kakao-maps-sdk (์นด์นด์ค๋งต) |
| ์ฝํ ์ธ ๊ด๋ฆฌ | public/content.json (DBยทCMS ์๋ ์ ์ ํ์ผ ๋ฐฉ์) |
| ๊ด๋ฆฌ์ ๋ณด์ | PBKDF2-SHA256 (10๋ง ํ) + HMAC-SHA256 ์ธ์ ํ ํฐ |
| ๋น๋ | Vite โ dist/ ํด๋ ์ถ๋ ฅ |
HashRouter ์ฌ์ฉ ์ด์ : ์ ์ ํธ์คํ ํ๊ฒฝ์์ ์๋ฒ ๋ผ์ฐํ ์ค์ ์์ด ํด๋ผ์ด์ธํธ ๋ผ์ฐํ ์ด ๊ฐ๋ฅํ๋๋ก
/#/๊ฒฝ๋กํํ์ URL์ ์ฌ์ฉํฉ๋๋ค.
Q. ๊ด๋ฆฌ์ ํจ๋์์ ์์ ํ๋๋ฐ ์ฌ์ดํธ์ ๋ฐ์์ด ์ ๋ฉ๋๋ค.
A. ๋ด๋ณด๋ด๊ธฐ ํญ์์ content.json์ ๋ค์ด๋ก๋ํ ๋ค ํธ์คํ
์ ์
๋ก๋ํด์ผ ๋ฐ์๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ฑฐ๋ ์๋ก๊ณ ์นจํ๋ฉด ์์ ์ค์ธ ๋ด์ฉ์ด ์ด๊ธฐํ๋ฉ๋๋ค.
Q. ์ด๋ฏธ์ง๊ฐ ๊นจ์ ธ์ ๋์ต๋๋ค.
A. ๊ด๋ฆฌ์์์ ์
๋ ฅํ ๊ฒฝ๋ก๊ฐ ์ค์ ํ์ผ ์์น์ ์ผ์นํ๋์ง ํ์ธํ์ธ์.
๊ฒฝ๋ก๋ /images/ํด๋๋ช
/ํ์ผ๋ช
.jpg ํ์์ด์ด์ผ ํฉ๋๋ค.
Q. ํ๊ตญ์ด๋ก ์์ ํ๋๋ฐ ์๋ฌธ ํ์ด์ง๊ฐ ๊ทธ๋๋ก์
๋๋ค.
A. ํ๊ตญ์ด/์์ด๊ฐ ๋ณ๋ ํ๋(_ko / _en)๋ก ๊ด๋ฆฌ๋ฉ๋๋ค. ์๋ฌธ ํ๋๋ ํจ๊ป ์์ ํด์ฃผ์ธ์.
Q. ๋น๋ฐ๋ฒํธ๋ฅผ ์์ด๋ฒ๋ ธ์ต๋๋ค.
A. .env ํ์ผ์ ์ ๊ทผํ ์ ์๋ค๋ฉด 7๋ฒ ํญ๋ชฉ ์ ์ฐจ๋๋ก ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ์ฌ ๊ต์ฒดํ์ธ์.
Q. ๋น๋ฐ๋ฒํธ๋ฅผ 5๋ฒ ํ๋ ธ๋๋ ์ ๊ฒผ์ต๋๋ค.
A. 15๋ถ ํ ์๋์ผ๋ก ํด์ ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ง์ ์ด๊ธฐํํด๋ ๋ฉ๋๋ค.
Q. ESG ํ์ด์ง๋ ์ธ์ฌ์ ๋ ํ์ด์ง ๋ด์ฉ์ ๋ฐ๊พธ๊ณ ์ถ์ต๋๋ค.
A. ํด๋น ํ์ด์ง๋ ์ฝํ
์ธ ๊ฐ ์ฝ๋์ ์ง์ ์์ฑ๋์ด ์์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ src/pages/sustainability/ESGPage.jsx ๋๋ src/pages/careers/HRPage.jsx๋ฅผ ์์ ํ ๋น๋ยท๋ฐฐํฌํด์ผ ํฉ๋๋ค.
Q. ์ ํ๋ธ ์์ ID๋ ์ด๋ป๊ฒ ์ฐพ๋์?
A. YouTube ์์ URL https://www.youtube.com/watch?v=XXXXXX์์ v= ๋ค์ XXXXXX ๋ถ๋ถ์ด ์์ ID์
๋๋ค.
Q. ์ฌ์ดํธ URL์ #์ด ๋ถ๋ ์ด์ ๋?
A. ๋ณ๋ ์๋ฒ ์์ด ์ ์ ํ์ผ ํธ์คํ
์์ ์๋ํ๋๋ก HashRouter๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ธฐ๋ฅ ๋์์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Q. ์ ํ๋ก์ ํธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ง๋ ํ์ด์ง์๋ ์๋์ผ๋ก ํ์๋๋์?
A. ์ง๋ ํ์ด์ง(/projects/map)๋ ์๋ยท๊ฒฝ๋ ์ขํ๋ฅผ ๋ณ๋๋ก ์
๋ ฅํด์ผ ํ์๋ฉ๋๋ค.
๊ด๋ฆฌ์ ํจ๋ โ ํ๋ก์ ํธ ํญ์์ ํด๋น ํญ๋ชฉ์ ์ขํ๊ฐ์ ํจ๊ป ์
๋ ฅํ์ธ์.
Q. ์ฝ๋ ๋น๋ ํ content.json์ด ์ด๊ธฐํ๋ฉ๋๋ค.
A. npm run build ์คํ ์ public/content.json์ด dist/๋ก ๋ณต์ฌ๋ฉ๋๋ค.
๋น๋ ์ ๊ด๋ฆฌ์์์ ๋ด๋ณด๋ธ ์ต์ content.json์ public/์ ๋จผ์ ๋ฎ์ด์ฐ๊ฑฐ๋,
๋น๋ ํ dist/content.json์ ๋ณ๋ ์ต์ ํ์ผ๋ก ๊ต์ฒดํ์ธ์.
์ถ๊ฐ ๋ฌธ์๋ ๊ฐ๋ฐ ๋ด๋น์์๊ฒ ์ฐ๋ฝํ์ธ์.