나만의 작은 도서관

[TIL] 240529 캠프 45일차: prisma: @map 생략, createMany 본문

Today I Learn

[TIL] 240529 캠프 45일차: prisma: @map 생략, createMany

pledge24 2024. 5. 29. 21:18

오늘 배운 내용                                     

같은 RDB여도 각 데이터베이스가 사용하는 SQL문은 다르다

Prisma와 같은 ORM을 사용하는 이유를 공부하던 도중, ORM을 사용하면 다른 데이터베이스로 옮겨가는 것이 편리해진다는 내용을 알게되었다. 그런데 공부할때까지만 해도 모든 데이터베이스가 SQL문을 사용하니 전부 동일한 쿼리문을 가지고 있을거라 생각했었는데, 그렇지 않았다. 간단한 예시로 아래와 같은 차이점이 있다. 

-- 자동 증가 필드. 
-- mysql에서는 auto_increment를 사용하면 되지만 oracle은 더욱 복잡하고 길게 SQL문을 짜야한다.

-- MySQL
CREATE TABLE example (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255)
);

-- Oracle
CREATE TABLE example (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(255)
);

CREATE SEQUENCE example_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER example_before_insert
BEFORE INSERT ON example
FOR EACH ROW
BEGIN
  SELECT example_seq.NEXTVAL INTO :NEW.id FROM dual;
END;

 

schema.prisma 모델 @map 생략

@map을 생략한 속성은 선언한 이름과 데이터베이스 컬럼의 이름이 동일시 취급된다. 

model User {
  id        Int     @id @default(autoincrement())
  firstName String	// @map(firstName)이 생략되었다고 볼 수 있다.
  lastName  String
  email     String  @unique
}

 

prisma createMany사용법

prisma에서 createMany를 사용하면 여러 레코드를 생성할 수 있다. 아래의 코드는 count개수만큼 characterId, itemId를 가지는 객체들을 캐릭터 인벤토리 데이터베이스에 추가하는 것이다.

await userDataClient.characterInventory.createMany({
    data: Array(count).fill({
      characterId,
      itemId: item_code,
    }),
  });
// 추가되는 레코드
[
  { "characterId": 1, "itemId": 42 },
  { "characterId": 1, "itemId": 42 },
  { "characterId": 1, "itemId": 42 }
]

오늘의 Trouble Shooting                  

Problem 1. AWS EC2 배포시 prisma 오류

localhost를 통해서만 확인했던 과제를 AWS EC2에 배포하기위해 깃헙에 코드를 올리고, git bash를 통해 ec2에 접근하여 git clone하여 가져왔다. 분명 yarn명령어를 실행해 node modules도 있고, .env파일도 추가로 넣어줘서 빠진 내용이 없을 텐데 이상하게도 node src/spp.js 다음과 같은 오류가 뜨며 실행되지 않는다.

PrismaClientInitializationError: Prisma Client could not locate the Query Engine for runtime "debian-openssl-3.0.x".

This happened because Prisma Client was generated for "windows", but the actual deployment required "debian-openssl-3.0.x".
Add "debian-openssl-3.0.x" to `binaryTargets` in the "schema.prisma" file and run `prisma generate` after saving it:

generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "debian-openssl-3.0.x"]
}

Solve. EC2의 운영체제에 맞는 추가 코드 설정

오류를 잘 읽어보면 Prisma 클라이언트가 debian-openssl-3.0.x 런타임을 가지는 쿼리엔진에 위치하지 않아서 발생한 문제라고 한다. 이는 기존에 작업하던 운영체제가 Window였고, EC2는 debian-openssl-3.0.x(우분투)때문에 운영체제의 차이로 발생한 문제이다. 그렇기 때문에 오류에서 제안한 방법처럼 debian-openssl-3.0.x에서도 prisma가 작동할 수 있도록 debian-openssl-3.0.x를 추가해주면된다. 추가하는 방법은 generator에 binaryTargets를 위처럼 추가한 후, .prisma를 최신 상태로 갱신하면 된다. 즉, 아래와 같이 하면 된다. 

generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "debian-openssl-3.0.x"]	// .prisma 파일에 해당 줄 추가
}

 

// .prisma파일을 갱신한다. 해당 폴더로 이동해서 아래 명령어를 사용하거나,
npx prisma generate

// --schema을 사용해서 .prisma파일의 경로를 명시해주면 된다.
npx prisma --schema=./schema.prisma

 

 

오늘 한 일                                       

더보기
  • Node-lv2 과제 EC2에 배포 및 테스팅
  • Node-lv2 과제 API 명세서 작성 및 최종 제출
  • Node-lv2 해설 영상 시청 -완- 및 클론 코딩
  • 서브넷 마스크, 공인 IP 주소와 사설 IP 주소, 정적 IP 주소와 동적 IP 주소, 라우터와 라우팅 글 초안 작성