김데이의 개발공부

[ TIL ] Day 20 - 관계형 데이터베이스 / Postgres 사용하기 본문

코드잇 Node.js(BE) 부트 캠프/TIL (Today I Learn) 📑

[ TIL ] Day 20 - 관계형 데이터베이스 / Postgres 사용하기

theday365 2025. 10. 23. 20:52
반응형

🗓️ 수업 일자 : 2025.10.23

✨ 오늘의 수업 평가 :  [ GOOD ]  🔥🫠🔥 열정열정열정🔥🫠🔥

   

   데이터 베이스의 여러 기능을 배우면 어려울거라고 살짝 겁먹었는데,

   배우면 배울수록 너어어어어무 재밌고, 너어어어어어무 신기할따름!!

   오늘 배운 관계형 작업은 내일 한번 더 정리해서 올려야겠다 :)

 

📝  오늘 배운 내용  

- Prisma를 이용한 CRUD 작업

- 여러 ORM 기능/문법 익히기

 


1. Prisma를 이용한 CRUD 작업

- Create : POST 요청

// POST : 정보 저장하기
app.post('/products', async (req, res) => {
  const data = req.body;
  const product = await prisma.product.create({
    data,
  });

  if (product) {
    res.send(product);
  } else {
    res.status(404).send({ message: 'Cannot find given id' });
  }
});

 

 

- Read : GET 요청

// GET : 목록 가져오기
app.get('/products', async (req, res) => {

  // 가져오는 갯수 설정이 없는 경우
  const product = await prisma.product.findMany();

  // 가져오는 갯수 설정이 있는 경우
  const count = Number(req.query.count) || 10;
  const product = await prisma.product.findMany({
    take: count,
  });

  res.send(product);
});

// GET : id를 이용하여 단일 정보 가져오기
app.get('/products/:id', async (req, res) => {
  const id = req.params.id;
  const product = await prisma.product.findUnique({
    where: { id },
  });

  if (product) {
    res.send(product);
  } else {
    res.status(404).send({ message: 'cannot find' });
  }
});

GET - Count 이용해서 일부 데이터만 가지고 오기!
GET - Count 이용해서 일부 데이터만 가지고 오기!

 

 

- Update : PATCH 요청

// PATCH : Id로 수정할 정보를 찾고(where:{id}) 변경된 데이터(data)를 넣기
app.patch('/products/:id', async (req, res) => {
  const id = req.params.id;
  const data = req.body;
  const product = await prisma.product.update({
    where: { id },
    data,
  });

  if (product) {
    res.send(product);
  } else {
    res.status(404).send({ message: 'cannot find' });
  }
});

 

 

- Delete : DELETE 요청

// DELETE : id를 사용해 정보를 찾고(where:{id}) 삭제 진행
app.delete('/products/:id', async (req, res) => {
  const id = req.params.id;
  const product = await prisma.product.delete({
    where: { id },
  });

  if (product) {
    res.send(product);
  } else {
    res.status(404).send({ message: 'cannot find' });
  }
});

 

 

 

2. 여러 ORM 기능 / 문법 익히기

Prisma 시딩

 - 데이터 베이스에 초기 데이터를 넣는( = 데이터를 심다) 과정

 

 [작업 방법]

   1) prisma 폴더 안에 mock.js를 만들고 그 안에 초기 데이터를 객체로 저장한다

   2) 동일하게 prisma 폴더 안에 seed.js 를 만들고,
       (DB 안에 혹시 있을)기존 데이터를 삭제 한 뒤 신규 데이터를 삽입하는 구문을 작성 (with 비동기)

[seed.js 파일]

import { PrismaClient } from '@prisma/client';
import { PRODUCTS } from './mock.js';

const prisma = new PrismaClient();

async function main() {

  // 기존 데이터 삭제
  await prisma.products.deleteMany();
  // deleteMany() : where 속성을 넣지 않고 명령하면 저장된 모든 데이터를 지움

  // Mock 데이터 삽입
  await prisma.products.createMany({
    data: PRODUCTS,
    // 전송 할 데이터를 data 값으로 넣어줌
    skipDuplicates: true,
    // 데이터 삽입 작업 시 uuid 기준으로 중복 데이터가 있을 경우 Skip 하라는 옵션 명령어
  });
}

