[express] prisma client (+jet-logger)

하람·2024년 9월 26일

Express 서버

목록 보기
5/7
  • Prisma Client를 환경에 따라 동적으로 설정하고
  • 애플리케이션 전반에서 하나의 Prisma 인스턴스를 재사용하는 방식으로 선언하고 (싱글톤 패턴)
  • 로깅을 jet-logger와 연결했다.

Prisma Client

// /src/lib/prisma/index.ts
import { logInfo, logWarn, logError } from "../middlewares/logger";

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

let option = {};
if (process.env.NODE_ENV === "production") {
  // Production 환경에서는 로그를 최소화하고, 에러 메시지를 기본 형식으로 설정
  option = {
    log: ["warn", "error"], // 로그 최소화
    errorFormat: "minimal", // 에러 메시지를 기본 형식으로 출력
  };
} else {
  option = {
    // Development 환경에서는 SQL 쿼리 로그를 출력하고, 에러 메시지를 읽기 쉬운 형태로 설정
    log: ["query", "info", "warn", "error"],
    errorFormat: "pretty",
  };
}

// 전체 애플리케이션에서 하나의 인스턴스만 재사용한다.
const prisma = new PrismaClient(option);

// Prisma 로그를 Jet-Logger로 전송
prisma.$on("query", (e: any) => {
  logInfo(`prisma Query: ${e.query}`);
});

prisma.$on("info", (e: any) => {
  logInfo(`prisma Info: ${e.message}`);
});

prisma.$on("warn", (e: any) => {
  logWarn(`prisma Warning: ${e.message}`);
});

prisma.$on("error", (e: any) => {
  logError(`prisma Error: ${e.message}`);
});

module.exports = prisma;

특징

  1. 환경에 따른 설정 차별화
    개발 환경에서는 SQL 쿼리 및 경고, 에러 로그를 자세히 남겨 디버깅과 최적화에 도움이 된다.
    반대로, 프로덕션 환경에서는 성능에 영향을 미치지 않도록 로그 출력을 최소화하여 부하를 줄인다.
  2. 하나의 인스턴스 재사용
    Prisma Client 인스턴스는 애플리케이션의 모든 곳에서 하나의 Prisma Client 인스턴스만 사용(싱글톤 패턴)하게 되므로 자원을 효율적으로 사용한다.
    여러 인스턴스를 생성하지 않기 때문에 커넥션 풀 관리 측면에서도 좋고, DB 연결 최적화에 유리하다.
  3. 로그 관리
    전체 로그 시스템을 통합하여, Prisma에서 발생하는 쿼리 로그나 오류 로그를 Jet-Logger에 보내 일관된 로깅 환경을 구성한다.

    특히 이번 프로젝트는 추후 jet-logger ➡ winston migration도 고려중이다. (외부 서비스 등으로 모니터링까지 할 계획!) 그래서 prisma 로그도 일단 중앙화 해야겠다는 결론을 내렸다.

profile
강하고 담대하라 두려워하지 말라

0개의 댓글