CSV 파일 데이터를 prisma를 이용해서 cloud DB에 적용시켜보자
저는 두가지 선택지를 두고 고민했습니다
AWS 프리티어 postgresql vs supabase postgresql
12개월간만 무료로 이용한간 AWS보다는 반영구? 적인 supabase postgresql를 선택했습니다
jdbc:postgresql://{호스트 주소}:5432/postgres?user=postgres.{유저 이름}&password={유저 비밀번호}
를 이용하여 DataGrip 에 연결을 확인한 뒤
DB_URL=postgres://postgres.xx:xx@aws-0-ap-northeast-2.xx.xx.com:5432/postgres
yarn add @prisma/client
yarn add prisma --save-dev
프로젝트 루트 디렉토리에 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가 연동된 모습
한글을 사용하실경우 인코딩이 중요합니다 EUC-KR 인코딩이된 csv파일을 준비했습니다
yarn add csv-parser iconv-lite stream
// 파일 경로
// 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('모든 사용자의 데이터가 데이터 베이스에 성공적으로 저장되었습니다.')
})
}