Skip to content

sirini/tsboard

Repository files navigation

TSBOARD

  1. TSBOARD๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?
  2. ์™œ ๋งŒ๋“ค์—ˆ๋‚˜์š”?
  3. TSBOARD๋งŒ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

TSBOARD๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

TSBOARD๋Š” Type Safety BOARD๋กœ, TypeScript ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.

์™œ ๋งŒ๋“ค์—ˆ๋‚˜์š”?

  • ์ €๋Š” ์›น ํ”„๋กœ๊ทธ๋žจ์„ PHP๋กœ ์‹œ์ž‘ํ–ˆ๊ณ , ์ œ๋กœ๋ณด๋“œ์™€ ๊ทธ๋ˆ„๋ณด๋“œ ์‹œ์ ˆ์„ ๊ฒช์€ (์ด์ œ๋Š” ์•„์žฌ) ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.
  • 10๋…„ ๋„˜๊ฒŒ ์›น ๊ฐœ๋ฐœ์„ ์•ˆํ•˜๋‹ค๊ฐ€, ์šฐ์—ฐํžˆ TypeScript ์–ธ์–ด๋ฅผ ๋งŒ๋‚˜ ์ฝ”๋”ฉ์˜ ์ฆ๊ฑฐ์›€์„ ๋งŒ๋ฝํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ด์™•์ด๋ฉด ์ด ์–ธ์–ด๋กœ ์žฌ๋ฐŒ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

TSBOARD๋งŒ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • TSBOARD๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘ TypeScript ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vue ์™€ Vuetify ๋กœ ์ œ์ž‘๋˜์–ด ์žˆ์–ด ์œ ๋ คํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ UI ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • JS/TS ๋Ÿฐํƒ€์ž„์œผ๋กœ Bun, ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Bun ๊ธฐ๋ฐ˜์˜ ElysiaJS๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ณด๋‹ค ๋น ๋ฅธ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

TSBOARD๋Š” ์‚ฌ์šฉ์ž๋ถ„๋“ค์„ ์œ„ํ•œ ์ž์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ https://tsboard.dev/ ์‚ฌ์ดํŠธ์—์„œ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ ๊ถ๊ธˆํ•œ ์ , ์–ด๋ ค์šด ์ ๋“ค์€ ์œ„ ์‚ฌ์ดํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ๋ฌธ์˜ํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


TSBOARD ์„ค์น˜

  1. TSBOARD ์„ค์น˜์— ์ ํ•ฉํ•œ ์„œ๋ฒ„ ํ™˜๊ฒฝ
  2. ๋ฏธ๋ฆฌ ์•Œ์•„๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค
  3. ์„ค์น˜ ์ง„ํ–‰ ์•ˆ๋‚ด
  4. ์„ค์น˜ ํ›„ ์„œ๋ฒ„ ์„ค์ •
  5. ์„ค์น˜๊ฐ€ ์–ด๋ ค์šด ๋ถ„๋“ค๊ป˜

