Skip to content

sirini/tsboard

Repository files navigation

TSBOARD

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

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

TSBOARD๋Š” Type Safety BOARD๋กœ, ์ค‘์†Œ ๊ทœ๋ชจ์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์—”์ง„์ž…๋‹ˆ๋‹ค.

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

  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vue ์™€ Vuetify ๋กœ ์ œ์ž‘๋˜์–ด ์žˆ์–ด ์œ ๋ คํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ UI ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Go์–ธ์–ด๋กœ ์™„์ „ํžˆ ์ƒˆ๋กญ๊ฒŒ ์žฌ์ž‘์„ฑ๋œ GOAPI ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋‹ค ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค์™€ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

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


TSBOARD ์„ค์น˜

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

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

  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” Vue3 + Vuetify ๊ธฐ๋ฐ˜์ด๋ฉฐ, vite๋กœ ์ปดํŒŒ์ผ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Node.js ์„ค์น˜ ํ•„์š”)
    • v1.0.0 ์ด์ „ ๋ฒ„์ „์— ์š”๊ตฌ๋˜์—ˆ๋˜ JS/TS ๋Ÿฐํƒ€์ž„ Bun์€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • Node.js๋Š” npm ์‚ฌ์šฉ์„ ์œ„ํ•ด ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, v22 ๋ฒ„์ „ ์ด์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” npm ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      • npm install : TSBOARD ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚ด๋ ค๋ฐ›์€ ํ›„ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„œ๋ฒ„์— ๋‚ด๋ ค ๋ฐ›๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • npm run dev : TSBOARD๋ฅผ ๊ฐœ๋ฐœ/์ˆ˜์ • ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฐ„์ด ์„œ๋ฒ„๋ฅผ vite๋กœ ๋„์šฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • npm run build : TSBOARD์˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ vite๋กœ ์ปดํŒŒ์ผ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ๋Š” ์‚ฌ์ „์— ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ์ œ๊ณต๋˜๋ฉฐ, ์„œ๋ฒ„์— libvips ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • libvips๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜, ํฌ๋งท์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • TSBOARD๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” goapi-linux ์™€ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” libvips ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ์šด์˜์ค‘์ด์‹œ๋ผ๋ฉด, ์‰ฝ๊ฒŒ ์„ค์น˜ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŒ… ์‚ฌ์šฉ์ž๋Š” libvips ์„ค์น˜๋ฅผ ์š”์ฒญํ•ด๋ณด์„ธ์š”.
      • Ubuntu linux : sudo apt install libvips-dev
      • Mac : brew install vips
      • Windows : choco install vips
  • ์ถ”์ฒœํ•˜๋Š” ์šด์˜ ํ™˜๊ฒฝ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • OS : Ubuntu linux (ํ˜น์€ linux server), 22.04 ์ดํ›„
    • CPU : 2 core ์ด์ƒ, core์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก TSBOARD๊ฐ€ ์ด์ œ ๋” ์ž˜ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • RAM : 2GB ์ด์ƒ, ๋™์‹œ์ ‘์†์ž๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ goapi๊ฐ€ ~300MB๊นŒ์ง€ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • DBMS : MySQL ํ˜น์€ Mariadb ์ตœ์‹  ๋ฒ„์ „

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

  • MySQL(Mariadb) ๊ณ„์ •์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜, ํ˜น์€ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD๋Š” ์„ค์น˜ ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (๊ธฐ๋ณธ tsboard)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์„ค์น˜ ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋‘์…จ๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ๊ณ„์ •์ด ์ƒ์„ฑ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • libvips ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ์„œ๋ฒ„์—์„œ๋Š” TSBOARD ๋ฐฑ์—”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

