CSV파일 prisma 이용해서 DB에 저장하기

BellBoy·2024년 3월 4일
0
post-thumbnail
post-custom-banner

CSV 파일 데이터를 prisma를 이용해서 cloud DB에 적용시켜보자

cloud DB 구현하기

저는 두가지 선택지를 두고 고민했습니다
AWS 프리티어 postgresql vs supabase postgresql

12개월간만 무료로 이용한간 AWS보다는 반영구? 적인 supabase postgresql를 선택했습니다

jdbc:postgresql://{호스트 주소}:5432/postgres?user=postgres.{유저 이름}&password={유저 비밀번호}

를 이용하여 DataGrip 에 연결을 확인한 뒤

  1. Next.js 프로젝트에서 env 파일을 생성해서 환경변수를 지정해줍니다
DB_URL=postgres://postgres.xx:xx@aws-0-ap-northeast-2.xx.xx.com:5432/postgres

prisma 환경 세팅해주기

  1. prisma 관련 패키지를 다운로드합니다.
yarn add @prisma/client
yarn add prisma --save-dev
  1. npx 명령어를 통해 prisma 셋팅을 할 수 있지만 직접 파일을 작성하기

프로젝트 루트 디렉토리에 prisma 폴더 생성
하위에 schema.prisma 파일 생성


// schema.prisma


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

datasource db {
  provider = "postgresql"
  url      = env("DB_URL")
}

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

prisma 파일을 다음과 같이 작성 후

 npx prisma generate
 npx prisma migrate dev --name init

prisma 를 DB에 연동해줍니다

정상적으로 DB가 연동된 모습

csv 파일로 DB에 적용하기

  1. 다음과 같은 csv 파일을 준비했습니다.

한글을 사용하실경우 인코딩이 중요합니다 EUC-KR 인코딩이된 csv파일을 준비했습니다

  1. 인코딩 및 csv 파일 data를 저장하는 패키지를 설치해줍니다
yarn add csv-parser iconv-lite stream
  1. next.js 에서 서버 단 작업을 하기위해
    다음과 같이 파일을 작업했습니다
// 파일 경로
//  nextjs/src/services/csv.service.ts

"use server"		// prisma를 사용하기때문에 "use server" 선언

import fs from "fs";
import csv from 'csv-parser'		// csv 데이터를 읽어오는 패키지
import {PrismaClient} from "@prisma/client";
import * as path from "path";
import iconv from "iconv-lite"			// 인코딩을 위한 패키지

const prisma = new PrismaClient();

export async function csvUpload() {
    const results: any[] = [];

    const filePath = path.join(process.cwd(), 'public','test.csv')	//path를 사용해서 프로젝트 경로에서 사용할 csv 파일을 지정해줍니다
    const readStream = fs.createReadStream(filePath)
    const decodeStream  = iconv.decodeStream('EUC-KR');
    readStream.pipe(decodeStream)	// 인코딩을 지정해줍니다

  // csv 파일 데이터를 읽어오는 구문
    decodeStream
        .pipe(csv())
        .on('data', (data) => results.push(data))
        .on('end', async () => {
            console.log(results);

            for (let user of results) {
                await prisma.user.create({	//  prisma에 저장하는 구문 따로 분리해도 좋습니다
                    data: {
                        name: user.name,
                        email: user.email,
                    }
                })
            }
            console.log('모든 사용자의 데이터가 데이터 베이스에 성공적으로 저장되었습니다.')
        })
}
profile
리액트러버
post-custom-banner

0개의 댓글