์ด ๊ธ์ ๋จ์ํ ์ธํ ๋ง์ ์ํ ๊ธ์ด์ง ๋ด๋ถ์ ์ธ ๋ก์ง์ด๋ ์คํค๋ง ๋ฑ์ ๋ํ ์ค๋ช ์ด ์ ํ ํฌํจ๋์ด ์์ง ์์ผ๋ฉฐ, ์ด๋ ํ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ๊ธฐ๋ฅ ๊ตฌํ ์ญ์ ๋ค๋ฃจ์ง ์๋๋ค.
PlanetScale์ https://planetscale.com/blog/how-to-setup-next-js-with-prisma-and-planetscale ๊ธ์ ๊ธฐ์ดํ ๋ด์ฉ์ด๋ฉฐ ํด๋น ๊ธ์ ๋์์ ๋ฒ์ (๋งํฌ) ๋ ์ฐธ์กฐํ๋ค.
1. PlanetScale ๊ฐ์
/ ๋ก๊ทธ์ธ ํ Create New Database๋ฅผ ํตํด์ ์๋ก์ด DB ์์ฑ
Organization ๋ณ๋ก 1๊ฐ์ DB๊ฐ ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ค. ๋ง์ฝ ์ด๋ฏธ 1๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์๋ก์ด organization์ ์์ฑํ ํ์ DB๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๋ด๊ฐ ์ค์ ํ๊ณ ์ ํ๋ DB์ ์ด๋ฆ์ blog์ด๊ณ ํํ ๋ฆฌ์ผ์ ๋ค์ ๋ Region์ ๊ฒฝ์ฐ latency ๋๋ฌธ์ ๊ฐ๊น์ด ๊ณณ์ผ๋ก ์ค์ ํ๋ผ๊ณ ํด์ Tokyo๋ก ์ค์ ํ์๋ค.
์์ฑ ์๋ฃ๋๋ฉด ๋์๋ณด๋๊ฐ ๋ฌ๋ค.
PlanetScale CLI๊ฐ ์ค์น๋์ด์๋ค๋ฉด(OS๋ณ ์ค์น ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์ ํ์ธ) ๋ช ๋ น์ด๋ฅผ ํตํด์๋ DB์์ฑ์ด ๊ฐ๋ฅํ๋ค. ๊ธฐ๋ณธ ๋ธ๋์น๋ก main ๋ธ๋์น๊ฐ ์์ฑ๋๋ค.
2. Next.js ํ๋ก์ ํธ ์์ฑ
3. TailwindCSS ์ค์น
๋จผ์ 2๋ฒ์์ ์์ฑํ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ ๋ค์ ํน์ ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ ์ด ์ฌ์ฉํ๋ ์ฝ๋ ์๋ํฐ์์ ์ด์ด์ค ํ ์๋์ ๋ช ๋ น์ด๋ฅผ ํ๋์ฉ ์ ๋ ฅํ์ฌ TailwindCSS๋ฅผ ์ค์นํ๋ค.
4. Prisma ์ค์น
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด Prisma๋ฅผ ์ค์นํ๋ค.
5. Prisma ์ค์
.envํ์ผ์์ DATABASE_URL์ ์๋์ ๊ฐ์ด ์์ ์ด ์์ฑํ PlanetScale DB ์ด๋ฆ์ ๋ฃ์ด ์์ ํ๋ค.
6. Prisma Client ์ค์
prisma > schema.prisma ํ์ผ์์ client์ datasource๋ฅผ ์
๋ฐ์ดํธ ํด์ค๋ค.
generator client์ datasource db๋ ์๋์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ๋๋ค.
PlanetScale์ ์ธ๋ํค ์ ์ฝ์กฐ๊ฑด์ ์ง์ํ์ง ์๊ณ Prisma๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ด๊ณ ํํ ์ ์ธ๋ํค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ PlanetScale๊ณผ Prisma๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ `referentialIntegrity` ์์ฑ์ ๋ํด ์ค์ ์ ํด์ฃผ์ด์ผ ํ๋ค๊ณ ํ๋ค.
Because PlanetScale doesn’t support foreign key constraints and Prisma defaults to using foreign keys to express relations, we need to set this referentialIntegrity property when using Prisma with PlanetScale.
“Referential integrity is a property of a data set that states that all its references are valid. Referential integrity requires that if one record references another, then the referenced record must exist. For example, if a Post model defines an author, then the author must also exist.“ (Source: Prisma docs)
model ๋ถ๋ถ์ ์ํ๋ก ์์ ์ด ํ์ํ ํญ๋ชฉ๊ณผ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
7. ๋ก์ปฌ์์ ๋๋ ค๋ณด๊ธฐ
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์์ ์๋์ ๋ช
๋ น์ด๋ฅผ ์คํ์์ผ ๊ธฐ๋ณธ ๋ธ๋์น์ธ main ๋ธ๋์น๋ฅผ ๋ก์ปฌ์ 3309 ํฌํธ์ ์ฐ๊ฒฐํ๋ค. ๊ผญ 3309 ํฌํธ์ผ ํ์๋ ์๋ค.
(๋ง์ผ 1๋ฒ์์ ์๋ก์ด organization์ ์์ฑํ๊ณ DB๋ฅผ ์์ฑํ์๋ค๋ฉด, ์๋ง pscale์ด ์ด์ organization์ ์ฐ๊ฒฐ๋์ด ์์ ๊ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋จผ์ `pscale org switch YOUR-ORGANIZATION-NAME-HERE`์ ์
๋ ฅํ์ฌ ํ์ฌ ์ฐ๊ฒฐํ DB๊ฐ ์๋ organization์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค. )
PlanetScale์ ์คํค๋ง๋ฅผ schema.prisma์ ํ์ผ์ ๋ง์ถ๊ธฐ ์ํด ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
schema.prisma์ ์์ฑํ ๋ด์ฉ์ด PlanetScale ์คํค๋ง์ ์ ๋ฐ์์ด ๋์๋๊ฐ๋ ์๋์ ๋ช ๋ น์ด๋ก ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
์์์ ์์ฑํ model์ด ์ ์์ฑ๋ ๊ฒ์ ์๋์ ๊ฐ์ด ํ์ธํ ์ ์๋ค. (command: describe YOUR-MODEL-NAME; -- query๋ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋๋ด๊ธฐ!)
8. main ๋ธ๋์น๋ฅผ production์ผ๋ก promoteํ๊ธฐ
PlanetScale์ ๋ธ๋์น์ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์ข๋ค.
๋ธ๋์น์ ๋ ์ข ๋ฅ์ ๋ํด ์ค๋ช ํ ๋ด์ฉ์ ๊ฐ์ ธ์์ ๋ฒ์ญํด๋ณด์๋ฉด (๋๋ณด๊ธฐ์์ ํ์ธ)
PlanetScale provides two types of database branches:
- Development branches — Development branches provide isolated copies of your production database schema where you can make changes, experiment, or run CI. Note, only the schema is copied, not the data.
- Production branches — Production branches are highly available databases intended for production traffic. They are protected from direct schema changes by default and include automated daily backups. To make a change to a production branch, you must create a deploy request.
PlanetScale์ ๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ธ๋์น๋ฅผ ์ ๊ณตํ๋ค:
- ๊ฐ๋ฐ(Development) ๋ธ๋์น — ๊ฐ๋ฐ ๋ธ๋์น๋ ๋ณ๊ฒฝ, ์คํ ํน์ CI๋ฅผ ์คํํ ์ ์๋ ์ด์(production) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ์ ๊ณตํ๋ค. ์คํค๋ง๋ง ๋ณต์ฌ๋๋ ๊ฒ์ด์ง ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋๋ ๊ฒ์ ์๋์ ์ ์ํ๋ผ.
- ์ด์(Production) ๋ธ๋์น — ์ด์ ๋ธ๋์น๋ ์ด์ ํธ๋ํฝ์ ์ํ ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค. ์ด์ ๋ธ๋์น๋ ์ง์ ์ ์ธ ์คํค๋ง ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณดํธ๋ฐ์ผ๋ฉฐ ์๋ํ๋ ์ผ์ผ ๋ฐฑ์ ์ด ํฌํจ๋์ด์๋ค. ์ด์ ๋ธ๋์น์ ์์ ์ฌํญ์ด ์๊ธฐ๋ฉด ๋ฐฐํฌ ์์ฒญ(deploy request)์ ์์ฑํด์ผํ๋ค.
์๋์ ๋ช ๋ น์ด๋ก main ๋ธ๋์น๋ฅผ promoteํ ์ ์๋ค. promote ํ์ main ๋ธ๋์น๋ production์ ์ํ ๋ธ๋์น๊ฐ ๋๊ณ main ๋ธ๋์น์ ๋ํด ์ง์ ์ ์ธ ์คํค๋ง ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด ๊ธ์ ์์ฑํ๊ธฐ ์ ์ ํ ์คํธ ์ผ์ ๋ง๋ค์ด ๋ณธ DB์์ ์ด ๋ธ๋์น์ ๋ํ ๊ฐ๋ ์ ์ ๋ชจ๋ฅด๊ณ promoteํ ์ํ์์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํด์ ์๋ฌ๋ก ๋นํฉํ๋ ์ ์ด ์๋ค.
์ด ๊ธ์์๋ ์ฐ์ ๊ธฐ๋ณธ ์ค์ ์ ๋ง์น๊ณ ๋ฐฐํฌํ๋ ๊ฒ์ ์์๋ฅผ ๋๊ธฐ ๋๋ฌธ์ ํน๋ณํ ๊ตฌํํด๋์ ๋ด์ฉ์ด ์์ด main ๋ธ๋์น๋ฅผ promoteํ์ง ์๊ณ ๋ฐฐํฌํ๋ค. ํ์ง๋ง promote ํ๋ ค๋ฉด ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
๋ง์ผ ๋ธ๋์น๋ฅผ promote ํ๋๋ฐ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ค๋ฉด? ํด๊ฒฐ๋ฐฉ๋ฒ์ ์๋์ ๊ธ์ ํตํด ํ์ธํ ์ ์๋ค๐
9. Production์ผ๋ก ๋ฐฐํฌํ๊ธฐ
์ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ PlanetScale๋ก ์ ์ํ์ฌ ์์ ์ด ๋ง๋ DB ํ๋ก์ ํธ ๋์๋ณด๋๋ฅผ ๋ณด๋ฉด Connect ๋ฒํผ์ด ๋ณด์ธ๋ค. ํด๋ฆญํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ณด์ธ๋ค.
Connect with์์ Prisma๋ฅผ ์ ํํ๊ณ ๊ทธ๋ผ Database authentication credentials์ Username๊ณผ Password๊ฐ ๋ณด์ฌ์ง๊ณ .env์ DATABASE_URL์ด ๋ณด์ฌ์ง๋ค. ๋ฐฐํฌ ์์ ํ๊ฒฝ๋ณ์๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ ๋ฉ๋ชจํด๋๋ค.
์ฌ๊ธฐ๊น์ง ์๋ฃ ํ์ GitHub ์ฝ๋์ ์ฅ์์ commit ํ push ํด์ฃผ์๋ค.
๋ฐฐํฌ๋ ์์ ์ด ํธํ ๊ณณ์ผ๋ก ์ ํํ ์ ์๋ค. ์ด ๊ธ์์๋ Vercel์ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๋ค.
Vercel ์ฌ์ดํธ์์ ๊ฐ์ / ๋ก๊ทธ์ธ ์งํ ํ New Project๋ฅผ ํตํด GitHub์ ์๋ ์ฝ๋์ ์ฅ์๋ฅผ import ํด์ฃผ๋๋ฐ ์ฌ๊ธฐ์ ์ด๋ฏธ ์ฝ๋์ ์ฅ์ ์ ์ฒด๊ฐ ๋ณด์ด๋๋ก ๊ถํ ์ค์ ์ ํด๋ ๋ถ๋ค์ ๋ฌธ์ ์๊ฒ ์ง๋ง ์๋ฌ๊ฐ ๋จ๊ฑฐ๋ ๋ฐฐํฌํ๊ณ ์ํ๋ ์ฝ๋์ ์ฅ์๊ฐ ๋ณด์ด์ง ์๋ ๊ฒฝ์ฐ์๋ GitHub์์ ๊ถํ์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ ๋ถ๋ถ๊น์ง๋ ๋ค๋ฃจ์ง ์๋๋ค. ํ๋ก์ ํธ(์ฝ๋์ ์ฅ์)๋ฅผ ์ ํํ๊ณ Import๋ฅผ ๋๋ฌ์ฃผ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ฌ๋ค.
์ฌ๊ธฐ์ ์ถ๊ฐํด์ฃผ์ด์ผํ ๋ถ๋ถ์ Environment Variables์ด๋ค. ๋ฐ๋ก ์ ๋จ๊ณ์์ ๋ฉ๋ชจํด๋ ํน์ ๋ณต์ฌํด๋ DATABASE_URL์ ๊ฐ์ ํ๊ฒฝ ๋ณ์๋ก ์ ์ฅํด์ค๋ค. ์ถ๊ฐ ํ Add๋ฅผ ๋๋ฅด๋๋ฐ ๊ฐ์๋ ๋ฐ์ดํ๋ฅผ ์ ๊ฑฐ ํ ๋ฃ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ Deploy ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋ฃ!
'Side project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ ๊ธฐ๋ก] Prisma Seeding ๐ฑ (0) | 2022.05.09 |
---|---|
[ํ์ ๊ธฐ๋ก] PlanetScale branch ๋ณ๊ฒฝ ๋ฐ deploy request (Prisma String์ default ๊ฐ) (0) | 2022.05.08 |
[ํ์ ๊ณํ] ์๋ก์ด ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด์ (0) | 2022.04.29 |
[ํ์ ๊ธฐ๋ก] ๋ด์ค๋ ํฐ ๋ชจ์ ์ฌ์ดํธ NEWใปLEใปKA (0) | 2021.08.10 |
[์ฝ์ง๋ก๊ทธ] Next.js(Vercel) + Strapi(Heroku) 504 ์๋ฌ ๋์ฒ (4) | 2021.07.11 |