Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

145 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํƒœ์ผ์”จ์•คํ‹ฐ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

์ด ๋ฌธ์„œ๋Š” ์‚ฌ์ดํŠธ ๋‹ด๋‹น์ž์™€ ๊ฐœ๋ฐœ์ž ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ์ธ์ˆ˜์ธ๊ณ„ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.
๋น„๊ฐœ๋ฐœ์ž๋„ ์ฝ˜ํ…์ธ  ์ˆ˜์ •ยท๋ฐฐํฌ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๋ชฉ์ฐจ

  1. ์‚ฌ์ดํŠธ ๊ฐœ์š”
  2. ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
  3. ๊ด€๋ฆฌ์ž ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•
  4. ์ฝ˜ํ…์ธ  ๋ฐ˜์˜ ํ๋ฆ„ (๋‚ด๋ณด๋‚ด๊ธฐ)
  5. ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ด€๋ฆฌ
  6. ๋ฐฐํฌ ์ ˆ์ฐจ
  7. ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  8. ์‚ฌ์ดํŠธ ๊ตฌ์กฐ โ€” ํŽ˜์ด์ง€ ๋ชฉ๋ก
  9. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
  10. ๊ธฐ์ˆ  ์Šคํƒ
  11. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ (FAQ)

1. ์‚ฌ์ดํŠธ ๊ฐœ์š”

ํ•ญ๋ชฉ ๋‚ด์šฉ
์‚ฌ์ดํŠธ๋ช… ํƒœ์ผ์”จ์•คํ‹ฐ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€
์–ธ์–ด ์ง€์› ํ•œ๊ตญ์–ด / ์˜์–ด (์šฐ์ธก ์ƒ๋‹จ ํ† ๊ธ€)
๊ด€๋ฆฌ์ž ํŒจ๋„ ์‚ฌ์ดํŠธ์ฃผ์†Œ/#/admin
์ฝ˜ํ…์ธ  ์ €์žฅ ๋ฐฉ์‹ public/content.json ํŒŒ์ผ 1๊ฐœ๋กœ ์ „์ฒด ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ
ํ˜ธ์ŠคํŒ… ์œ ํ˜• ์ •์  ํŒŒ์ผ ํ˜ธ์ŠคํŒ… (๋ณ„๋„ ์„œ๋ฒ„ยทDB ๋ถˆํ•„์š”)

2. ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

์š”๊ตฌ ์‚ฌํ•ญ

  • 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 preview

๋กœ์ปฌ์—์„œ ๊ด€๋ฆฌ์ž ํŒจ๋„ ์ ‘์†

http://localhost:5173/#/admin

๊ฒฝ๋กœ ๋ณ„์นญ

@/ โ†’ src/ ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
์˜ˆ: import SubPageLayout from '@/components/SubPageLayout'


3. ๊ด€๋ฆฌ์ž ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•

์‚ฌ์ดํŠธ์˜ ํ…์ŠคํŠธยท์ด๋ฏธ์ง€ยทํ•ญ๋ชฉ์€ ๊ด€๋ฆฌ์ž ํŒจ๋„์—์„œ ๋ชจ๋‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฅผ ๋ชฐ๋ผ๋„ ๋ฉ๋‹ˆ๋‹ค.

์ ‘์† ๋ฐฉ๋ฒ•

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์ดํŠธ์ฃผ์†Œ/#/admin ์ž…๋ ฅ
  2. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ํ›„ ๋กœ๊ทธ์ธ
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•์€ 7๋ฒˆ ํ•ญ๋ชฉ ์ฐธ๊ณ 
    • 5ํšŒ ์—ฐ์† ์˜ค๋ฅ˜ ์ž…๋ ฅ ์‹œ 15๋ถ„ ์ž๋™ ์ž ๊ธˆ

ํƒญ๋ณ„ ๊ด€๋ฆฌ ํ•ญ๋ชฉ