TSBOARD ์„ค์น˜

  • TSBOARD๋Š” ๋ณ„๋„์˜ ์„ค์น˜ ํŒŒ์ผ๋“ค์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, Git์„ ํ†ตํ•ด ์„ค์น˜ ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋จผ์ €, git clone https://github.com/sirini/tsboard tsboard.git ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅํ•˜๋Š” ์„ค์น˜ ๊ฒฝ๋กœ๋Š” /var/www/ ํ•˜์œ„ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. /root/ ๋Š” ์ถ”์ฒœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜ ์‹œ /var/www/tsboard.git/ ํด๋” ์•ˆ์— goapi-linux ํŒŒ์ผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • TSBOARD๊ฐ€ ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๋“ค์„ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ๊ถŒ์žฅ ์„ค์น˜ ๊ฒฝ๋กœ์— ์„ค์น˜ํ•˜์…จ๋‹ค๋ฉด, /var/www/tsboard.git/ ํด๋” ์œ„์น˜์—์„œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • npm install ๋กœ ์„ค์น˜ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉํ•˜์‹œ๋Š” ์„œ๋ฒ„์˜ OS์— ๋งž์ถฐ goapi-linux ์ฒ˜๋Ÿผ ๋ฐฑ์—”๋“œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (์‹คํ–‰ ๊ถŒํ•œ์„ ์ฃผ์…”์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค)
    • ์ฒ˜์Œ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ, ์„ค์น˜ ์•ˆ๋‚ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋ช‡๊ฐ€์ง€ ์ •๋ณด๋ฅผ ์š”์ฒญ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
    • ์ด ๋•Œ MySQL(Mariadb)์˜ ์ ‘์† ์ •๋ณด ๋ฐ ๊ด€๋ฆฌ์ž ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ์ ‘์† ์ •๋ณด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ณ  DB ์ƒ์„ฑ (๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ) ๊ถŒํ•œ์ด ์žˆ๋‹ค๋ฉด, ๋ฌธ์ œ์—†์ด DB/Table๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, .env ํŒŒ์ผ์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ํ•ด๋‹น ํŒŒ์ผ์— ์ฃผ์š” ์„ค์ •๊ฐ’๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • TSBOARD ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. tsboard.config.ts ํŒŒ์ผ์„ vi ๊ฐ™์€ ์—๋””ํ„ฐ๋กœ ์—ด์–ด์ฃผ์„ธ์š”.
    • tsboard.config.ts ์—๋Š” TSBOARD ์šด์˜์— ํ•„์š”ํ•œ ์„ค์ •๋“ค์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • <<< [์ˆ˜์ • ํ•„์š”] ๋ผ๊ณ  ์ ํžŒ ๋ถ€๋ถ„์€ ๋ณธ์ธ์˜ ์‚ฌ์ดํŠธ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์…”์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
      • PROD_URL : ๋ณธ์ธ์˜ ์›น์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ์œผ๋กœ ๋ณ€๊ฒฝ
      • TSBOARD.SITE.NAME : ๋ณธ์ธ์˜ ์›น์‚ฌ์ดํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ
      • TSBOARD.PREFIX : TSBOARD๊ฐ€ ํŠน์ • ํด๋” ํ•˜์œ„๋กœ ์ ‘๊ทผ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์•ž์ชฝ ํด๋”๋ช… ์ถ”๊ฐ€ (๋Œ€๋ถ€๋ถ„์€ ๋นˆ ์นธ)
      • QUICK_BUTTONS.WRITE : ๋ชจ๋ฐ”์ผ์—์„œ ์ƒˆ ๊ธ€ ์ž‘์„ฑ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด๋™ํ•  ๊ฒŒ์‹œํŒ ID๋กœ ์ˆ˜์ •
      • QUICK_BUTTONS.UPLOAD : ๋ชจ๋ฐ”์ผ์—์„œ ์ƒˆ ์‚ฌ์ง„ ์—…๋กœ๋“œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด๋™ํ•  ๊ฐค๋Ÿฌ๋ฆฌ ID๋กœ ์ˆ˜์ •
      • OAUTH.IS_READY : ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ true ์„ค์ • (.env ํŒŒ์ผ์—์„œ ๊ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ๋ณ„ API ์ •๋ณด ๊ธฐ์ž… ํ•„์š”)
      • POLICY.NAME : ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ ํ•„์š”
      • POLICY.EMAIL : ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ ํ•„์š”
  • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ .env ํŒŒ์ผ์„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ vi๋“ฑ์œผ๋กœ ์—ด์–ด์„œ tsboard.config.ts ์„ค์ •๊ณผ ๋งž์ถฐ ์ˆ˜์ •ํ•ด ์ค๋‹ˆ๋‹ค.
    • .env ํŒŒ์ผ์ผ์—๋Š” tsboard.config.ts ์™€ ์ค‘๋ณต๋˜๋Š” ์„ค์ • ํ•ญ๋ชฉ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‘ ํŒŒ์ผ ๋ชจ๋‘์—์„œ ๋™์ผํ•œ ์„ค์ •๊ฐ’์ด ์ ์šฉ๋˜๋„๋ก ํ•ด์ฃผ์„ธ์š”. (์˜ˆ: ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋‘˜ ๋‹ค 3003 ์œผ๋กœ ๋ณ€๊ฒฝ)
    • .env ํŒŒ์ผ ์† ๋‚ด์šฉ์ด ์™ธ๋ถ€๋กœ ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•ด์ฃผ์„ธ์š”.
    • ์ด ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋ฉด TSBOARD๋Š” ๋‹ค์‹œ ์„ค์น˜ ํ™”๋ฉด๋ถ€ํ„ฐ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • index.html ํŒŒ์ผ๋„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด์„œ <title> ํƒœ๊ทธ์— ๋ณธ์ธ์˜ ์‚ฌ์ดํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”.
  • ๊ฒ€์ƒ‰ ์—”์ง„๋“ค์˜ ์ƒ‰์ธ ์ž‘์—…์„ ๋•๊ธฐ ์œ„ํ•ด public/robots.txt ํŒŒ์ผ์„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด ์‚ฌ์ดํŠธ ์ฃผ์†Œ๋ฅผ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.
    • robots.txt ํŒŒ์ผ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ TSBOARD ๊ณตํ™ˆ ์ฃผ์†Œ๊ฐ€ ์ ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”!
  • src/pages/home/HomePage.vue ํŒŒ์ผ์„ ์—๋””ํ„ฐ๋กœ ์—ด์–ด ๋ณธ์ธ ์‚ฌ์ดํŠธ์— ๋งž๊ฒŒ ๋ฏธ๋ฆฌ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.
