1. Prisma의 Method 살펴보기 및 밑 작업하기
Prisma는 mongoose와 동일하게,
findMany(), findFirst(), findUnique() 등 다양한 메서드를 지원합니다.
mongoose를 사용했을 때는 Schema를 이용하였다면,
Prisma에서는 Prisma Client를 이용해 MySQL의 데이터를 조작할 것 입니다.
저번 페이지에서 만든 Posts 테이블에서 생성 및 수정할 때 필수 인자값 3개를
이용해 권한 검증 및 데이터 생성을 구현해보겠습니다.
먼저, routes/posts.router.js 파일 생성
import { PrismaClient } from "@prisma/clinet"
로 PrismaClient를 prisma/client 라이브러리에서 가져옵니다.
그래서, CLI 환경에서는 Prisma 패키지 자체를 사용하지만,
Node.js 코드 환경에서는 라이브러리를 통해 PrismaClient로
DB와 통신을 해서 설정을 한다.
const prisma = new PrismaClient()
는 PrismaClient Class의 생성자로 인스턴스를 생성한다.
이렇게 할당된 prismaClient 인스턴스를 활용해서
Posts 테이블에 해당하는 데이터를 생성하거나, 수정, 삭제할 수 있다.
이때,
{
log : ['query','info','warn','error'],
errorFormat : 'pretty'
}
추가적인 기능을 객체 내부에 지정해줄 수 있는데,
log 라는 옵션과 error 출력형식의 속성을 지정해줄 수 있습니다.
log : ['query','info','warn','error']
설정을 통해
query 실행이나,
info로 데이터베이스 내 정보성 메시지 전달,
warn로 문제 발생 시 원인 분석,
error로 query를 했을 때 데이터 자체 에러 발생 내용
을 터미널 내에서 출력할 수 있도록 해줄 수 있습니다.
그리고, 출력 형식을
errorFormat : 'pretty'
를 통해 개발자가 이해하기 쉬운 형태로 출력해줍니다.
다 작성을 완료했다면
app.js에
위와 같이 작성해 Server와의 연결 및 postsRouter가 사용될 수 있게 해줍니다.
이제 Prisma 게시글 API 명세서를 바탕으로 API를 구현해봅시다.
1) Prisma 게시글 생성(Create) API
게시글 생성 API의 비즈니스 로직
1. title, content, password를 body로 전달받는다.
2. title, content, password를 이용해 Posts 테이블에 데이터를 삽입한다.
3. 생성된 게시글을 반환한다.
위와 같이 작성할 수 있습니다.
SQL에서는 Insert Into로 값들을 테이블에 삽입하지만,
Prisma에서는 prisma.지정한 테이블 이름.create({data : {값들}}) 로 가능했다.
Posts는
의 "Posts"를 가져온 것 입니다.
이제, yarn dev로
package.json의 "scripts"에 있는 "dev"를 바탕으로,
yarn dev로 app.js를 실행시킨다.
그 후, Insomnia를 실행시켜 테이블의 열(Colum)에 해당하는 values들을 넣어주면
정상적으로 열(Colum)에 해당하는 값들이
잘 들어간 걸 볼 수 있다.
2) Prisma 게시글 조회(Read) API
- 게시글 목록 조회
- 게시글 상세 조회
를 구현해보겠습니다.
- 게시글 목록 조회
로 구현 가능하고,
만약, Colum Name : False를 줄 경우 오류가 발생하게 됩니다.
Insomnia를 실행시켜 확인해보면
위와 같이 객체 내 "data" Key에 해당하는 Value가 배열 형태로 출력된 것을 볼 수 있고,
한 Row에 해당하는 값들이 객체 형식으로 반환된 것을 볼 수 있다.
- 게시글 상세 조회
으로 찾고자 하는 값을 통한 Colum을 제공 받을 수있다.
Insomnia를 실행시켜 확인해보면
위와 같이
찾고자 하는 postId에 해당하는
출력 여부가 true인
결과들이 출력되는걸 볼 수 있다.
3) Prisma 게시글 수정(Update) API
게시글 수정 API의 비즈니스 로직
- Path Parameters로 어떤 게시글을 수정할 지 postId를 전달받습니다.
- 변경할 title, content와 권한 검증을 위한 password를 body로 전달받습니다.
- postId를 기준으로 게시글을 검색하고, 게시글이 존재하는지 확인합니다.
- 게시글이 조회되었다면 해당하는 게시글의 password가 일치하는지 확인합니다.
- 모든 조건을 통과하였다면 게시글을 수정합니다.
Insomnia를 실행시켜 확인해보면
password : "1234"로 일치하는
title, content 값을 변경합니다.
그리고 조회해보면
변경된 결과를 확인할 수 있습니다.
에러를 발생시켜보면,
1) postId 에러
postId에 작성한 에러가 출력되고,
2) password 에러
password에 작성한 에러가 출력됩니다.
그리고
게시글 수정(Update) 및 즉시 조회(Select)
위의 코드를 수정 문 밑에 추가하면 수정에 따른 즉시 조회가 가능하다.
Where 속성에 여러개의 조건
SQL에서는 특정한 데이터를 검출하기 위해 where절에서
OR(||), AND(&&), LIKE, 정규표현식 등 다양한 연산자를 사용합니다.
Prisma의 where 절은 여러개의 조건이 들어올 경우 AND(&&) 연산자를 사용하는 것과 동일한 결과를 출력합니다.
하지만, 이외의 연산자를 사용하고 싶다면, 아래와 같은 문법으로도 사용할 수 있습니다.
4) Prisma 게시글 삭제(Delete) API
게시글 삭제 API는 게시글 수정 API와 동일한 로직을 수행하지만,
Body에서 password만 전달 받은 것이 유일한 차이점입니다.
게시글 삭제 API의 비즈니스 로직
1. Path Parameters로 어떤 게시글을 수정할 지 postId를 전달받습니다.
2. 권한 검증을 위한 password를 body로 전달 받습니다.
3. postId를 기준으로 게시글을 검색하고, 게시글이 존재하는지 확인합니다.
4. 게시글이 조회되었다면 해당하는 게시글의 password가 일치하는지 확인합니다.
5. 모든 조건을 통과하였다면 게시글을 삭제합니다.
위와 같은 코드로 postsId를 확인 및 작성자 password를 확인하고,
게시글을 삭제시킵니다.
Insomnia를 실행시켜 확인해보면
Client에게 응답으로 게시글이 삭제 됐다는 걸 전달해주고,
( 변경 전 ) ( 변경 후 )
DB의 해당 게시글이 삭제된 것을 확인할 수 있습니다.
에러를 발생시켜보면,
1) postId 에러
2) password 에러
정상적으로 에러 메시지가 Client에게 응답된 것을 확인할 수 있습니다.
삭제 및 즉시 조회
해당 게시글이 삭제되고, 즉시 조회가 되는 것을 확인할 수 있습니다.
2. Prisma 리팩토링(PrismaClient 파일 따로 만들기)
PrismaClient는 Prisma를 사용하여 실제 DB와의 연결을 관리하는 객체입니다.
new PrismaClient()를 이용해 JavaScript에서 Prisma를 사용할 수 있도록 인스턴스를 생성합니다.
const prisma = new PrismaClient()
현재는 게시글(Posts) 라우터만 구현하고 있지만,
사용자(Users) 라우터, 사용자 정보(UserInfo), 해시 태크(HashTags)
같은 여러 라우터들이 추가된다면, 각 라우터 개수마다
데이터 베이스와 연결하는 문제가 발생하게 됩니다.
여러 번 데이터베이스의 연결을 생성한다면, 리소스가 과도하게 사용돼
어플레이케션 성능이 저하됩니다. 따라서, 최대한 데이터베이스의 연결을
줄이는 것이 효율적인 방법 입니다.
/utils/prisma/index.js 를 생성합니다.
그리고 위의 코드 처럼 PrismaClient와의 연결 부분만 작성하고
export default prisma
로 외부에서 사용할 수 있게 해줍니다.
그후
app.js에서는
을 지우고, ( const router = express.Router(); 이 안 지워지게 조심해야 한다.)
utils/prisma/index.js의 prisma를 import 해줍니다.
그 결과,
정상적으로 서버가 작동하고
API 도 동작하는 것을 확인할 수 있습니다.
'Node 강의 > 숙련' 카테고리의 다른 글
1-10 JWT (0) | 2024.09.07 |
---|---|
1-9 쿠키와 세션 (0) | 2024.09.07 |
1-7 ORM과 Prisma(+ Posts 게시판 만들기 DB 밑 작업) (0) | 2024.09.06 |
1-6 Raw Query시작하기 (0) | 2024.09.06 |
1-5 SQL 제약조건 (0) | 2024.09.05 |