Home Js to Ts (prisma)
Post
X

Js to Ts (prisma)

기존 프로젝트에 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 쿼리 최적화를 처리합니다.

    수동으로 쿼리를 작성하는 것보다 효율적인 쿼리가 생성되므로 성능 향상에 도움이 될 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.