// HomeTitle ๋ถ€๋ถ„์„ ๋ณธ์ธ์˜ ์‚ฌ์ดํŠธ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค
import HomeTitle from "./components/static/TsboardHomeTitle.vue"
  • ์ด์ œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. TSBOARD๋ฅผ build ํ•ฉ๋‹ˆ๋‹ค!
    • ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ›์œผ์‹  TSBOARD๋Š” ์ด์ œ vite ๋ฅผ ํ†ตํ•ด build ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • npm run build ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด, tsboard ํด๋” ์•ˆ์— dist/ ํด๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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

  • TSBOARD๋Š” ๊ตฌ๊ธ€ ๊ณ„์ •์˜ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ GMAIL ๋ฐœ์†ก์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”์ผ ๋ฐœ์†ก์„ ํ†ตํ•ด ์ตœ์ดˆ ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ดˆ๊ธฐํ™”๋„ ๋“ฑ๋ก๋œ ๋ฉ”์ผ๋กœ ์ง์ ‘ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • TSBOARD ์„ค์น˜ ๊ฒฝ๋กœ์— .env ํŒŒ์ผ์„ ์—ด์–ด์„œ ๋ณธ์ธ์˜ ๊ตฌ๊ธ€ ๊ณ„์ •๊ณผ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.
# .env
# ๊ตฌ๊ธ€ ์•ฑ๋น„๋ฐ€๋ฒˆํ˜ธ for GMAIL ๋ฐœ์†ก
# ์ฐธ๊ณ ) https://velog.io/@seul06/nodemailer
[email protected]
GMAIL_APP_PASSWORD=passwordfromgoog

๊ตฌ๊ธ€ ๊ณ„์ • ๊ณ ๊ฐ์„ผํ„ฐ์— ๋“ฑ๋ก๋œ ์ด ๊ธ€์„ ํ†ตํ•ด ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 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 ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•ด์ฃผ์„ธ์š”!
      • ๊ทธ ํ›„ TSBOARD ์„ค์น˜ ๊ฒฝ๋กœ (์˜ˆ: /var/www/tsboard.git/)์—์„œ goapi-linux๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ์„ธ์š”.