TSBOARD ์„ค์น˜์— ์ ํ•ฉํ•œ ์„œ๋ฒ„ ํ™˜๊ฒฝ

  • TSBOARD๋Š” JS/TS ๋Ÿฐํƒ€์ž„์œผ๋กœ Bun (https://bun.sh)์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ๋ณด๋‹ค ์•ˆ์ •์ ์ธ ํŒจํ‚ค์ง• ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Node.js (๋ฐ npm) ์„ค์น˜๋„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์›๋ž˜ Bun์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๊นŒ์ง€ ์˜ฌ์ธ์›์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ, ํ–ฅํ›„ Bun๋งŒ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • Cafe24๋“ฑ ์›นํ˜ธ์ŠคํŒ… ์—…์ฒด์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์‹ค ์˜ˆ์ •์ด๋ผ๋ฉด, ์•„๋ž˜ ์‚ฌํ•ญ๋“ค์„ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”.
    • PHP ๊ฒŒ์‹œํŒ์ด๋‚˜ ์›Œ๋“œํ”„๋ ˆ์Šค ์„ค์น˜ ๋“ฑ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ ‘ํ•˜๋Š” ์›นํ˜ธ์ŠคํŒ…์—์„  ํ™œ์šฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
    • ์›นํ˜ธ์ŠคํŒ…์ด ์•„๋‹Œ, ์„œ๋ฒ„ ํ˜ธ์ŠคํŒ…์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ, ๊ฐ€์ƒ CPU๋กœ ์šด์˜๋˜๋Š” (๋ณดํ†ต ์ €๋ ดํ•œ) ๊ฐ€์ƒ ์„œ๋ฒ„ ์„œ๋น„์Šค์—์„œ๋Š” ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AWS, Azure, GCP์—์„œ๋Š” Bun ์‚ฌ์šฉ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉํ•˜์‹œ๋Š” ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ ์„ค์น˜๊ฐ€ ์•ˆ๋˜์‹œ๋Š” ๋ถ„๋“ค์€ https://tsboard.dev ์‚ฌ์ดํŠธ๋กœ ์ œ๋ณด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ฏธ๋ฆฌ ์•Œ์•„๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค

  • MySQL(Mariadb) ๊ณ„์ •์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD๋Š” ์„ค์น˜ ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (๊ธฐ๋ณธ tsboard)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ MySQL(Mariadb) ์ ‘์† ๊ณ„์ •์— ํ•ด๋‹น ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ์„ค์น˜๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
    • ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด ์—ญ์‹œ ์„ค์น˜๊ฐ€ ์–ด๋ ค์šด ๋ถ„๋“ค๊ป˜ ํ•ญ๋ชฉ์„ ์ฝ์–ด์ฃผ์„ธ์š”.

์„ค์น˜ ์ง„ํ–‰ ์•ˆ๋‚ด

Bun ์„ค์น˜

  • Bun์€ https://bun.sh/ ์‚ฌ์ดํŠธ์—์„œ Bun์€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•˜๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋จผ์ €, curl -fsSL https://bun.sh/install | bash ๋ช…๋ น์–ด๋กœ Bun์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์„ค์น˜ ์‹œ ํŒจํ‚ค์ง€ ์˜์กด์„ฑ ๊ด€๋ จ ๋ฉ”์‹œ์ง€๋“ค์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (curl, unzip ๋“ฑ) ๋จผ์ € ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.
    • ์„ค์น˜ ํ›„ source .bashrc ๋“ฑ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์‹คํ–‰ํ•ด Bun ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋ก ํ›„, bun --help ๋ฅผ ์‹คํ–‰ํ•ด ๋ด…๋‹ˆ๋‹ค.

Bun์€ ๋ฏฟ๊ธฐ์ง€ ์•Š์„ ์ •๋„๋กœ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค๋งŒ, ๊ทธ ๋Œ€์‹  ๊ฐ€์ƒ CPU์ƒ์—์„œ์˜ ๋™์ž‘์€ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TSBOARD๋Š” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ์œผ๋ฉฐ, Bun์ด ์„ค์น˜๋˜์ง€ ์•Š์€ ์„œ๋ฒ„์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์  ๋‹ค์‹œ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

TSBOARD ์„ค์น˜

  • TSBOARD๋Š” ๋ณ„๋„์˜ ์„ค์น˜ ํŒŒ์ผ๋“ค์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, Git์„ ํ†ตํ•ด ์„ค์น˜ ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋จผ์ €, git clone https://github.com/sirini/tsboard tsboard.git ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅํ•˜๋Š” ์„ค์น˜ ๊ฒฝ๋กœ๋Š” /var/www/ ํ•˜์œ„ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. /root/ ๋Š” ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜ ์‹œ /var/www/tsboard.git/ ํด๋” ์•ˆ์— setup.ts ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • TSBOARD๊ฐ€ ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๋“ค์„ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜ํ•˜์…จ๋‹ค๋ฉด, /var/www/tsboard.git/ ํด๋” ์œ„์น˜์—์„œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ํŒจํ‚ค์ง€๋“ค์€ (Node.js ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ) npm i ํ˜น์€ npm install ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • Bun ๋งŒ ์„ค์น˜ํ•˜์‹  ๊ฒฝ์šฐ, bun install ๋กœ ๋™์ผํ•˜๊ฒŒ ์„ค์น˜ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • bun setup.ts ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™”๋ฉด์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ TSBOARD ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋•Œ MySQL(Mariadb)์˜ ์ ‘์† ์ •๋ณด ๋ฐ ๊ด€๋ฆฌ์ž ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ์ ‘์† ์ •๋ณด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ณ  DB ์ƒ์„ฑ (๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ) ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด, ๋ฌธ์ œ์—†์ด DB/Table๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • bun setup.ts ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์‹  ๊ฒฝ์šฐ, ๊นƒํ—ˆ๋ธŒ ์ด์Šˆ ํ˜น์€ https://tsboard.dev ๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!
  • TSBOARD ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. tsboard.config.ts ํŒŒ์ผ์„ vi ๊ฐ™์€ ์—๋””ํ„ฐ๋กœ ์—ด์–ด์ฃผ์„ธ์š”.
    • tsboard.config.ts ์—๋Š” TSBOARD ์šด์˜์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์„ค์ •๋“ค์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • SITE, QUICK_BUTTONS ๊ทธ๋ฆฌ๊ณ  API ํ•ญ๋ชฉ ๋“ฑ์„ ํ™•์ธํ•˜์‹œ๊ณ , ๊ทธ ๋ฐ–์— ๋‹ค๋ฅธ ํ•ญ๋ชฉ๋“ค๋„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์„ธ์š”.
  • index.html ํŒŒ์ผ๋„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด์„œ <title> ํƒœ๊ทธ์— ๋ณธ์ธ์˜ ์‚ฌ์ดํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”.
  • ๊ฒ€์ƒ‰ ์—”์ง„๋“ค์˜ ์ƒ‰์ธ ์ž‘์—…์„ ๋•๊ธฐ ์œ„ํ•ด public/robots.txt ํŒŒ์ผ์„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด ์‚ฌ์ดํŠธ ์ฃผ์†Œ๋ฅผ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.
    • robots.txt ํŒŒ์ผ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ TSBOARD ๊ณตํ™ˆ ์ฃผ์†Œ๊ฐ€ ์ ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”!
Sitemap: https://tsboard.dev/tsapi/seo/sitemap.xml
  • src/pages/home/HomePage.vue ํŒŒ์ผ์„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด ๋ณธ์ธ ์‚ฌ์ดํŠธ์— ๋งž๊ฒŒ ๋ฏธ๋ฆฌ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ดํŠธ์—๋Š” WhatIsTsboard.vue ๋‚ด์šฉ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ, ์•„๋ž˜ ๋‚ด์šฉ์€ ์ œ๊ฑฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
<v-col :cols="home.cols" v-if="home.isMobile === false">
  <what-is-tsboard></what-is-tsboard>
</v-col>
  • ์ด์ œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. TSBOARD๋ฅผ build ํ•ฉ๋‹ˆ๋‹ค!
    • ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ›์œผ์‹  TSBOARD๋Š” ์ด์ œ vite ๋ฅผ ํ†ตํ•ด build ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • (Node.js ์„ค์น˜ ์‹œ) npm run build ํ˜น์€ bun run build ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ build ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋•Œ TSBOARD์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋“ค(TypeScript)์ด JavaScript๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, ํŒŒ์ผ๋“ค๋„ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์ผ ๋ฐœ์†ก ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

  • TSBOARD๋Š” ๊ตฌ๊ธ€ ๊ณ„์ •์˜ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ GMAIL ๋ฐœ์†ก์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”์ผ ๋ฐœ์†ก์„ ํ†ตํ•ด ์ตœ์ดˆ ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ดˆ๊ธฐํ™”๋„ ๋“ฑ๋ก๋œ ๋ฉ”์ผ๋กœ ์ง์ ‘ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD ์„ค์น˜ ๊ฒฝ๋กœ์— .env ํŒŒ์ผ์„ ์—ด์–ด์„œ ๋ณธ์ธ์˜ ๊ตฌ๊ธ€ ๊ณ„์ •๊ณผ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.

๊ตฌ๊ธ€ ๊ณ„์ • ๊ณ ๊ฐ์„ผํ„ฐ์— ๋“ฑ๋ก๋œ ์ด ๊ธ€์„ ํ†ตํ•ด ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://support.google.com/accounts/answer/185833?hl=ko

์†Œ์…œ ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

  • TSBOARD๋Š” ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„ ๋ฐ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•ด๋‹น ๋กœ๊ทธ์ธ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๋“ฑ๋ก ๋ฐ OAuth ํด๋ผ์ด์–ธํŠธ ID, ๋น„๋ฐ€๋ฒˆํ˜ธ๋“ฑ์€ ์ง์ ‘ ์ค€๋น„ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ ํ•ด๋‹น ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์€ .env ํŒŒ์ผ์—์„œ ID, Secret ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์‹œ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ถ”๊ฐ€๋กœ, tsboard.config.ts ํŒŒ์ผ์—์„œ OAUTH ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ ํƒํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ์šฉ์„ ์›์น˜ ์•Š์œผ์‹œ๋ฉด IS_READY ํ•ญ๋ชฉ์„ false ๋กœ ๋ณ€๊ฒฝ ํ›„ ์ €์žฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.)
      • tsboard.config.ts ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์‹  ๊ฒฝ์šฐ npm run build ํ˜น์€ bun run build ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•ด์ฃผ์„ธ์š”!
      • ๊ทธ ํ›„ TSBOARD ์„ค์น˜ ๊ฒฝ๋กœ (์˜ˆ: /var/www/tsboard.git/)์—์„œ bun server/index.ts ๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ์„ธ์š”.
      • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „, ๋ฐ˜๋“œ์‹œ ๊ธฐ์กด์— ๋™์ž‘์ค‘์ธ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์ข…๋ฃŒํ•ด ์ฃผ์„ธ์š”. Node.js ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์‹  ๋ถ„๋“ค์€ pm2 ํ”„๋กœ์„ธ์Šค ๋งค๋‹ˆ์ € ์‚ฌ์šฉ์ด ์ต์ˆ™ํ•˜์‹คํ…๋ฐ, Bun๋„ pm2๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์— ์ฐธ์กฐํ•ด ๋ณด์„ธ์š”! (https://bun.sh/guides/ecosystem/pm2)
pm2 reload --interpreter ~/.bun/bin/bun server/index.ts

AI ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”ํ•˜๊ธฐ

OpenAI์˜ API Key๊ฐ€ ์—†๋”๋ผ๋„ TSBOARD ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. AI๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค๋งŒ ๋น„ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค.

  • TSBOARD๋Š” OpenAI์˜ ChatGPT-4o ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์„ค๋ช…๊ธ€ ์ถ”์ถœ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ธฐ๋Šฅ์€ ์†Œ์…œ ๋กœ๊ทธ์ธ์ฒ˜๋Ÿผ ์›ํ•˜์‹ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (OpenAI์˜ API Key ๊ฐ’์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)
    • ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•ด์„œ๋Š” .env ํŒŒ์ผ์— OPENAI_API_KEY ๋ถ€๋ถ„์„ ์—…๋ฐ์ดํŠธ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • OpenAI์˜ API ๋ฐœ๊ธ‰์€ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค! TSBOARD๋Š” OpenAI๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ

์ด ์•ˆ๋‚ด๋Š” Visual Studio Code (vscode)๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•ด ๋ณด์‹  ๋ถ„๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

  • TSBOARD๋ฅผ ๋ณธ์ธ์˜ Linux PC or Mac ์— ๋จผ์ € ์„ค์น˜ํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‚ฌ์šฉํ•ด ๋ณด์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • vscode ๋ฅผ ์‹คํ–‰ ํ›„ TSBOARD ํด๋”๋ฅผ ์—ฌ์‹  ๋‹ค์Œ, ํ„ฐ๋ฏธ๋„์„ 2๊ฐœ ๋„์›๋‹ˆ๋‹ค.
    • ๋จผ์ € TSBOARD ํด๋” ๋‚ด tsboard.config.ts ํŒŒ์ผ์„ ์—ด๊ณ , IS_DEV ํ•ญ๋ชฉ์„ true ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
      • LOCALHOST ํ•ญ๋ชฉ์„ localhost ์œผ๋กœ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.
    • ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  npm run dev ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ vite ๊ฐ€ TSBOARD์˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  npm run dev:server ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ TSBOARD์˜ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000 ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๋ฉด TSBOARD ์ฒซํ™”๋ฉด์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TSBOARD ์—…๋ฐ์ดํŠธ

์—…๋ฐ์ดํŠธ ์ „์— ๊ธฐ์กด TSBOARD๋Š” ๋Š˜ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ๋ฐฑ์—…ํ•˜๋Š” ๊ฑธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. DB์˜ ๊ฒฝ์šฐ์—๋„ mysqldump ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ๋ฐฑ์—…ํ•˜์‹œ๊ณ  ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์„ธ์š”!

  • ์„ค์น˜ ํ›„ TSBOARD๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ ์ž ํ•  ๋• git pull ๋ฅผ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • git pull ์ง„ํ–‰ ์‹œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ์ˆ˜์ •ํ•˜์‹  ํŒŒ์ผ๊ณผ, TSBOARD์—์„œ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด ์ถฉ๋Œ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ด ๋•Œ๋Š” ๋ณธ์ธ์˜ ์ˆ˜์ • ๋‚ด์šฉ๊ณผ TSBOARD ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ง์ ‘ merge ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋งŽ์ด ๋”ฐ๋ผ๊ฐ€๊ธฐ ์–ด๋ ค์šธ ๋•Œ๋Š”, ์ž‘์—…ํ•˜์‹  ๋‚ด์šฉ์„ ๋จผ์ € ๋ฐฑ์—…ํ•œ ์ดํ›„ ํ•˜๋‚˜์”ฉ merge ํ•ด์ฃผ์„ธ์š”.
    • git stash ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋”ฐ๋กœ ์ž‘์—…ํ•˜์‹  ๋‚ด์šฉ์„ ์ž ์‹œ ์น˜์šด ํ›„, ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‹ค์‹œ ์ด์ „ ์ž‘์—…์„ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ€๋Šฅํ•˜๋ฉด git pull ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ˆ˜์‹œ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•ด ์ฃผ์„ธ์š”!
  • git pull ์ดํ›„์—๋Š” npm run build ํ˜น์€ bun run build ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•ฉ๋‹ˆ๋‹ค!
    • ๋นŒ๋“œ ํ•˜๊ธฐ ์ „์— tsboard.config.ts ํŒŒ์ผ์ด๋‚˜ index.html ํ˜น์€ public/robots.txt ๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”!
    • src/pages/home/HomePage.vue ํŒŒ์ผ์— ๋ฐ˜์˜ํ•˜์‹  ์ž‘์—…๋“ค์ด ์žˆ์„ ๊ฒฝ์šฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
    • ์ด ๋ฐ–์— ์ˆ˜์ •ํ•˜์‹  ํŒŒ์ผ๋“ค์ด git pull ์ดํ›„์—๋„ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์—…๋ฐ์ดํŠธ์— ๋”ฐ๋ผ์„œ ๊ฐ„ํ˜น bun update.ts ์‹คํ–‰์„ ์š”๊ตฌํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ์‹คํ–‰ ์ „์— ์—๋””ํ„ฐ๋กœ update.ts ํŒŒ์ผ์„ ์—ด์–ด์„œ ์–ด๋–ค ๋ณ€๊ฒฝ์‚ฌํ•ญ๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    • ์ด์ „ ์—…๋ฐ์ดํŠธ๋Š” ์ฃผ์„์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ์ฃผ์„์„ ํ•ด์ œํ•˜๊ณ  ์ €์žฅํ•œ ๋’ค ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • build ์ดํ›„์—๋Š” ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์ค‘์ธ bun ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ bun server/index.ts ํ˜น์€ pm2 ๋ฅผ ์ด์šฉํ•ด์„œ reload ํ•ด์ฃผ์„ธ์š”.
    • ์—ฌ๋Ÿฌ๋ถ„์˜ ํ„ฐ๋ฏธ๋„ ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ซํ˜€๋„ TSBOARD ๋ฐฑ์—”๋“œ๊ฐ€ ๊ณ„์† ๋™์ž‘ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด pm2 ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋งค๋‹ˆ์ € ํ™œ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜น์€, tmux๋‚˜ screen๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์„ธ์…˜์„ ๊ณ„์† ์—ด์–ด๋‘๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

TSBOARD ์‹คํ–‰ํ•˜๊ธฐ

  • TSBOARD๋Š” Bun ๋Ÿฐํƒ€์ž„์„ ์ด์šฉํ•ด์„œ server/index.ts ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐฑ์—”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • pm2๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ํ˜น์€ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜์–ด๋„ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜๋„๋ก tmux์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜์—ฌ bun server/index.ts๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.

์„ค์น˜ ํ›„ ์„œ๋ฒ„ ์„ค์ •

TSBOARD๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด SSL ์ ์šฉ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Ubuntu 22.04์—์„œ Nginx ์•”ํ˜ธํ™”ํ•˜๊ธฐ https://velog.io/@mero/ubuntu-22.04%EC%97%90%EC%84%9C-Nginx-%EC%95%94%ED%98%B8%ED%99%94%ED%95%98%EA%B8%B0 ํ˜น์€ ๋ฌด๋ฃŒ SSL ์ธ์ฆ์„œ์ธ letsencrypt ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ๊ฒ€์ƒ‰ํ•˜์‹  ํ›„ ์šด์˜ํ•˜์‹œ๋Š” ์„œ๋ฒ„์— ์ ์šฉํ•ด ๋ณด์„ธ์š”.

  • ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„์€ git clone โ†’ bun install โ†’ bun setup.ts ๊ณผ์ •๊นŒ์ง€ ๋ฌด์‚ฌํžˆ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€ ๋ด…์‹œ๋‹ค!
  • ์•„๋ž˜ ๋‹จ๊ณ„์—์„œ๋Š” Ubuntu server ์— Nginx ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. (๋งŒ์•ฝ apache2 ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋”๋ผ๋„, ์˜ˆ๋ฅผ ๋“ค์–ด /etc/apache2/sites-enabled/000-default ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.)
  • Nginx ์˜ ์„ค์ • ํŒŒ์ผ ๋‚ด์šฉ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. vi /etc/nginx/sites-enabled/default ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • server { ... } ์‚ฌ์ด์˜ ๋‚ด์šฉ๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TSBOARD๊ฐ€ ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜๋œ ๊ฑธ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
# /etc/nginx/sites-enabled/default
#
# TSBOARD๊ฐ€ ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜๋˜์–ด ์žˆ๊ณ ,
# ํ˜„์žฌ ์šด์˜์ค‘์ธ ์›น์‚ฌ์ดํŠธ์˜ ๋„๋ฉ”์ธ์ด tsboard.dev ์ธ๊ฑธ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
# ์•„์šธ๋Ÿฌ, tsboard.config.ts ํŒŒ์ผ์˜ PORT ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์€ ๊ฑธ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
#
server {
  root /var/www/tsboard.git/dist; # TSBOARD์„ค์น˜๊ฒฝ๋กœ/dist

  index index.html index.htm;

  server_name tsboard.dev; # ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”

  # ์ตœ๋Œ€ ์—…๋กœ๋“œ ํ—ˆ์šฉ ํฌ๊ธฐ, tsboard.config.ts ํŒŒ์ผ์˜ SIZE.MAX_FILE ์ฃผ์„ ์ฐธ์กฐ
  client_max_body_size 20M;

  location /upload {
    root /var/www/tsboard.dev; # TSBOARD์„ค์น˜๊ฒฝ๋กœ, ์ด ํด๋” ์•„๋ž˜์— upload ํด๋” ์œ„์น˜
    try_files $uri $uri/ =404;
  }

  location / {
    try_files $uri $uri/ /index.html; # Vue Router ํ™œ์šฉ์„ ์œ„ํ•œ ์„ค์ • (CSR)
  }

  # v0.8.18๋ถ€ํ„ฐ ๊ธฐ์กด /api ๊ฐ€ /tsapi ๋กœ ๋ณ€๊ฒฝ๋จ (ํƒ€ ๋ฐฑ์—”๋“œ์™€ ์ถฉ๋Œ ๋ฐฉ์ง€)
  location /tsapi {
    # tsboard.config.ts ์—์„œ PORT_PROD ๊ฐ’๊ณผ ์•„๋ž˜ 3100 ์ด ๋™์ผํ•ด์•ผ ํ•จ
    proxy_pass http://127.0.0.1:3100/tsapi;
    proxy_buffering off;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    send_timeout 300;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }

  # ์ด๋ฏธ SSL ์„ค์ •์„ ํ•˜์…จ๋‹ค๋ฉด ๋ณดํ†ต ํ•˜๋‹จ์— ๊ด€๋ จ ๋‚ด์šฉ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
}
  • ์ถ”๊ฐ€๋กœ, apache2 ์›น์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ์ค‘์ด์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”! (์ฐธ๊ณ : https://enginnersnack.tistory.com/15)
#
# /etc/apache2/site-available/000-default.conf
#
# apache2 ์›น์„œ๋ฒ„ ์‚ฌ์šฉ ์‹œ TSBOARD ์„ค์ • ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์œ„ ์ฐธ๊ณ  ํŽ˜์ด์ง€๋„ ํ™•์ธํ•ด๋ณด์„ธ์š”!
#
<VirtualHost *:443>
  DocumentRoot /var/www/tsboard.git/dist  # TSBOARD ์„ค์น˜ ๊ฒฝ๋กœ
  ProxyRequests Off
  ProxyPreserveHost On
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>
  # tsboard.config.ts ์—์„œ PORT_PROD ๊ฐ’๊ณผ ์•„๋ž˜ 3100 ์ด ๋™์ผํ•ด์•ผ ํ•จ
  ProxyPass /tsapi http://127.0.0.1:3100/tsapi
  ProxyPassReverse /tsapi http://127.0.0.1:3100/tsapi
</VirtualHost>

์„ค์น˜๊ฐ€ ์–ด๋ ค์šด ๋ถ„๋“ค๊ป˜

๋Œ€์‹  ์„ค์น˜ ์š”์ฒญํ•˜๊ธฐ

  • TSBOARD ์„ค์น˜๋ฅผ ๋Œ€์‹  ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
    • ๋ณธ์ธ์ด ์šด์˜ํ•˜์‹œ๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ์œผ์‹œ๊ณ , SSH ์ ‘์† ๊ถŒํ•œ์„ ๊ณต์œ ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์œผ์‹œ๋‹ค๋ฉด sirini@gmail.com ์œผ๋กœ ์š”์ฒญ ๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”.
    • ๋‹จ, ์„œ๋ฒ„์— ๋ฏธ๋ฆฌ Node.js ์™€ Bun ์€ ์„ค์น˜ํ•ด ๋‘์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋Ÿฐํƒ€์ž„ ์„ค์น˜๊ฐ€ ์•ˆ๋˜์–ด ์žˆ์œผ๋ฉด ๋„์›€์„ ๋“œ๋ฆฌ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค!
    • ๊ธฐ์กด์— ์šด์˜ํ•˜์‹œ๋Š” ์„œ๋น„์Šค๋ฅผ TSBOARD๋กœ ์ „ํ™˜ํ•˜๊ธธ ์›ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ https://tsboard.dev ์‚ฌ์ดํŠธ์— ๊ด€๋ จ ๋‚ด์šฉ๋“ค์„ ๊ณต์œ ํ•ด์ฃผ์„ธ์š”. (๊ธฐ์กด์— ์–ด๋–ค ๊ฒŒ์‹œํŒ์„ ์“ฐ์…จ๋Š”์ง€, ๋”ฐ๋กœ ์ปค์Šคํ…€ ํ•˜์‹  ๊ฑด ์žˆ์œผ์‹ ์ง€ ๋“ฑ, v0.8.18๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” converter.sample.ts ํŒŒ์ผ๋„ ์ฐธ๊ณ ํ•ด ๋ณด์„ธ์š”!)

๋ฌธ์˜ํ•˜๋Ÿฌ๊ฐ€๊ธฐ

  • ์„ค์น˜ ๊ณผ์ •์—์„œ์˜ ์–ด๋ ค์›€์„ ์ด๊ฒจ๋‚ด๊ณ ์ž ํ•˜๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค!
  • ์–ด๋ ค์›€์„ ํ•จ๊ป˜ ๋…ผ์˜ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด https://tsboard.dev ์‚ฌ์ดํŠธ์— ์™€์ฃผ์„ธ์š”.
  • ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์€ ๋น„๋ฐ€๊ธ€ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!

TSBOARD ์„ค๋ช…

์•„๋ž˜๋ถ€ํ„ฐ๋Š” ์•Œ์•„๋‘๋ฉด ์–ธ์  ๊ฐ€ ์“ธ๋ชจ๊ฐ€ ์žˆ์„์ˆ˜๋„ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ TSBOARD์— ์–ด์งธ์„œ ๋ณ„๋„๋กœ ์Šคํ‚จ์„ ์„ ํƒํ•˜๋Š” ๋ฉ”๋‰ด๊ฐ€ ์—†๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ 3๋ฒˆ ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”!

  1. ์ „์ฒด ๊ตฌ์กฐ
  2. ํ…Œ์ด๋ธ” ๊ตฌ์กฐ
  3. ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ

์ „์ฒด ๊ตฌ์กฐ

ํ”„๋ก ํŠธ์—”๋“œ : Vue, VuetifyJS, Tiptap

  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vue, Vuetify, Vue Router, Pinia ๊ทธ๋ฆฌ๊ณ  ์—๋””ํ„ฐ์— tiptap ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • .vue ํŒŒ์ผ์—์„œ UI๋Š” ๋Œ€๋ถ€๋ถ„ Vuetify ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ <v-card> ์ฒ˜๋Ÿผ v- ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, .vue ํŒŒ์ผ์ด ๋ธŒ๋ผ์šฐ์ €์— ๋ถ™๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™” ์ž‘์—…๋“ค์„ ํ•ด์•ผ ํ• ๋•Œ๋Š” Pinia๋กœ ์ •์˜ํ•œ ์Šคํ† ์–ด๋“ค์„ import ํ•œ ํ›„ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ UI์ชฝ ๋กœ์ง๋“ค, ํŠนํžˆ ์„œ๋ฒ„์ชฝ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜๋“ค์€ src/store/ ๋‚ด ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€ ์—ด๋žŒ์€ ํ•ญ์ƒ Vue Router ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๊ธฐ์กด์— ๊ฒŒ์‹œํŒ ๋ชฉ๋ก๋ณด๊ธฐ ํŽ˜์ด์ง€์ธ src/pages/board/List.vue ์„ ๊ทธ๋Œ€๋กœ ๋‘” ์ƒํƒœ์—์„œ, ๋‹ค๋ฅธ ๋””์ž์ธ์˜ ๋ชฉ๋ก๋ณด๊ธฐ ํŽ˜์ด์ง€๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด src/pages/something_new_board/AwesomeList.vue ๊ฒฝ๋กœ์— ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.
    • ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์„ ์ƒˆ๋กœ ๋งŒ๋“  ๋””์ž์ธ์œผ๋กœ ๋ณด๊ธธ ์›ํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€๋กœ src/router/board.ts ํŒŒ์ผ์„ ์—ด์–ด์„œ @/pages/board/List.vue ๋กœ ์ ํžŒ ๋ถ€๋ถ„์„ ๋ชจ๋‘ @/pages/something_new_board/AwesomeList.vue ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD๋Š” Client Side Rendering ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ ‘์† ๊ฒฝ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ src/router/index.ts ๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ์–ด์ฉŒ๋ฉด ๊ฐ€์žฅ ๊ถ๊ธˆํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ธ๋ฐ, TSBOARD๋Š” Client Side Rendering ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD ๊ฐœ๋ฐœ ์ดˆ๊ธฐ๋ถ€ํ„ฐ, ๊ฐ€๋Šฅํ•˜๋ฉด ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ์€ ๊ณ„์†ํ•ด์„œ ๊ฐœ์„ ๋˜๊ณ  ์žˆ๊ณ , ๋„คํŠธ์›Œํฌ๋„ ์ ์  ๋นจ๋ผ์ง€๋ฉด์„œ ์ด์ œ๋Š” ์ง„์งœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ข€ ๋” ๋ถ€๋‹ด์Šค๋Ÿฐ ์ž‘์—…๋“ค์„ ๋งŽ์ด ํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๊ฑฐ๋“ ์š”.
    • ๊ทธ๋ฆฌ๊ณ , SEO(Search Engine Optimization) ๊ด€๋ จํ•œ ๋Œ€์ฑ…์€ ์•„๋ž˜ ๋ณ„๋„์˜ ์ ˆ์—์„œ ์„ค๋ช…๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

SEO (๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”) ๋ฐฉ์•ˆ

  • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด TSBOARD๋Š” public/robots.txt ํŒŒ์ผ์— ์ง€์ •๋œ Sitemap: ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•œ main.html ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. (v0.8.40 ์ด์ƒ ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›)

    • ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” https://tsboard.dev/tsapi/seo/sitemap.xml ์ด๋ฉฐ, ์„ค์น˜ ์•ˆ๋‚ด์—์„œ tsboard.dev ๋ถ€๋ถ„์„ ๋ณธ์ธ์˜ ๋„๋ฉ”์ธ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค!
  • ์•„๋ž˜ sitemap.xml ์˜ˆ์‹œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
      <loc>https://tsboard.dev/tsapi/seo/main.html</loc>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
      <lastmod>2024-06-02</lastmod>
    </url>
    <url>
      <loc>https://tsboard.dev/tsapi/seo/about.html</loc>
      <changefreq>monthly</changefreq>
      <priority>0.3</priority>
      <lastmod>2024-06-02</lastmod>
    </url>
    <url>
      <loc>https://tsboard.dev/tsapi/seo/policy.html</loc>
      <changefreq>monthly</changefreq>
      <priority>0.3</priority>
      <lastmod>2024-06-02</lastmod>
    </url>
    <url>
      <loc>https://tsboard.dev/board/free</loc>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
      <lastmod>2024-06-02</lastmod>
    </url>
    <url>
      <loc>https://tsboard.dev/board/photo</loc>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
      <lastmod>2024-06-02</lastmod>
    </url>
    </urlset>
  • ์œ„ ์˜ˆ์‹œ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋งํฌ๋Š” https://tsboard.dev/tsapi/seo/main.html ์ž…๋‹ˆ๋‹ค. ํฌ๋กค๋Ÿฌ๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์„œ๋ฒ„์—์„œ TSBOARD๊ฐ€ ์ค€๋น„ํ•œ html ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋Š” src/pages/home/HomePage.vue ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ฒŒ์‹œ๊ธ€๋“ค ๋ฐ ๋Œ“๊ธ€๋“ค์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ์ถœ๋ ฅํ•ด์„œ ํฌ๋กค๋Ÿฌ์—๊ฒŒ ์ œ๊ณตํ• ์ง€๋Š” tsboard.config.ts ์˜ SEO ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์กฐ์ ˆํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํฌ๋กค๋Ÿฌ๊ฐ€ ์ˆ˜์ง‘ํ•˜๋Š” ๋‚ด์šฉ ์ค‘์— ๊ฒŒ์‹œ๊ธ€ ๋งํฌ๋‚˜ ์‚ฌ์ดํŠธ ๋งํฌ์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ํŽ˜์ด์ง€๋กœ ๋งํฌ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํ•ด๋‹น main.html ํŽ˜์ด์ง€๋ฅผ ์—ด๋žŒํ•œ ์‚ฌ์šฉ์ž๋Š” ์–ด๋–ค ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋“  ์›๋ž˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ๋Š” ์œ„์˜ main.html ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ป๊ณ , ์‚ฌ์šฉ์ž๋Š” ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ˆ˜์ง‘ํ•œ main.html ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ๊ธฐ์กด์˜ CSR ํŽ˜์ด์ง€๋กœ ์œ ์ž…๋˜๋Š” ์…ˆ์ž…๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ : Bun & ElysiaJS

  • TSBOARD์˜ ๋น ๋ฅธ ํผํฌ๋จผ์Šค์™€ ํƒ€์ž… ์•ˆ์ •์„ฑ์€ Bun ๊ณผ ElysiaJS ๋•๋ถ„์ž…๋‹ˆ๋‹ค.
    • ํŠนํžˆ TSBOARD๋Š” ElysiaJS ์˜ ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ edenTreaty ์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • edenTreaty ๋ฅผ ํ†ตํ•ด, TSBOARD๋Š” ํ”„๋ก ํŠธ์—”๋“œ์˜ ์Šคํ† ์–ด์—์„œ๋ถ€ํ„ฐ ์„œ๋ฒ„๊นŒ์ง€ ๊ฒฌ๊ณ ํ•œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. routers ์—์„œ API ๊ฒฝ๋กœ ๋ผ์šฐํŒ…์„, database ์—์„œ CRUD ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋Š” ๋ชจ๋‘ server/routers/ ๊ฒฝ๋กœ ์•„๋ž˜์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ํ™•์ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ฒ˜๋ฆฌ๋“ค์€ ๋ชจ๋‘ server/database/ ๊ฒฝ๋กœ ์•„๋ž˜์— ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ตœ์ƒ์œ„ ํด๋”๋ช…์„ ์ œ์™ธํ•˜๋ฉด routers ์™€ database ๋‚ด๋ถ€์˜ ํด๋” ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ๋ช…์ด (๋Œ€๋ถ€๋ถ„) ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„ํ•œ ๊ฒƒ์œผ๋กœ, ๋™์ผํ•œ ํด๋”๋ช… ์•„๋ž˜์— ์žˆ๋Š” ๋™์ผํ•œ ํŒŒ์ผ๋ช…์€ ์„œ๋กœ ๊ฐ™์€ ๋ชฉ์ ์„ ์œ„ํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ด๋ฉฐ ๋‹จ์ง€ ์—ญํ• ์— ๋”ฐ๋ผ ์œ„์น˜๋งŒ ๋‹ฌ๋ฆฌํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • TSBOARD๋Š” ์ „ํ†ต์ ์ธ RDBMS์ด์ž ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” MySQL(Mariadb)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ SQL์„ ํ™œ์šฉํ•˜๋ฉฐ, Prisma ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํŠน๋ณ„ํ•œ ์ด์œ ๋Š” ์—†๊ณ  ์ €๋Š” DB ์ž‘์—…์— ์—ฌ์ „ํžˆ SQL ์ฟผ๋ฆฌ๊ฐ€ ๋” ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฌธ์€ server/database/common.ts ์— ์ •์˜๋œ 4๊ฐœ์˜ ํ•จ์ˆ˜ (select, update, insert, remove) ๋ฅผ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„ํ•œ ๊ฒƒ์œผ๋กœ, ์ฟผ๋ฆฌ ์‹คํ–‰์— ๋ถˆํ•„์š”ํ•œ try { ... } catch { ... } finally { ... } ๋ฐ˜๋ณต์„ ์ค„์ด๊ณ  ์‹ถ์–ด์„œ ์ž…๋‹ˆ๋‹ค.

DB ํ…Œ์ด๋ธ”

  • ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” install/table/query.ts ํŒŒ์ผ์„ ํ†ตํ•ด ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TSBOARD๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •๊ทœํ™”๋œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ง€ํ–ฅํ•˜์ง€๋งŒ, SELECT ์ฟผ๋ฆฌ์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋‚˜ ํ˜น์€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, post / post_hashtag / post_like / comment_like / file / image ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” board_uid ์ปฌ๋Ÿผ์˜ ๊ฒฝ์šฐ ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ํ†ต๊ณ„๋ฅผ ๋ฝ‘์•„๋ณด๊ฑฐ๋‚˜, ์‚ญ์ œ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์‹ค์€ ์—†์–ด๋„ ๋˜๋Š” ์ปฌ๋Ÿผ์„ ์ผ๋ถ€๋กœ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ์ •์ˆ˜ ํฌ๊ธฐ๋งŒํผ์˜ ๋น„์šฉ์„ ์ถ”๊ฐ€๋กœ ์ง€๋ถˆํ•˜๊ณ , ๋Œ€์‹  ๊ด€๋ฆฌ์˜ ํŽธ์˜์„ฑ์„ ๋†’์ธ ์…ˆ์ž…๋‹ˆ๋‹ค.
    • ๋ฐ˜๋ฉด, post ํ…Œ์ด๋ธ”์— hit ์ปฌ๋Ÿผ๊ณผ ๋”๋ถˆ์–ด ์žˆ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€ reply_count ๋‚˜ like_count ์ปฌ๋Ÿผ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์—ฐ๊ด€ ํ…Œ์ด๋ธ”์„ ๊ฒ€์ƒ‰ํ•ด์„œ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์นด์šดํŒ…์„ ํ•˜์—ฌ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„ํ•œ ๊ฒƒ์œผ๋กœ, ๊ฒŒ์‹œ๊ธ€์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์„ post ํ…Œ์ด๋ธ” ํ•˜๋‚˜๋งŒ ์ง€์ •ํ•œ ๋Œ€์‹ , ๋Œ“๊ธ€์ด ์ž‘์„ฑ/์‚ญ์ œ ๋˜๊ฑฐ๋‚˜ ์ข‹์•„์š”๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์žฆ์€ UPDATE ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ post, comment ํ…Œ์ด๋ธ”์ด ๊ฐ€๋Šฅํ•œ ์ž‘์€ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๊ถ๊ธˆํ•ดํ•˜์‹ค ๋ถ€๋ถ„, ์™œ ๊ฒŒ์‹œํŒ์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  post, comment ํ…Œ์ด๋ธ”์„ ๊ฐ๊ฐ ํ•˜๋‚˜๋กœ ์œ ์ง€ํ•˜๋Š” ์„ ํƒ์„ ํ–ˆ๋Š”์ง€ ์„ค๋ช…๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD๋Š” ํ…Œ์ด๋ธ”๋“ค์˜ ์ธ๋ฑ์Šค์— ๋น„์šฉ์„ ์ข€ ๋” ์ง€๋ถˆํ•˜๊ณ , ๋Œ€์‹  ํ…Œ์ด๋ธ” ์ž์ฒด๋ฅผ ๊ฒŒ์‹œํŒ ์ƒ์„ฑ์— ๋งž์ถฐ ๋” ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ค„์ด์ง€ ์•Š์Œ์œผ๋กœ์„œ ์ „์ฒด ๊ฒ€์ƒ‰์ด๋‚˜ ๊ฒŒ์‹œ๊ธ€ ์ด๋™๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ˜„์žฌ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • post, comment ํ…Œ์ด๋ธ”์ด ํ•˜๋‚˜๋กœ ๊ณ ์ •๋˜์ง€๋งŒ, ๋ณด๊ด€ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋Œ€๋ถ€๋ถ„์€ ์‚ฌ์‹ค ์™ธ๋ถ€ ํ‚ค์ด๋ฉฐ ๋‚˜๋จธ์ง€๋„ ๋Œ€๋ถ€๋ถ„ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ์ •์ˆ˜ํ˜• ์ปฌ๋Ÿผ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์— ๊ฐ€ํ•ด์ง€๋Š” ๋ถ€๋‹ด์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๋””์ž์ธ์„ ์„ ํƒํ•œ ๋Œ€์‹ , ๋ณด๋‹ค ๊ทนํ•œ์˜ ์ธ๋ฑ์Šค ํ™œ์šฉ์„ ์œ„ํ•ด TSBOARD๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•ด๋„ ์‹ค์ œ๋กœ DELETE ์ž‘์—… ๋Œ€์‹  ์ƒํƒœ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ์‹์œผ๋กœ ํ•ด์„œ ์ธ๋ฑ์Šค๊ฐ€ ํ•ญ์ƒ hit ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ TSBOARD๋Š” ๊ฒŒ์‹œํŒ์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๋งŒ๋“ค๋”๋ผ๋„ DB์— ๊ฐ€ํ•ด์ง€๋Š” ๋ถ€๋‹ด์—†์ด ์—ฌ์ „ํžˆ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

v0.8.40 ์ด์ƒ ๋ฒ„์ „๋ถ€ํ„ฐ TSBOARD์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋„๋ก ์™ธ๋ž˜ ํ‚ค(FOREIGN KEY) ์„ค์ •์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ๊ฐ€์ด๋“œ

TSBOARD๋Š” ์Šคํ‚จ์ด ์—†๋‚˜์š”?

  • ๋ณดํ†ต ๊ฒŒ์‹œํŒ ํ•˜๋ฉด ๋– ์˜ค๋ฅด๋Š” ์Šคํ‚จ ํ˜น์€ ํ…Œ๋งˆ๋Š”, ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋ฉด์„œ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๋””์ž์ธ์„ ์ œ๊ณตํ•˜๊ณ ์ž ํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. TSBOARD๋„ ์ฒ˜์Œ์— ์Šคํ‚จ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ์œผ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๋กœ ์Šคํ‚จ ์‹œ์Šคํ…œ์€ ํฌ๊ธฐํ•˜๊ณ  ์ปค์Šคํ…€ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    • ์Šคํ‚จ์ด๋‚˜ ํ…Œ๋งˆ๋Š” ์‚ฌ์šฉ์ž์˜ ๊ทœ๋ชจ๊ฐ€ ์–ด๋Š ์ •๋„ ๋˜๋ฉด์„œ, ๋™์‹œ์— ๋””์ž์ด๋„ˆ๋ถ„์ด ํ•ด๋‹น ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. TSBOARD๋Š” ์•„์‰ฝ๊ฒŒ๋„ ๋‘˜ ๋‹ค ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์• ์ดˆ์— ๊ฐœ๋ฐœํ•  ๋•Œ๋ถ€ํ„ฐ ๋””์ž์ธ์€ Vuetify ์— ์˜์กดํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ฆฌํ•˜๊ฒŒ ์Šคํ‚จ ์‹œ์Šคํ…œ์„ ๋„ฃ์ง€ ์•Š๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค์ด ๋งŽ์•„์„œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์Šคํ‚จ ์‹œ์Šคํ…œ์ด ์—†๋”๋ผ๋„ ์ง์ ‘ ๋””์ž์ธ์„ ์ˆ˜์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋น„๊ต์  ์‰ฝ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ด์–ด์ง€๋Š” ๋‚ด์šฉ๋“ค์„ ์ฐธ์กฐํ•ด ์ฃผ์„ธ์š”!

์ปค์Šคํ…€ ์›์น™ - ์ƒˆ๋กœ์šด ๋””์ž์ธ์€ ์ƒˆ๋กœ์šด ํŒŒ์ผ์—์„œ

์ปค์Šคํ…€ ์ž‘์—…์„ ํ•˜๋ ค๋ฉด ๋‚ด Linux PC or Mac ์—์„œ ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์ž‘์—…ํ•˜์‹œ๋Š” ๊ฒŒ ํŽธํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ๊ฐœ๋ฐœ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋ถ€๋ถ„์„ ์ฐธ์กฐํ•˜์„ธ์š”!

  • ์•ž์„  ๊ธ€์—์„œ src/pages/board/List.vue ๋ฅผ src/pages/something_new_board/AwesomeList.vue ๋กœ ๋ฐ”๊ฟ”์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑธ ์„ค๋ช…๋“œ๋ ธ์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๊ธฐ์กด์˜ src/pages/board/List.vue ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ํ•ด๋‹น ํŒŒ์ผ์„ src/pages/something_new_board/AwesomeList.vue ์œ„์น˜๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ˆ˜์ •ํ•˜๊ณ  Vue Router ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ƒฅ src/pages/board/List.vue ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์„œ ์“ฐ๋ฉด ์•ˆ๋ ๊นŒ์š”? Vue Router ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๋„ ์—†์œผ๋‹ˆ ๋” ๊ฐ„ํŽธํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ์ด์œ ๋“ค๋กœ ์ธํ•ด ์ปค์Šคํ…€์„ ํ•˜์‹ค ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ธฐ์กด ํŒŒ์ผ์„ ๋จผ์ € ๋ณต์‚ฌํ•œ ํ›„์— ์ง„ํ–‰ํ•˜์‹œ๋Š” ๊ฑธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ์กด ํŒŒ์ผ (์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œํŒ ๋ชฉ๋ก๋ณด๊ธฐ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ์น˜๋ฉด src/pages/board/List.vue)์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ, ์ถ”ํ›„ TSBOARD๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์„ ๋•Œ ์ถฉ๋Œ์ด ๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ˆ˜์ •ํ•˜์‹  ๋ถ€๋ถ„์„ ์ƒˆ๋กœ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ๋“ค๊ณผ ์ผ์ผํžˆ ๋Œ€์กฐํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  Vue Router ๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒŒ๋˜๋ฉด, TSBOARD ์—…๋ฐ์ดํŠธ ์‹œ Vue Router (์ง€๊ธˆ ์˜ˆ์‹œ ๊ธฐ์ค€์ด๋ฉด src/router/board.ts) ๋งŒ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ณ  ํ•„์š”์‹œ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ๋ฌด์—‡๋ณด๋‹ค, ์ง€๊ธˆ ์˜ˆ์‹œ ๊ธฐ์ค€์œผ๋กœ ์ปค์Šคํ…€ํ•œ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก๋ณด๊ธฐ์— ๋ญ”๊ฐ€ ์ด์ƒ์ด ์žˆ๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„๋•Œ ๋Œ€์กฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€(์ˆœ์ • ํŒŒ์ผ)์ด ์žˆ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์‹œํŒ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ์šด ์ปค์Šคํ…€ ๋””์ž์ธ์˜ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ๋จผ์ € src/pages/board/ ํด๋”๋ฅผ ๋ณต์‚ฌํ•ด์„œ src/pages/custom_board/ ๊ฒฝ๋กœ์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ํด๋” ๊ฒฝ๋กœ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์›ํ•˜์‹œ๋Š”๋Œ€๋กœ ํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, src/pages/custom/board/ ์ฒ˜๋Ÿผ ํ•˜์…”๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์Œ์œผ๋กœ, Vue Router ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ƒˆ๋กœ ๋ณต์‚ฌํ•œ ๊ฒฝ๋กœ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์˜ˆ์‹œ ๊ธฐ์ค€์ด๋ฉด src/router/board.ts ํŒŒ์ผ์„ ์—ด๊ณ , import("@/pages/board/List.vue") ์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์—์„œ /board/ ๋ฅผ /custom_board/ ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰์ค‘์ด๋ผ๋ฉด vite ์„œ๋ฒ„๊ฐ€ ์žฌ์‹คํ–‰๋˜๋ฉด์„œ ์ด์ œ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์„ ๋ณผ ๋•Œ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
    • ๋งˆ์ง€๋ง‰์œผ๋กœ, src/pages/custom_board/ ์˜ List.vue, View.vue, Write.vue ํŒŒ์ผ๋“ค์„ ์ž…๋ง›์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…๋„ ๋ฐ”๊พธ๊ธธ ์›ํ•˜์‹ ๋‹ค๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด List.vue ๋Œ€์‹  AwesomeList.vue ์ฒ˜๋Ÿผ) ๋ฐ”๊พธ์…”๋„ ๋ฉ๋‹ˆ๋‹ค๋งŒ, ๊ถŒ์žฅ์‚ฌํ•ญ์€ ํด๋”๋ช…๋งŒ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ์ฐธ๊ณ ๋กœ, List.vue, View.vue, Write.vue ํŒŒ์ผ๋“ค์€ ๋ชจ๋‘ src/components/board/ ๊ฒฝ๋กœ ์•„๋ž˜์— ์žˆ๋Š” ์—ฌ๋Ÿฌ Vue ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ์ฐธ์กฐํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค๊นŒ์ง€ ๋ชจ๋‘ ์ปค์Šคํ…€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, src/pages/custom_board/components ๊ฒฝ๋กœ์— ์ปค์Šคํ…€ํ•  ํด๋”์™€ ํŒŒ์ผ๋“ค์„ ๋ณต์‚ฌํ•œ ๋‹ค์Œ, ์ˆ˜์ •ํ•˜๊ณ  List.vue ์ฒ˜๋Ÿผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์„ import ํ•˜๋Š” ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ๋„ ์ˆ˜์ •ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ปค์Šคํ…€์„ TSBOARD์— ๋ฐ˜์˜ํ•˜๊ธฐ

  • TSBOARD ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์ฐธ์—ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ์ƒˆ๋กœ ๋งŒ๋“œ์‹  ์ปค์Šคํ…€ ๊ฒŒ์‹œํŒ ํ˜น์€ ๊ฐค๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ Pull Request ๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์‹œ๊ณ  ๊ณต์œ ํ•ด์ฃผ์„ธ์š”!
  • ๋˜ํ•œ TSBOARD ํ™œ์šฉ์— ํ•„์š”ํ•œ ์ปค์Šคํ…€๋“ค์ด ์žˆ์„ ๊ฒฝ์šฐ, https://tsboard.dev ์‚ฌ์ดํŠธ์—์„œ ์–ธ์ œ๋“ ์ง€ ์ œ์•ˆ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์šด์˜์ค‘์ด์‹  ์‚ฌ์ดํŠธ์— ๋”ฑ ํ•„์š”ํ•œ ์ปค์Šคํ…€์ด ์žˆ์œผ์‹  ๊ฒฝ์šฐ ์ •๋‹นํ•œ ๋Œ€๊ฐ€๋ฅผ ์ง€๋ถˆํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์˜ ์‹œ๊ฐ„์„ ์‚ฌ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

TSBOARD ๊ฐœ๋ฐœ ๊ณ„ํš

์ƒˆ๋กœ์šด ์›น์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์ƒ๊ฐํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์ปค๋ฎค๋‹ˆํ‹ฐ, ์‡ผํ•‘๋ชฐ, ๋ธ”๋กœ๊ทธ... ๊ทธ ์–ด๋–ค ๊ฒƒ์ด๋“  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜์‹ค ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ TSBOARD๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”! ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก, TSBOARD๊ฐ€ ํ•จ๊ป˜ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ๋งต

  • v0.8.z (ํ˜„์žฌ)
  • v0.9.0 (~ 24.09.30)
    • ๋ธ”๋กœ๊ทธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ๊ฐœ์„  ์ž‘์—…์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    • CSR ๋ฐฉ์‹ ๊ธฐ๋ฐ˜์—์„œ SEO๋ฅผ ์ข€ ๋” ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…๋“ค์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • v1.0.0 (~ 24.12.30)
    • ๋ธ”๋กœ๊ทธ ๊ธฐ๋Šฅ ์•ˆ์ •ํ™” ํ›„ ๊ณต๊ฐœ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
    • ์ฑ„ํŒ…์€ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…์„ ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. (ํ˜„์žฌ๋Š” ์ชฝ์ง€์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.)
  • v1.5.0 (~ 25.06.30)
    • ์‡ผํ•‘๋ชฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
    • ๊ฒฐ์ œ ๋ชจ๋“ˆ๊นŒ์ง€ ๋ถ™์—ฌ์„œ ์‹ค์ œ๋กœ ์ œํ’ˆ ๋“ฑ๋ก ๋ฐ ํŒ๋งค๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
  • v2.0.0 (~ 25.12.30)
  • v3.0.0 (~ 27)

๋กœ๋“œ๋งต์€ ๊ฐœ๋ฐœ์ž์˜ ์‚ฌ์ •์— ๋”ฐ๋ผ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

  • ํ…Œ์ŠคํŠธ๋„ ๋งŽ์ด ํ•ด๋ณด์‹œ๊ณ , ๋ถˆํŽธํ•œ ์ ์€ ์–ธ์ œ๋“ ์ง€ ๋ง์”€ํ•ด์ฃผ์„ธ์š”!
  • ์›น ์ƒํƒœ๊ณ„์— ์ž‘๊ฒŒ๋‚˜๋งˆ ๋ณดํƒฌ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์–ธ์  ๊ฐ€ TSBOARD๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฉ‹์ง„ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋งŒ๋‚˜๋Š” ๊ทธ ๋‚ ์„ ๊ฟˆ๊ฟ”๋ด…๋‹ˆ๋‹ค!