NestJS의 ORM으로 Prisma를 사용 중이다. 여기서 특정 연산을 수행했을 떄 Can't reach database server at `db` ... 이라는 문구가 뜨면서 DB connection이 끊기는 현상이 발생했다. 다른 연산은 모두 정상적으로 작동하는데 특정한 연산에 대해서만 이러한 문제가 발생했다.
여기서 Prisma의 동작 원리를 알아봐야 하는데, Prisma는 개발자의 생산성 및 Migration을 쉽게 하기 위함에 초점을 맞춘 ORM이다. PrismaClient에 json 파일을 입력한다. 이 json 파일은 Prisma 자체적으로 sql 쿼리로 변환한다.
Prisma가 sql 쿼리로 변환하는 과정에서 문제가 생기는 것이다. 예를 들어 (raw query 기준) "publi 스키마의 user에서 publi 스키마의 user의 key가 1,2,3을 포함하는 publi 스키마의 user 테이블의 id를 추출하라" 라는 문구를 sql로 표현하면 다음과 같이 나온다.
'SELECT "publi"."User"."id" FROM "publi"."User" WHERE "publi"."User"."key" IN (1, 2, 3) ';
여기서 Prisma는 IN 안의 변수들을 매개변수로 표현하는데, 여기서 문제가 생기게 된다. IN 안의 매개변수의 최대값은 short.max 값이다. 그 이상은 입력이 불가능하다. 이 버근느 22년 2월 26일 기준으로도 고쳐지지 않았다. 사실 IN 안에 32676개를 넣는다는 것은 사실상 전체 테이블 쿼리랑 비슷하니 지원하지 않는 것이 당연할수도... 문제에 관한 깃허브 이슈는 아래 링크에 있다.
https://github.com/prisma/prisma/issues/8832
나는 IN 연산이 부득이하게 필요한 연산이다 보니, $rawQueryUnsafe를 이용하여 쿼리 문자열을 만들어서 그냥 넘겨주었다. 결과는 성공. IN 매개변수를 제한한 곳에는 이유가 있을 거라고 생각이 된다. 보안상 이슈라던가, 퍼포먼스 상의 이슈라던지... 여튼 이 문제로 하루종일 삽질을 했다. DB에 관한 문제 해결력이 아직 부족한 것 같다.
'서버 인프라 > DB' 카테고리의 다른 글
Slow query 개선 경험기 (0) | 2024.10.30 |
---|---|
Postgres 자연어 검색하기 (1) | 2023.11.18 |
template database "template1" does not exist 에러 해결하기 (0) | 2022.11.21 |
RDS Postgresql 로컬에서 실행하기 (0) | 2022.09.27 |
Postgresql DB의 인덱싱 알고리즘 (0) | 2021.12.26 |