# .env
# ๊ตฌ๊ธ€ OAuth ํด๋ผ์ด์–ธํŠธ
OAUTH_GOOGLE_CLIENT_ID=your_google_client_id_from_https://console.cloud.google.com
OAUTH_GOOGLE_SECRET=your_google_client_secret_from_https://console.cloud.google.com

# ๋„ค์ด๋ฒ„ OAuth ํด๋ผ์ด์–ธํŠธ
OAUTH_NAVER_CLIENT_ID=your_naver_client_id_from_https://developers.naver.com
OAUTH_NAVER_SECRET=your_naver_client_secret_from_https://developers.naver.com

# ์นด์นด์˜ค OAuth ํด๋ผ์ด์–ธํŠธ
OAUTH_KAKAO_CLIENT_ID=your_kakao_client_id_from_https://developers.kakao.com
OAUTH_KAKAO_SECRET=your_kakao_client_secret_from_https://developers.kakao.com

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

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

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

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

์ด ์•ˆ๋‚ด๋Š” Visual Studio Code (vscode)๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•ด ๋ณด์‹  ๋ถ„๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฐฑ์—”๋“œ๋„ ์ง์ ‘ ์ˆ˜์ •์„ ์›ํ•˜์‹ค ๊ฒฝ์šฐ https://github.com/sirini/goapi ํ”„๋กœ์ ํŠธ๋ฅผ clone ํ•˜์…”์„œ ์ˆ˜์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ Go ์–ธ์–ด ํˆด์ฒด์ธ/์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ธฐ๊ธฐ์— ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • TSBOARD๋ฅผ ๋ณธ์ธ์˜ Linux PC or Mac ์— ๋จผ์ € ์„ค์น˜ํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‚ฌ์šฉํ•ด ๋ณด์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • vscode ๋ฅผ ์‹คํ–‰ ํ›„ TSBOARD ํด๋”๋ฅผ ์—ฌ์‹  ๋‹ค์Œ, ํ„ฐ๋ฏธ๋„์„ 2๊ฐœ ๋„์›๋‹ˆ๋‹ค.
    • ๋จผ์ € TSBOARD ํด๋” ๋‚ด tsboard.config.ts ํŒŒ์ผ์„ ์—ด๊ณ , IS_DEV ํ•ญ๋ชฉ์„ true ๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  npm run dev ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ vite ๊ฐ€ TSBOARD์˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  goapi-linux๋ฅผ ์‹คํ–‰ํ•˜์—ฌ TSBOARD์˜ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
      • Linux๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด Mac์ผ ๊ฒฝ์šฐ goapi-mac์„ ์‹คํ–‰ํ•ด ์ฃผ์„ธ์š”.
      • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ, ๋ฐฑ์—”๋“œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํ•˜์…”์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        • chmod +x ./goapi-linux
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ 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 ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ build ํ•ฉ๋‹ˆ๋‹ค!
    • ๋นŒ๋“œ ํ•˜๊ธฐ ์ „์— tsboard.config.ts ํŒŒ์ผ์ด๋‚˜ index.html ํ˜น์€ public/robots.txt ๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”!
    • src/pages/home/HomePage.vue ํŒŒ์ผ์— ๋ฐ˜์˜ํ•˜์‹  ์ž‘์—…๋“ค์ด ์žˆ์„ ๊ฒฝ์šฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
    • ์ด ๋ฐ–์— ์ˆ˜์ •ํ•˜์‹  ํŒŒ์ผ๋“ค์ด git pull ์ดํ›„์—๋„ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

