๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Side project

[ํ”Œ์ ๊ธฐ๋ก] PlanetScale branch ๋ณ€๊ฒฝ ๋ฐ deploy request (Prisma String์˜ default ๊ฐ’)

 

[ํ”Œ์ ๊ธฐ๋ก] Next.js + Prisma + PlanetScale ์„ธํŒ…ํ•˜๊ธฐ (Vercel ๋ฐฐํฌ)

์ด ๊ธ€์€ ๋‹จ์ˆœํžˆ ์„ธํŒ…๋งŒ์„ ์œ„ํ•œ ๊ธ€์ด์ง€ ๋‚ด๋ถ€์ ์ธ ๋กœ์ง์ด๋‚˜ ์Šคํ‚ค๋งˆ ๋“ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ „ํ˜€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ์–ด๋– ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์—ญ์‹œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. PlanetScale์˜ https://planetscal

birdmee.tistory.com

์ง€๋‚œ ์„ธํŒ…ํŽธ์—์„œ 8๋ฒˆ์— "promote ํ›„์— main ๋ธŒ๋žœ์น˜๋Š” production์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ๋˜๊ณ  main ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ์ง์ ‘์ ์ธ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์‚ผ์•„ ๋งŒ๋“ค์–ด ๋ณธ DB์—์„œ ์ด ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ž˜ ๋ชจ๋ฅด๊ณ  promoteํ•œ ์ƒํƒœ์—์„œ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•ด์„œ ์—๋Ÿฌ๋กœ ๋‹นํ™ฉํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. " ๋ผ๊ณ  ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋ฏธ ๋ธŒ๋žœ์น˜๋ฅผ promote๋ฅผ ํ–ˆ๋Š”๋ฐ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐœ๋‹จ์—์„œ๋Š” ์ด ๊ธ€์„ ์™œ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ์ง€ ์•Š์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

๋ฐœ๋‹จ

์ง€๋‚œ ํŽธ์—๋Š” ๋‹จ์ˆœํžˆ ์„ธํŒ…์„ ์œ„ํ•œ ๊ธ€์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ ์ƒ˜ํ”Œ๋กœ User ๋ชจ๋ธ๋งŒ ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Article์ด๋ผ๋Š” ๋ชจ๋ธ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์•„๋ž˜์— ์ผ๋ถ€ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ ๋ณด์—ฌ์ค€๋‹ค. 

title ํ•„๋“œ๋ฅผ varchar(255)๋กœ ์ œํ•œ์„ ๋‘์—ˆ๋‹ค. Prisma๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๋‚˜๋Š” content์— ์•„๋ฌด๊ฒƒ๋„ ์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ œํ•œ์„ ๋‘์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค...๐Ÿ˜ฌ ์ด ์ƒํƒœ๋กœ ์ด๋ฏธ promote๋ฅผ ํ•ด๋ฒ„๋ ธ๊ณ ... ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ ค๊ณ  Postman์„ ์‚ฌ์šฉํ•˜์—ฌ POST ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด๋‹ˆ content๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์™œ์ผ๊นŒ... ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ค๋ณด๋‹ˆ ์•„๋ž˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. (๋งํฌ)

Prisma Connector๋ณ„ String์˜ ๊ธฐ๋ณธ๊ฐ’

MySQL์˜ ๊ฒฝ์šฐ String ํƒ€์ž…์—์„œ default๋Š” varchar(191)์ด์—ˆ๊ณ  ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๊ธธ๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋œฌ ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด @db.Text๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  PlanetScale์˜ main ๋ธŒ๋žœ์น˜์—์„œ `npx prisma db push` ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ดˆ๋ฐ˜์— ์–ธ๊ธ‰ํ–ˆ๋˜ ์—๋Ÿฌ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋œฌ๋‹ค.  

 

ํ•ด๊ฒฐ

1. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๊ธฐ (CLI ํ˜น์€ GUI ๋ฐฉ์‹) 

์œ„์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด main ๋ธŒ๋žœ์น˜๋ฅผ ์ด๋ฏธ promoteํ–ˆ๋‹ค๋ฉด main ๋ธŒ๋žœ์น˜์—์„œ๋Š” ๋” ์ด์ƒ ์ง์ ‘์ ์œผ๋กœ DDL ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. Git์„ ์‚ฌ์šฉํ•ด๋ณด์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์ข€ ๋” ์ต์ˆ™ํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ์—ฌ๊ธฐ์„œ๋„ ๋“ฑ์žฅํ•œ๋‹ค. ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์œ„ํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. CLI / GUI ๋ฐฉ์‹ ์ค‘ ํŽธํ•œ ๋ฐฉ์‹ ํ•œ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋ฉด๋œ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด main ๋ธŒ๋žœ์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ์Šคํ‚ค๋งˆ๋งŒ ๋ณต์‚ฌ๋œ๋‹ค.

CLI๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

PlanetScale CLI๋กœ ์ƒ์„ฑํ•˜๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์ด PlanetScale ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธ ํ›„ ์ž์‹ ์ด ์ƒ์„ฑํ•œ DB๋ฅผ ์„ ํƒํ•ด ํ•ด๋‹น ๋Œ€์‹œ๋ณด๋“œ์—์„œ๋„ New Branch ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•ด์ฃผ๊ณ  ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

PlanetScale Dashboard์—์„œ ์ƒ์„ฑํ•˜๊ธฐ

 

2. ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋ธŒ๋žœ์น˜์™€ ์—ฐ๊ฒฐ

--port 3309๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ์ง€์ •ํ•ด์ค€ ์ด์œ ๋Š” ์ด์ „ ์ดˆ๊ธฐ ์„ธํŒ…๊ด€๋ จ ๊ธ€์—์„œ๋„ 3309์œผ๋กœ ์ •ํ•ด์ฃผ์—ˆ๊ณ  .env ํŒŒ์ผ์—๋„ 3309์œผ๋กœ DATABASE_URL๋กœ ์ €์žฅํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. --port ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๊ณ  .env ํŒŒ์ผ์—์„œ ํ•ด๋‹น ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์—ฐ๊ฒฐ์ด ์ž˜ ์ด๋ฃจ์–ด์กŒ๋‹ค๋ฉด ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ˜์†”์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

Prisma์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์— ๋ฐ์ดํ„ฐ ์‰ฝ๊ฒŒ ๋„ฃ๋Š” ๋ฐฉ๋ฒ• ํ™•์ธํ•˜๊ธฐ๐Ÿ‘‡

 

[ํ”Œ์ ๊ธฐ๋ก] Prisma Seeding ๐ŸŒฑ

์š”์ฆ˜ Prisma๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰์ค‘์ธ๋ฐ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ์ƒˆ๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋“ค์ด ๋งŽ๋‹ค. Seeding๋„ ๊ทธ ์ค‘ ํ•œ ๊ฐ€์ง€์ธ๋ฐ ํŠœํ† ๋ฆฌ์–ผ ๋™์˜์ƒ๊ณผ ๊ธ€๋“ค์„ ๋ณด๋‹ค๋ณด๋‹ˆ seeding, seed๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์ž์ฃผ

birdmee.tistory.com

 

3. ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ๋œ schema push ํ•˜๊ณ  ํ™•์ธํ•˜๊ธฐ

main ๋ธŒ๋žœ์น˜์— push ํ•˜๋˜ ๋ช…๋ น์–ด์™€ ๋™์ผํ•˜๋‹ค. 

์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Prisma Studio์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ฝ˜์†”์— ๋œจ๋Š” ์ฃผ์†Œ์—์„œ ์ ‘์†ํ•˜์—ฌ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋ณด๊ณ  ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ณผ ์ˆ˜ ๋„ ์žˆ๋‹ค. 

 

4. ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ main ๋ธŒ๋žœ์น˜์— deployํ•˜๊ธฐ

๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์„ production์—๋„ ์ ์šฉํ•˜๋ ค๋ฉด ์ด๋ฏธ promote๋œ main ๋ธŒ๋žœ์น˜์— deployํ•ด์•ผํ•œ๋‹ค. Git์—์„œ๋„ ๋‚ด๊ฐ€ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ์ž‘์—…ํ•˜๊ณ  mergeํ•˜๊ธฐ ์œ„ํ•ด pull request๋ฅผ ๋ณด๋‚ด๋“ฏ PlanetScale์—์„œ๋Š” deploy request๋ฅผ ํ•ด์•ผํ•œ๋‹ค. (์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ถ€๋ถ„์œผ๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๋Œ“๊ธ€๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒํ•œ๋‹ค.) ์ด ๊ณผ์ •์€ GUI๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค. (CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค. )

PlanetScale์˜ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ DB๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋“ค์–ด๊ฐ€ Branches ํƒญ์„ ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. 

์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด deploy request๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š”๋ฐ comments๋Š” ์„ ํƒ์‚ฌํ•ญ์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์•Œ์•„์„œ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ƒ๋žตํ•˜๊ณ  Create deploy request๋ฅผ ํด๋ฆญํ•œ๋‹ค. 

์•„๋ž˜์™€ ๊ฐ™์ด Deploy changes ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๋ฉด ๋ฌธ์ œ์—†์ด main ๋ธŒ๋žœ์น˜๋กœ deploy ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ALTER TABLE์„ ํด๋ฆญํ•ด๋ณด๋ฉด ์–ด๋–ค SQL์ด ์‹คํ–‰๋˜๋Š”์ง€๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

์•„๋ž˜์™€ ๊ฐ™์ด deploy๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

ํ˜ผ์ž ์ง„ํ–‰ํ•˜๋Š” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋กœ ํŒ€ ๊ณ„์ •์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ deploy request์—์„œ๋„ ๋ณ„๋„์˜ ์Šน์ธ ์ ˆ์ฐจ๊ฐ€ ์—†์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ํŒ€์ผ ๊ฒฝ์šฐ ํ”Œ๋กœ์šฐ๊ฐ€ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™๋‹ค. 

ํ˜น์‹œ ๋‚˜์ฒ˜๋Ÿผ ๋ธŒ๋žœ์น˜๋Š” ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ”๊พธ๋Š”์ง€, ์–ด๋–ป๊ฒŒ deployํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๋ชฐ๋ž๋˜ ๋ถ„/๋‹ต๋‹ตํ–ˆ๋˜ ๋ถ„๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. 

์ฐธ๊ณ ๋กœ ์ด ์œ ํŠœ๋ธŒ ๋™์˜์ƒ๋„ ์ฐธ ๋„์›€์ด ๋งŽ์ด ๋˜์—ˆ๋‹ค.