main()
  .then(async () => {
  
    // 입력 과정이 끝나면, $disconnect를 사용하여 서버와의 연결을 종료시킴
    await prisma.$disconnect();
  })
  .catch(async (e) => {
  
    console.log(e); // 1. 에러를 출력하고
    await prisma.$disconnect(); // 2. 서버와의 연결을 종료 한 뒤
    process.exit(1); // 3. seed.js 프로세서도 종료
    
    // process = 현재 작업중인 seed.js 자체를 의미
    // process.exit = seed.js 를 종료시킴
    
  });

   

3) package.json 파일에서 "prisma"를 정의 

[ package.json 파일 내부에 정의 ] 
 ...
"prisma": {
    "seed": "node prisma/seed.js"
  }
...

 

4) 터미널 창에서 명령어 입력하여 [ 데이터 삽입 = 시딩 ] 진행 : npx prisma db seed

귀여운 새싹 이모지와 함께 시딩 작업 완료! :)
귀여운 새싹 이모지와 함께 시딩 작업 완료! :) 🌱

 

 

 

데이터 검증 작업, Validation with Superstruct

 - 별도의 파일을 만들고 , 그곳에서 데이터를 검증한 뒤 다시 메인 파일로 데이터를 받아 사용하는 방식으로 작업 진행
 - 파일에 "superstruct" 를 import해서 사용
 - is-email / is-uuid 등 유효성 검사를 도와주는 라이브러리/메서드 들이 있음
 - 하나의 model에 Create 버전을 만들고, 그것을 옵셔널하게 바꿔서 Update 버전을 만들어 사용 

 - 관계성 필드 또한 함께 작성하여 사용 

 - 원시형 데이터 필드의 경우 바로 값을 확인하지만, 참조형인 경우 object()/array()로 선언해서 해당 메서드 내부에서 검토

// CreateUser : 데이터 등록 = 사용자가 입력 할 값을 모두 검사하여 객체로 내보냄
export const CreateUser = s.object({
  email: s.define('Email', isEmail),  
  name: s.size(s.string(), 1, 30),
  age: s.min(s.integer(), 20),
  address: s.string(),
  userPreference: s.object({
    receiveEmail: s.boolean(),
  }),
});

// UpdateUser : 데이터 수정 = 검사 할 때 수정한 내용만 찾아서(=옵셔널) 검사 할 수 있도록 셋팅
export const UpdateUser = s.partial(CreateUser);


// s.define() : 내부에 특정 함수를 써서 값을 검사함. 
// s.size() : 문자,숫자 등의 데이터가 사용자가 정한 숫자 내의 길의를 가지고 있는지 확인
// s.min() : 숫자의 형태(정수, 숫자 전체 등)와 최소값에 대해 정함
// s.string() : 문자열 데이터만 입력 가능
// s.object({}) : 객체 형태로 값 전달
// s.boolean() : true / false 값 중 하나만 사용 가능

 

 

 

 

UUID (Universally Unique Identifier)

- 전역적으로 고유하지 않을 수는 있지만, 중복 가능성이 거의 없는 ID를 생성(100%는 아니지만 거의 유니크한)

- UUID는 정규적으로 "하이픈으로 구분된 5개의 16진수 문자열 형식"으로 36자 문자열로 표기됨

- UUID를 생성 해 주는 사이트 : https://www.uuidgenerator.net/

 

Online UUID Generator Tool

Online UUID Generator Your Version 4 UUID: da56eca2-e892-471a-b0ff-f25586b95d8f Copy Refresh page to generate another.

www.uuidgenerator.net

 

 

 

 

 

 

전체 작업 순서 

  1. 기본 셋팅 : npx prisma init 또는 npx prisma init --datasource-provider postgresql
    - schema.prisma 파일 : generator client / datasource db 셋팅 
    - .env 파일 : DATABASE_URL 의 정보 수정 

  2. schema.prisma 파일에서 data modeling(model, enum 선언) 
        → 저장 후 마이그레이션 진행 : npx prisma migrate dev
        ⇒ data model이 수정되면 꼭 마이그레이션 작업을 해야 함!!

  3. 시딩 작업 : npx prisma db seed
    - prisma 폴더에 mock.js / seed.js 파일 만들기 
    - data model과 mock 파일의 데이터 명칭/타입이 맞지 않은 경우 오류 생길 수 있음 
    - 파일을 다 만들었다면 터미널에서 명령어로 시딩 작업 진행  

  4. model 값 데이터 검증 셋팅

  5. 코드 작업 : npm run dev + .http 파일 사용

 

    + DB를 보기 좋은 UI로 표기 : npx prisma studio

 

 


 

📃 내일은 뭘 배울까 🤔

- Prisma 기능/문법 익히기 : 관계형 @relation / Transaction

반응형