TSBOARD ๋ฐฑ์—”๋“œ ์‹คํ–‰ํ•˜๊ธฐ

  • ์‚ฌ์šฉํ•˜์‹œ๋Š” ์„œ๋ฒ„์˜ ์šด์˜์ฒด์ œ์— ๋งž์ถฐ์„œ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • goapi-linux ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋˜๋ฉฐ, ๊ฐ€๊ธ‰์  tmux ๋‚˜ screen ๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ์„ธ์…˜ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด์„œ ์‹คํ–‰์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋ƒฅ ์‹คํ–‰ํ•˜์‹œ๋ฉด, ํ„ฐ๋ฏธ๋„์„ ๋‹ซ์œผ์‹ค ๊ฒฝ์šฐ TSBOARD์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋„ ๋ฐ”๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค!
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ, ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด ์ฃผ์…”์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: chmod +x ./goapi-linux ์ฒ˜๋Ÿผ์š”!

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

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 โ†’ npm install โ†’ ./goapi-linux ๊ณผ์ •๊นŒ์ง€ ๋ฌด์‚ฌํžˆ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€ ๋ด…์‹œ๋‹ค!
  • ์•„๋ž˜ ๋‹จ๊ณ„์—์„œ๋Š” 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 ํŒŒ์ผ์—์„œ๋Š” API_PORT ๊ฐ’์ด 3003์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฑธ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
