| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- express.js 환경 셋팅
- 웹기초
- 성공에 대한 거짓말
- HTML
- 카뷰 수익 인증
- 위드굿즈 굿즈샵
- Git 팀 작업
- 카카오뷰 부업
- 30일 글쓰기
- 책 원씽
- 위드굿즈
- git 협업하기
- 카카오뷰 성장
- 도서 원씽
- 카카오뷰 초보
- CSS
- 카카오뷰 온라인 수익화
- Axios 라이브러리
- 이석증
- 성공비법
- 실시간 통신
- 카카오뷰 수익
- 카카오뷰N잡
- 자기관리
- ppt 다이어그램
- 엑셀 프린트하기
- 원씽
- 엑셀 기초 함수
- ppt 도형 색
- 카카오뷰 탭이동
- Today
- Total
김데이의 개발공부
[ TIL ] Day 20 - 관계형 데이터베이스 / Postgres 사용하기 본문
[ 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' });
}
});

- 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
전체 작업 순서
- 기본 셋팅 : npx prisma init 또는 npx prisma init --datasource-provider postgresql
- schema.prisma 파일 : generator client / datasource db 셋팅
- .env 파일 : DATABASE_URL 의 정보 수정 - schema.prisma 파일에서 data modeling(model, enum 선언)
→ 저장 후 마이그레이션 진행 : npx prisma migrate dev
⇒ data model이 수정되면 꼭 마이그레이션 작업을 해야 함!! - 시딩 작업 : npx prisma db seed
- prisma 폴더에 mock.js / seed.js 파일 만들기
- data model과 mock 파일의 데이터 명칭/타입이 맞지 않은 경우 오류 생길 수 있음
- 파일을 다 만들었다면 터미널에서 명령어로 시딩 작업 진행 - model 값 데이터 검증 셋팅
- 코드 작업 : npm run dev + .http 파일 사용
+ DB를 보기 좋은 UI로 표기 : npx prisma studio
📃 내일은 뭘 배울까 🤔
- Prisma 기능/문법 익히기 : 관계형 @relation / Transaction
'코드잇 Node.js(BE) 부트 캠프 > TIL (Today I Learn) 📑' 카테고리의 다른 글
| [ TIL ] Day 22 - Express 미들웨어 / 라우트 / Multer(파일 업로드) (0) | 2025.10.27 |
|---|---|
| [ TIL ] Day 21 - 관계형 데이터베이스 / Postgres 사용하기 2 (0) | 2025.10.24 |
| [ TIL ] Day 19 - DB 기초이론 & ER모델 / 관계형 데이터베이스(Postgres)와 서버 (0) | 2025.10.22 |
| [ TIL ] Day 18 - 💡드디어 데이터 베이스와 ORM / MongoDB & Mongoose / 서비스 배포하기! ✨🖥️🌐 (0) | 2025.10.21 |
| [ TIL ] Day 17 - Node.js / Express.js 초기 셋팅하기 📖 (왕 초보 기초!) (0) | 2025.10.20 |