기존 프로젝트에 prisma를 적용해보자.
Prisma를 사용하여 MySQL을 연동해보도록 하겠습니다.
참고글 : prisma, prisma-opt, prisma-query
DB 연동
참고글 : Prisma 기본 설정
참고글을 토대로 npx prisma init
명령어를 실행하고 schema.prisma
파일을 작성합니다.
datasource db {
provider = "mysql"
url = env("DATABASE_URL") // .env 파일에 설정
// "mysql://user:password@localhost:3306/mydb"
}
generator client {
provider = "prisma-client-js"
}
모델 정의
기존 DB의 테이블 정보를 불러와 모델을 자동 생성할 수 있습니다.
기존의 테이블이 없다면 따로 모델 정의
1
npx prisma introspect
자동 생성된 모델
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model user {
user_id Int @id @unique(map: "member_id_UNIQUE") @default(autoincrement())
id String @unique(map: "id_UNIQUE") @db.VarChar(45)
password String @db.VarChar(45)
user_info user_info?
}
model user_info {
user_id Int @unique(map: "user_id_UNIQUE")
nickname String @db.VarChar(45)
user user @relation(fields: [user_id], references: [user_id], onDelete: Cascade, onUpdate: Cascade, map: "fk_user_info_user1")
@@index([user_id], map: "fk_user_info_user1_idx")
}
CRUD 작업 처리
참고글 : Prisma 쿼리 메서드, Prisma 조건 및 필터링
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import prisma from "config/prismaClient.js";
class UserStorage {
// 사용자 정보 조회 (ID로 조회)
static async getUserById(id: string) {
try {
const user = await prisma.user.findUnique({
where: { id },
});
return user;
} catch (err) {
throw err;
}
}
// 사용자 추가 정보 조회 (user_id로 조회)
static async getUserInfo(userId: number) {
try {
const userInfo = await prisma.user_info.findUnique({
where: { user_id: userId },
});
return userInfo;
} catch (err) {
throw err;
}
}
// 사용자 생성
static async createUser(userInfo: {
id: string;
password: string;
nickname: string;
}) {
try {
await prisma.$transaction(async (prismaTransaction) => {
const newUser = await prismaTransaction.user.create({
data: {
id: userInfo.id,
password: userInfo.password,
},
});
await prismaTransaction.user_info.create({
data: {
user_id: newUser.user_id,
nickname: userInfo.nickname,
},
});
});
} catch (err) {
throw err;
}
}
}
export default UserDAO;
prisma 적용 장점
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
32
33
34
35
36
// prisma 도입 전 기존 코드 (mysql2)
class UserStorage {
static async getUserById(id: string): Promise<User | null> {
const conn = await pool.getConnection();
try {
const [rows] = await conn.query<RowDataPacket[]>(
"SELECT * FROM user WHERE id = ?",
[id]
);
if (rows.length === 0) return null;
return rows[0] as User;
} catch (err) {
throw err;
} finally {
conn.release();
}
}
}
// prisma 도입 후
class UserStorage {
static async getUserById(id: string) {
try {
const user = await prisma.user.findUnique({
where: { id },
});
return user;
} catch (err) {
throw err;
}
}
}
간결해진 코드
MySQL 연결을 직접 관리하고, 쿼리문을 작성해야 했지만
prisma.user.findUnique
를 사용하면, Prisma 클라이언트가 이를 내부적으로 처리해주므로 코드가 훨씬 간결하고 읽기 쉬워집니다.자동 데이터 검증 및 타입 안정성
findUnique
를 사용하면 반환되는 데이터의 타입이 자동으로 Prisma 스키마에 정의된 모델과 일치합니다.TypeScript에서 이점을 극대화할 수 있으며, 컴파일 단계에서 타입 오류를 발견할 수 있어 실수나 오류를 예방할 수 있습니다.
자동 쿼리 최적화
Prisma는 내부적으로 MySQL 쿼리 최적화를 처리합니다.
수동으로 쿼리를 작성하는 것보다 효율적인 쿼리가 생성되므로 성능 향상에 도움이 될 수 있습니다.