# .env ํŒŒ์ผ์—์„œ๋„ GOAPI_PORT ๊ฐ’์ด 3003์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฑธ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
# (๋งŒ์•ฝ ํฌํŠธ ๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, API_PORT, GOAPI_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)
  }

  # v1.0.0๋ถ€ํ„ฐ ๊ธฐ์กด /tsapi ๊ฐ€ /goapi ๋กœ ๋ณ€๊ฒฝ๋จ (ํƒ€ ๋ฐฑ์—”๋“œ์™€ ์ถฉ๋Œ ๋ฐฉ์ง€)
  location /goapi {
    # tsboard.config.ts ์—์„œ PORT_PROD ๊ฐ’๊ณผ ์•„๋ž˜ 3003๊ณผ ๋™์ผํ•ด์•ผ ํ•จ
    proxy_pass http://127.0.0.1:3003/goapi;
    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_์„ค์น˜๊ฒฝ๋กœ_์˜ˆ์‹œ/dist
  ProxyRequests Off
  ProxyPreserveHost On
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>
  # tsboard.config.ts ์—์„œ PORT_PROD ๊ฐ’๊ณผ ์•„๋ž˜ 3003 ์ด ๋™์ผํ•ด์•ผ ํ•จ
  ProxyPass /goapi http://127.0.0.1:3003/goapi
  ProxyPassReverse /goapi http://127.0.0.1:3003/goapi
</VirtualHost>

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

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

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

TSBOARD ์„ค๋ช…

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

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

์ „์ฒด ๊ตฌ์กฐ

ํ”„๋ก ํŠธ์—”๋“œ : Vue, Vuetify, Tiptap, Pinia, Vue Router

  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” 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/goapi/seo/sitemap.xml ์ด๋ฉฐ, ์„ค์น˜ ์•ˆ๋‚ด์—์„œ tsboard.dev ๋ถ€๋ถ„์„ ๋ณธ์ธ์˜ ๋„๋ฉ”์ธ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค!
  • ์•„๋ž˜ sitemap.xml ์˜ˆ์‹œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

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

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

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

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

๋ฐฑ์—”๋“œ : Go, Fiber v3, go-mysql-driver, bimg

  • TSBOARD๋Š” v1.0๋ถ€ํ„ฐ Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ goapi ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด, ๋ฐฑ์—”๋“œ์—์„œ Bun๊ณผ ๊ฐ™์€ JS/TS ๋Ÿฐํƒ€์ž„์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ , ์–ด๋””์„œ๋‚˜ ๋™์ž‘ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
    • ๋˜ํ•œ ๋” ํšจ์œจ์ ์œผ๋กœ ์„œ๋ฒ„ ์ž์›์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•˜๊ณ , ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ๊นŒ์ง€์˜ ์ž์ฒด ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      • ๊ธฐ์กด Bun ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ๋ฅผ 100%๋กœ ๋†“๊ณ  ๋ณผ ๋•Œ, ๋™์ž‘ ์†๋„๋Š” 90% ~ 95% ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด DB ์ž…์ถœ๋ ฅ๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์„œ ์†๋„ ์ธก๋ฉด์—์„œ๋Š” ์˜คํžˆ๋ ค ๊ธฐ์กด Bun ๋Ÿฐํƒ€์ž„์ด ์šฐ์„ธํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ํŠœ๋‹์€ v1.0 ์ถœ์‹œ ํ›„ ์ง„ํ–‰ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
      • CPU ์‚ฌ์šฉ๋Ÿ‰์€ ๋™์‹œ ์ ‘์† 100๋ช… ์ด์ƒ ๊ธฐ์ค€์œผ๋กœ ์•ฝ 300%~500% ๊ฐ€๊นŒ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
      • ๋ฉ”๋ชจ๋ฆฌ๋Š” ์œ„ ๊ฒฝ์šฐ ์•ฝ 60% ~ 70% ์ˆ˜์ค€์ด๋ฉฐ, ๊ณ ๋ถ€ํ•˜ ์กฐ๊ฑด์ด ์•„๋‹ ๋•Œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์ผ์ด 20% ~ 30% ์ˆ˜์ค€๊นŒ์ง€ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

Go์–ธ์–ด๋กœ ์žฌ์ž‘์„ฑ๋œ ๋ฐฑ์—”๋“œ๋Š” https://github.com/sirini/goapi ์—์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” bimg๊ฐ€ libvips ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ์„œ๋ฒ„์— libvips ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์ „์— ์„ค์น˜ํ•ด ๋‘์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DB ํ…Œ์ด๋ธ”

  • 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์— ๊ฐ€ํ•ด์ง€๋Š” ๋ถ€๋‹ด์—†์ด ์—ฌ์ „ํžˆ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
# ์ „์ฒด ํ…Œ์ด๋ธ” ๋ชฉ๋ก์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. (`tsb_` ๋ถ€๋ถ„์€ ์„ค์น˜ ๋‹จ๊ณ„์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

+-----------------------+
| TSBOARD Table list    |
+-----------------------+
| tsb_board             |
| tsb_board_category    |
| tsb_chat              |
| tsb_comment           |
| tsb_comment_like      |
| tsb_exif              |
| tsb_file              |
| tsb_file_thumbnail    |
| tsb_group             |
| tsb_hashtag           |
| tsb_image             |
| tsb_image_description |
| tsb_notification      |
| tsb_point_history     |
| tsb_post              |
| tsb_post_hashtag      |
| tsb_post_like         |
| tsb_report            |
| tsb_user              |
| tsb_user_access_log   |
| tsb_user_black_list   |
| tsb_user_permission   |
| tsb_user_token        |
| tsb_user_verification |
+-----------------------+

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.z
    • ๋ธ”๋กœ๊ทธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ๊ฐœ์„  ์ž‘์—…์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
    • CSR ๋ฐฉ์‹ ๊ธฐ๋ฐ˜์—์„œ SEO๋ฅผ ์ข€ ๋” ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž‘์—…๋“ค์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • v1.0.0 (ํ˜„์žฌ)
    • ๋ฐฑ์—”๋“œ๋ฅผ Bun ๋Ÿฐํƒ€์ž„์—์„œ Go ์–ธ์–ด๋กœ ์žฌ์ž‘์„ฑํ•œ ์ž์ฒด ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • v1.0.z
    • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์•ˆ์ •์„ฑ ๋ฐ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•œ ํŠœ๋‹์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • v1.1.0
    • ๋” ๋‹ค์–‘ํ•œ ๊ฒŒ์‹œํŒ/๋ธ”๋กœ๊ทธ/๊ฐค๋Ÿฌ๋ฆฌ ํ…Œ๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • 1.2.0
    • ์‡ผํ•‘๋ชฐ ํ…Œ๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์žฌ๊ณ  ํ˜„ํ™ฉ/๊ด€๋ฆฌ ๋“ฑ๋„ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
    • ํ† ์Šค, ๋„ค์ด๋ฒ„ํŽ˜์ด์™€ ์—ฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  • 2.0.0
    • TBD

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

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

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

๊ถ๊ธˆํ•˜์‹  ์ ์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ https://tsboard.dev ์‚ฌ์ดํŠธ์— ์™€์ฃผ์„ธ์š”!