ํƒญ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ
ํ”„๋กœ์ ํŠธ ๊ณต์‚ฌ์ˆ˜์ฃผ ํ˜„ํ™ฉ ๋ชฉ๋ก โ€” ํ”„๋กœ์ ํŠธ๋ช…(ํ•œ/์˜), ๋ฐœ์ฃผ์ฒ˜(ํ•œ/์˜), ์—ฐ๋„, ์ด๋ฏธ์ง€, ๋ฉ”์ธ ๋…ธ์ถœ ์—ฌ๋ถ€
๋‰ด์Šค/๊ณต์ง€ ๋‰ด์Šค ๋ฐ ๊ณต์ง€์‚ฌํ•ญ โ€” ์ œ๋ชฉ, ๋‚ ์งœ, ํƒœ๊ทธ, ์ด๋ฏธ์ง€, ๋…ธ์ถœ ์—ฌ๋ถ€
๊ฑฐ๋ž˜์ฒ˜ ๋ฉ”์ธ ํ™”๋ฉด ๊ฑฐ๋ž˜์ฒ˜ ๋กœ๊ณ  ์Šฌ๋ผ์ด๋“œ โ€” ๋กœ๊ณ  ์ด๋ฏธ์ง€, ์ด๋ฆ„, ๋…ธ์ถœ ์ˆœ์„œ
ํšŒ์‚ฌ์†Œ๊ฐœ ์ธ์‚ฌ๋ง, ๊ฒฝ์˜์ด๋…, ์—ฐํ˜, ์กฐ์ง๋„, ์—…ยท๋ฉดํ—ˆยท์ธ์ฆ, ์˜ค์‹œ๋Š”๊ธธ
์œ ํŠœ๋ธŒ YouTube ์ฑ„๋„ ID ๋ฐ ์˜์ƒ ๋ชฉ๋ก
์ธ์žฌ์ฑ„์šฉ ๋ณต๋ฆฌํ›„์ƒ ์นด๋“œ, ์ฑ„์šฉFAQ, ์ฑ„์šฉ๊ฐ€์ด๋“œ, ์ง๋ฌด์†Œ๊ฐœ (ํ•œ/์˜)
ํ‘ธํ„ฐ ์ •๋ณด ์ฃผ์†Œ(ํ•œ/์˜), ๋Œ€ํ‘œ๋ฒˆํ˜ธ, FAX, ์ด๋ฉ”์ผ, ๋Œ€ํ‘œ์ž๋ช…
HTML/JS ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž… โ€” ํ†ต๊ณ„ ์ฝ”๋“œ, ์ฑ„ํŒ… ์œ„์ ฏ ๋“ฑ
๋‚ด๋ณด๋‚ด๊ธฐ ํŽธ์ง‘ํ•œ ์ „์ฒด ๋‚ด์šฉ์„ content.json์œผ๋กœ ๋‹ค์šด๋กœ๋“œ

๋ณด์•ˆ ๊ตฌ์กฐ

  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ‰๋ฌธ์ด ์•„๋‹Œ PBKDF2-SHA256 (10๋งŒ ํšŒ ๋ฐ˜๋ณต ํ•ด์‹œ) ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์›๋ฌธ์€ ์ฝ”๋“œ ์–ด๋””์—๋„ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, .env ํŒŒ์ผ์— ํ•ด์‹œ๊ฐ’๋งŒ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ HMAC-SHA256 ์„œ๋ช… ์„ธ์…˜ ํ† ํฐ์ด ๋ฐœ๊ธ‰๋˜๋ฉฐ, ํƒญ์„ ๋‹ซ์œผ๋ฉด ์ž๋™ ๋กœ๊ทธ์•„์›ƒ๋ฉ๋‹ˆ๋‹ค.
  • 5ํšŒ ์˜ค๋ฅ˜ ์‹œ 15๋ถ„ ์ž ๊ธˆ์ด ๋ธŒ๋ผ์šฐ์ € ๋‹จ์—์„œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

