Prisma로 연결되어 있는 데이터베이스의 테이블들을 쉽게 접근할 수 있게 해주는 client 역할을 한다. 쉽게 생각하면, prisma를 편리하게 사용할 수 있게끔 만드는 라이브러리다. 이것을 사용하게 되면 prisma.schema파일에서 정의한 테이블이나 칼럼의 이름을 직접 사용할 수 있게 된다. Prisma.tablename과 같은 방식으로 접근할 수 있다.
npm install @prisma/client --save
설치를 하면 prisma generate라는 명령어도 함께 실행되기 때문에 prisma.schema 파일을 읽어서 모델 형태에 맞는 client를 생성한다. 따라서 파일을 변경하면 명령어를 다시 실행해야 client에 반영된다. client사용시 아래와 같이 작성한다.
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
prisma client까지 설치했다면, prisma에서 데이터를 생성하거나 데이터를 읽는 기능을 만들어보자. prisma의 메서드를 사용하여 구현하거나 sql문을 직접 사용할 수도 있다.
//create
app.post('/categories', async (req, res) => {
const category = await prisma.category.create({
data: {
name: '천국 가는 음료',
},
});
res.json(category);
});
//read
app.get('/products', async (req, res) => {
const products = await prisma.drink.findMany();
res.json(products);
});
[비동기 처리]
자바스크립트는 원래 순서대로 처리된다. 하지만 한 줄의 코드가 너무 오래 걸리면 밑에 있는 코드들이 동작할 수 없다. 따라서 오래 걸릴만한 코드를 잠시 다른 곳이 빼두고 빠르게 처리할 수 있는 코드부터 실행하고 빼둔 코드들을 가져와서 다시 실행한다. 즉, 비동기적으로 실행하게 한다.
오래 걸리는 작업 중 대표적인 것은 Database와 통신하는 것이다. DB도 결국 서버고, 서버와 서버간 연결(통신)은 오래 걸리기 때문에 보통 비동기적으로 실행된다. fetch함수가 비동기인 것을 생각하면 된다.
[async & await]
요청한 자료를 반환해야할 때 함수 내의 로직이 끝날 때 까지 기다린 다음에 데이터를 반환해야 요청받은 데이터를 모두 반환할 수 있다. 따라서 await을 사용해야 한다.
메서드는 ORM마다 다르기 때문에 sql문을 사용하여 코드 작성을 연습해보자. 백틱과 ;
사용에 주의하자.
//create
app.post('/categories', async (req, res) => {
await prisma.$queryRaw`
INSERT INTO categories (name)
VALUES ('천국 가는 음료');
`;
//INSERT INTO문은 ORM처럼 최근 추가한 데이터를 반환하지 않기 때문에 추가로 작성한다.
//queryRaw 결과는 항상 배열이기 때문에 비구조화 해서 객체 하나만 반환하게 만들어준다.
const [category] = await prisma.$queryRaw`
SELECT *
FROM categories
ORDER BY id DESC
LIMIT 1
`;
res.json(category);
})
//read
app.get('/products', async (req, res) => {
const products = await prisma.$queryRaw`
SELECT p.id, p.name, p.category_id, p.korean_name, p.english_name
FROM products p
`;
res.json(products);
});
//SQL문만 봐도 어떤 정보가 들어오는지 알게 만들기 위해 * 대신 하나하나 적어주는 것이 좋다.
//특정 product 불러오기
app.get('/products/:id', async (req, res) => {
const { id } = req.params;
const [product] = await prisma.$queryRaw`
SELECT p.id, p.name, p.category_id, p.korean_name, p.english_name
FROM procducts p
WHERE p.id=${id}
`;
res.json(product);
});