본문 바로가기
내일배움 정리/JS 문법 공부

프리즈마(정리하기)

by GREEN나무 2024. 12. 5.
728x90

프리마(Prisma)는 JavaScript 및 TypeScript 애플리케이션에서 데이터베이스와 상호작용하는 강력한 ORM(Object-Relational Mapping) 도구입니다. 프리마를 JavaScript에서 사용하는 기본적인 코드 작성 과정을 아래와 같이 설명할게요.


1. Prisma 설치

먼저 프로젝트에서 Prisma를 설치해야 합니다.

npm install prisma --save-dev
npm install @prisma/client

2. Prisma 초기화

Prisma를 초기화하면 prisma/schema.prisma 파일이 생성됩니다.

npx prisma init

이 명령은 prisma 디렉토리와 함께 기본 구성 파일을 만듭니다. schema.prisma에서 데이터베이스를 설정할 수 있습니다.

예를 들어, SQLite를 사용할 경우:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}

3. Prisma Client 생성

스키마 변경사항을 반영하려면 Prisma Client를 생성해야 합니다.

npx prisma generate

4. 마이그레이션 적용

마이그레이션을 통해 데이터베이스에 테이블 구조를 반영합니다.

npx prisma migrate dev --name init

5. Prisma Client 사용

Prisma Client를 사용해 데이터베이스와 상호작용합니다.

예제: index.js

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

async function main() {
  // 새로운 사용자 생성
  const newUser = await prisma.user.create({
    data: {
      name: 'John Doe',
      email: 'john.doe@example.com',
    },
  });
  console.log('Created user:', newUser);

  // 사용자 목록 가져오기
  const allUsers = await prisma.user.findMany();
  console.log('All users:', allUsers);
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

6. Prisma Client 쿼리 사용 예제

1) 데이터 삽입

await prisma.user.create({
  data: {
    name: 'Alice',
    email: 'alice@example.com',
  },
});

2) 데이터 조회

const users = await prisma.user.findMany();
console.log(users);

3) 데이터 업데이트

await prisma.user.update({
  where: { email: 'alice@example.com' },
  data: { name: 'Alice Wonderland' },
});

4) 데이터 삭제

await prisma.user.delete({
  where: { email: 'alice@example.com' },
});

 


값의 일부분만 일치
1. 앞에서부터 일치 : startsWith
       'string%'
2. 중간에 일치 : contains
       '%string%'
3. 끝에서 일치 : endsWith
       '%string'

 

 

부분 문자열 검색과 lte의 차이점

  • lte: 문자열의 사전 순서를 기준으로 비교.
    • 예: "chon" <= "Seoul, Sinchon" → false
    • 예: "chon" <= "chon" → true
  • contains: 문자열에 해당 부분 문자열이 포함되는지 확인.
    • 예: "Seoul, Sinchon".contains("chon") → true

 


 

prisma 에서 부분 일치하는 값으로 where조건 사용하기

where: {
        menu: {
          some: {
            menuName: {
              contains: nameKeyword, // 검색어
              mode: 'insensitive', // 대소문자 구분하지 않음
            },
          },
        },
      },

prisma 에서 다수의 where조건 사용하기

      where: {
        menu: {
          some: {
            OR: [
              {
                menuName: {
                  contains: menuKeyword, // 메뉴 이름에 검색어 포함
                  mode: 'insensitive', // 대소문자 구분하지 않음
                },
              },
              {
                content: {
                  contains: menuKeyword, // 메뉴 소개에 검색어 포함
                  mode: 'insensitive', // 대소문자 구분하지 않음
                },
              },
            ],
          },
        },
      },

 

url 쿼리 사용하기

const { type } = req.query; // 쿼리

 

복수 쿼리 사용

// URL 예시
// GET http://localhost:3000/api/restaurants/search?search=맛있는&type=name
// GET http://localhost:3000/api/restaurants/search?search=짜장&type=menu
// GET http://localhost:3000/api/restaurants/search?search=중국집

 

// getRestaurants.routes.js
// 매장 검색 (이름, 메뉴 포함)
// (쿼리 파라미터 타입 search(종합검색), name(상호명), menu(메뉴,설명명) 사용)
router.get('/search', GetRestaurantsController.searchRestaurants);
// getRestaurants.controller.js
// 매장검색
  searchRestaurants = async (req, res) => {
    console.log('Controller searchRestaurants');
    try {
      const { search, type } = req.query; // 쿼리 파라미터로 전달된 search, type 값

      if (!search) {
        return res.status(400).json({ message: '검색어를 입력해 주세요.' });
      }

      // 검색 타입에 따른 분기 처리
      let restaurants;
      if (type === 'name') {
        restaurants = await this.#service.searchRestaurantsByName(search);
      } else if (type === 'menu') {
        restaurants = await this.#service.searchRestaurantsByMenu(search);
      } else {
        restaurants = await this.#service.searchRestaurantsByNameMenu(search);
      }

      if (!restaurants || restaurants.length === 0) {
        return res
          .status(404)
          .json({ message: '일치하는 매장 정보가 존재하지 않습니다.' });
      }

      return res.status(200).json(restaurants);
    } catch (error) {
      console.error('Error in searchRestaurants:', error);
      return res.status(500).json({ message: '서버에 문제가 발생했습니다.' });
    }
  };