4. ์ฝ˜ํ…์ธ  ๋ฐ˜์˜ ํ๋ฆ„ (๋‚ด๋ณด๋‚ด๊ธฐ)

๊ด€๋ฆฌ์ž ํŒจ๋„์—์„œ ์ˆ˜์ •ํ•œ ๋‚ด์šฉ์€ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ž„์‹œ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
์‹ค์ œ ์‚ฌ์ดํŠธ์— ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  ๊ด€๋ฆฌ์ž ํŒจ๋„ ์ ‘์† (์‚ฌ์ดํŠธ์ฃผ์†Œ/#/admin)
    โ†“
โ‘ก ์›ํ•˜๋Š” ํƒญ์—์„œ ๋‚ด์šฉ ์ˆ˜์ •
    โ†“
โ‘ข [๋‚ด๋ณด๋‚ด๊ธฐ] ํƒญ ํด๋ฆญ โ†’ "content.json ๋‹ค์šด๋กœ๋“œ" ๋ฒ„ํŠผ ํด๋ฆญ
    โ†“
โ‘ฃ ํ˜ธ์ŠคํŒ… ํŒŒ์ผ ๊ด€๋ฆฌ์ž์—์„œ public/content.json ์„ ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ๋กœ ๊ต์ฒด
    โ†“
โ‘ค ์‚ฌ์ดํŠธ ์ƒˆ๋กœ๊ณ ์นจ์œผ๋กœ ๋ฐ˜์˜ ํ™•์ธ

์ฃผ์˜: ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ˆ˜์ • ์ค‘์ธ ๋‚ด์šฉ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
๋ฐ˜๋“œ์‹œ ๋‚ด๋ณด๋‚ด๊ธฐ โ†’ ๋‹ค์šด๋กœ๋“œ โ†’ ํ˜ธ์ŠคํŒ… ์—…๋กœ๋“œ ์ˆœ์„œ๋กœ ์™„๋ฃŒํ•˜์„ธ์š”.


5. ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ด€๋ฆฌ

์ด๋ฏธ์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ ์ง์ ‘ ์—…๋กœ๋“œ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ €์žฅ ์œ„์น˜

ํด๋” ์šฉ๋„
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/ ์ฑ„์šฉ ๊ด€๋ จ ์ด๋ฏธ์ง€ (๋ณต๋ฆฌํ›„์ƒ ์•„์ด์ฝ˜, ์ง๋ฌด ์‚ฌ์ง„)

์ด๋ฏธ์ง€ ์ถ”๊ฐ€ ์ˆœ์„œ

  1. ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์œ„ ํด๋” ์ค‘ ์ ์ ˆํ•œ ์œ„์น˜์— ํ˜ธ์ŠคํŒ… ํŒŒ์ผ ๊ด€๋ฆฌ์ž๋กœ ์—…๋กœ๋“œ
  2. ๊ด€๋ฆฌ์ž ํŒจ๋„ ํ•ด๋‹น ํƒญ์—์„œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ์ž…๋ ฅ
    ์˜ˆ: /images/projects/์ƒˆํ”„๋กœ์ ํŠธ.jpg
  3. ๋‚ด๋ณด๋‚ด๊ธฐ โ†’ ๋ฐฐํฌ

์ด๋ฏธ์ง€ ๊ถŒ์žฅ ๊ทœ๊ฒฉ

์šฉ๋„ ๊ถŒ์žฅ ํฌ๊ธฐ ํ˜•์‹
ํ”„๋กœ์ ํŠธ ์ธ๋„ค์ผ 800 ร— 500 px JPG
๋‰ด์Šค ์ธ๋„ค์ผ 800 ร— 500 px JPG
๊ฑฐ๋ž˜์ฒ˜ ๋กœ๊ณ  200 ร— 80 px (ํˆฌ๋ช… ๋ฐฐ๊ฒฝ) PNG
๋ณต๋ฆฌํ›„์ƒ ์•„์ด์ฝ˜ 64 ร— 64 px PNG
๋ฉ”์ธ ์Šฌ๋ผ์ด๋“œ 1920 ร— 1080 px JPG

6. ๋ฐฐํฌ ์ ˆ์ฐจ

์ด ์‚ฌ์ดํŠธ๋Š” ์ •์  ํŒŒ์ผ ํ˜ธ์ŠคํŒ… ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์—†์ด ํŒŒ์ผ ๊ต์ฒด๋งŒ์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ ๋งŒ ๋ณ€๊ฒฝํ•  ๋•Œ (์ฝ”๋“œ ์ˆ˜์ • ์—†์Œ)

1. ๊ด€๋ฆฌ์ž ํŒจ๋„์—์„œ ์ˆ˜์ •
2. [๋‚ด๋ณด๋‚ด๊ธฐ] โ†’ content.json ๋‹ค์šด๋กœ๋“œ
3. ํ˜ธ์ŠคํŒ… ํŒŒ์ผ ๊ด€๋ฆฌ์ž ์ ‘์†
4. public/content.json ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ๋กœ ๊ต์ฒด
5. ์™„๋ฃŒ โ€” ๋ณ„๋„ ๋นŒ๋“œ ๋ถˆํ•„์š”

์ฝ”๋“œยท๋””์ž์ธ ๋ณ€๊ฒฝ ํ›„ ๋ฐฐํฌ (๊ฐœ๋ฐœ์ž ํ•„์š”)

# 1. ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ˆ˜์ • ํ›„ ๋นŒ๋“œ
npm run build

# 2. dist/ ํด๋” ์ „์ฒด๋ฅผ ํ˜ธ์ŠคํŒ… ๋ฃจํŠธ์— ์—…๋กœ๋“œ (๊ธฐ์กด ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ)

# 3. ๋นŒ๋“œ ์‹œ dist/content.json ์ด ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
#    ๊ด€๋ฆฌ์ž์—์„œ ์ˆ˜์ •ํ•œ ์ตœ์‹  content.json ์„ ๋ณ„๋„๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๊ถŒ์žฅ

๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ: dist/ ํด๋” ์•ˆ์˜ ํŒŒ์ผ ์ „์ฒด๋ฅผ ํ˜ธ์ŠคํŒ…์— ์˜ฌ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


7. ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ .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 ํŒŒ์ผ๋„ ์—†๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์œผ์„ธ์š”.


8. ์‚ฌ์ดํŠธ ๊ตฌ์กฐ โ€” ํŽ˜์ด์ง€ ๋ชฉ๋ก

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 ๊ด€๋ฆฌ์ž ํŒจ๋„ โ€”

์ฝ”๋“œ ์ˆ˜์ • ํ•„์š” ํŽ˜์ด์ง€๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ฝ”๋“œ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด
๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜์ • ํ›„ ๋นŒ๋“œยท๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


9. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

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

content.json ์ตœ์ƒ์œ„ ๊ตฌ์กฐ

{
  "_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ํ•˜๋Š” ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.


10. ๊ธฐ์ˆ  ์Šคํƒ

๋ถ„๋ฅ˜ ์‚ฌ์šฉ ๊ธฐ์ˆ 
ํ”„๋ ˆ์ž„์›Œํฌ 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์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


11. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ (FAQ)

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์„ ๋ณ„๋„ ์ตœ์‹  ํŒŒ์ผ๋กœ ๊ต์ฒดํ•˜์„ธ์š”.


์ถ”๊ฐ€ ๋ฌธ์˜๋Š” ๊ฐœ๋ฐœ ๋‹ด๋‹น์ž์—๊ฒŒ ์—ฐ๋ฝํ•˜์„ธ์š”.

About

No description, website, or topics provided.

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages