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

Docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ณ  NestJS + prisma ์—ฐ๋™ํ•˜๊ธฐ

by LasBe 2024. 10. 31.
๋ฐ˜์‘ํ˜•

๐Ÿ“’  Docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ณ  NestJS + prisma ์—ฐ๋™ํ•˜๊ธฐ


NestJS๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ์ฃผ๋กœ prisma์™€ postgresql์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค.

์™œ ์–ด๋– ํ•œ ํŠน์žฅ์ ์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ prisma์™€ PostgreSQL์˜ ์žฅ์ 

๐Ÿ”Ž prisma

Prisma๋Š” TypeScript์™€ JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ORM(Object-Relational Mapping) ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ„ํŽธํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

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

 

๐Ÿ”Ž PostgreSQL

PostgreSQL์€ ์˜คํ”ˆ ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์œผ๋กœ, ์•ˆ์ •์„ฑ, ํ™•์žฅ์„ฑ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์ค‘์‹œํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SQL ํ‘œ์ค€ ์ค€์ˆ˜ ์™ธ์—๋„ JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ณ ๊ธ‰ ์ฟผ๋ฆฌ ์ตœ์ ํ™”, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์„ ํฌํ•จํ•ด ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ๊นŒ์ง€ ํญ๋„“๊ฒŒ ์ง€์›ํ•˜์—ฌ RDBMS์™€ NoSQL์˜ ์žฅ์ ์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ€ํ‘œ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ MySQL๊ณผ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ PostgreSQL MySQL
์ฟผ๋ฆฌ ์ตœ์ ํ™” ๋ฐ ์„ฑ๋Šฅ 
๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ์ง€์›, ๊ณ ๊ธ‰ ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ(์œˆ๋„์šฐ ํ•จ์ˆ˜, CTE ๋“ฑ) ๋‹จ์ˆœ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ๋›ฐ์–ด๋‚œ ์ฝ๊ธฐ ์„ฑ๋Šฅ, ๋ณต์žกํ•œ ํŠธ๋žœ์žญ์…˜ ์ตœ์ ํ™”๋Š” ์ œํ•œ์ 
์•„ํ‚คํ…์ฒ˜ ๊ฐ์ฒด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ACID ํŠธ๋žœ์žญ์…˜ ์ค€์ˆ˜, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ๋ณต์žกํ•œ ๊ด€๊ณ„ ํ‘œํ˜„ ๊ฐ€๋Šฅ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋†’์€ ์„ฑ๋Šฅ๊ณผ ๊ฐ€์šฉ์„ฑ ์ œ๊ณต, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ
๋ฐ์ดํ„ฐ ํƒ€์ž… JSON, JSONB, ๋ฐฐ์—ด, ๋ฒ”์œ„ ๋“ฑ ๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์› JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์›ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์€ PostgreSQL๋ณด๋‹ค ์ œํ•œ์ 
ํ™•์žฅ์„ฑ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜, ์ž๋ฃŒํ˜• ํ™•์žฅ ๊ฐ€๋Šฅ, ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ํŠธ๋ฆฌ๊ฑฐ์™€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๊ฐ„ํŽธํ•œ ์Šค์ผ€์ผ๋ง ์ง€์›, ๋‹ค์–‘ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์„ ํƒ ๊ฐ€๋Šฅ(InnoDB, MyISAM ๋“ฑ) 
๋ณต์ œ ๋ฐ ๊ณ ๊ฐ€์šฉ์„ฑ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ ๋…ผ๋ฆฌ์  ๋ณต์ œ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ ์ง€์›, ๊ณ ๊ธ‰ ๋ณต์ œ ๊ธฐ๋Šฅ ์ œ๊ณต ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๋ณต์ œ ์ง€์›, ๋‹ค์ค‘ ๋ฆฌ๋” ์„ค์ • ๊ฐ€๋Šฅ, ๋น„๋™๊ธฐ ๋ณต์ œ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚จ

 

๐Ÿ“Œ docker๋กœ PostgreSQL ์„ค์น˜ํ•˜๊ธฐ

๐Ÿ”Ž ์ด๋ฏธ์ง€ pull

$ docker pull postgres:17

pull ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์ค๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ตœ์‹ ๋ฒ„์ „์ด 17์ด๋ผ ๋ฒ„์ „์„ ์ง์ ‘ ๋ช…์‹œํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”Ž ์ปจํ…Œ์ด๋„ˆ ์˜ฌ๋ฆฌ๊ธฐ

$ docker run -d --restart=always \
  --name postgres-db \
  -e POSTGRES_PASSWORD=your_password \
  -e POSTGRES_DB=your_db_name \
  -p 5432:5432 \
  -v /path/to/local/data:/var/lib/postgresql/data \
  postgres

์ฃผ์š” ์˜ต์…˜์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • -d: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ 
  • --restart=always: ์ปจํ…Œ์ด๋„ˆ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘
  • --name: ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์ง€์ • 
  • -e POSTGRES_PASSWORD: PostgreSQL ๋ฃจํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • 
  • -e POSTGRES_DB: ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ ์„ค์ • 
  • -p 5432:5432: ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ๋งคํ•‘ 
  • -v: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ ์•„๊ฐ”์„ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ๋ณผ๋ฅจ ์„ค์ •

๊ฐœ์ธ ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ผ์ด์–ธํŠธ๋กœ ์—ฐ๊ฒฐํ•ด ๋ณด๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„ค์š”.

 

๐Ÿ“Œ prisma ์„ค์น˜ ๋ฐ PostgreSQL ์—ฐ๋™

๐Ÿ”Ž ์„ค์น˜

$ npm i @prisma/client
$ npm i -D prisma

๊ฐœ๋ฐœ ์˜์กด์„ฑ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— prisma ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค.

 

๐Ÿ”Ž ์ดˆ๊ธฐํ™”

$ npx prisma init

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— prisma ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ทธ ์•ˆ์— schema.prisma ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

schema.prisma ํŒŒ์ผ์€ Prisma์˜ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

 

๋” ํŽธํ•˜๊ฒŒ ํŒŒ์ผ์„ ํ™•์ธ ๋ฐ ์ž‘์„ฑํ•˜๊ณ  ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ Extension์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.

 

๐Ÿ”Ž env ํŒŒ์ผ์— DB ์ •๋ณด ์ž…๋ ฅ

# .env ํŒŒ์ผ

DATABASE_URL="postgresql://[username]:[password]@[์„œ๋ฒ„_์ฃผ์†Œ]:5432/[DB_name]"

 

์ž์‹ ์ด ์ƒ์„ฑํ•œ ๋Œ€๋กœ ์ž˜ ์ž…๋ ฅํ•ด ์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์œ ์ €๋Š” root๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹จ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”Ž ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

prisma/schema.prisma์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ •์˜ํ•œ ํ…Œ์ด๋ธ”์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

$ npx prisma migrate dev

 

prisma migrate ๋ช…๋ น์–ด๋Š” Prisma์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์–ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์ ์šฉํ•˜์—ฌ Prisma ์Šคํ‚ค๋งˆ์™€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ๋„์™€์ค๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์  ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์„ฑ๊ณตํ•œ๋‹ค๋ฉด migration ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ  DB์—๋„ ์ž˜ ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ NestJS ๋‹ค๋ฅธ ๊ธ€

[NestJS] - NestJS ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ๊ตฌ์กฐ์˜ ์ดํ•ด

 

NestJS ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ๊ตฌ์กฐ์˜ ์ดํ•ด

๐Ÿ“’ NestJS ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๊ณผ ๊ตฌ์กฐ์˜ ์ดํ•ด์ง€๊ธˆ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ด์ง€๋งŒ ํ•ญ์ƒ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋„ ํ•จ๊ป˜ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ง€๋‹ˆ๊ณ  ์‚ด์•˜์Šต๋‹ˆ๋‹ค.๋‚˜์ค‘์— ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์œผ๋ฉด ํ˜ผ์ž์„œ ์˜ค๋กฏ์ด ์„ค๊ณ„ํ•˜

lasbe.tistory.com

 

NestJS์™€ prisma๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ

 

NestJS์™€ prisma๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ

๐Ÿ“’ NestJS๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ CRUD ๊ตฌํ˜„ํ•˜๊ธฐ์š”์ฆ˜ NestJS๋ฅผ ์กฐ๊ธˆ์”ฉ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ง„๋„๋ฅผ ๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜๋ก "์ •๋ง ํŽธ๋ฆฌํ•˜๋‹ค"๊ณ  ๋Š๋ผ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ NestJS์™€ prisma๋กœ CRUD api๋ฅผ ๊ตฌ

lasbe.tistory.com

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