프로젝트/가말다 - 마일스톤

BE - DB연결 방식 변경 (Prisma -> SQL쿼리)

58청춘 2023. 4. 6. 16:30
728x90

현재 진행중인 프로젝트의 서버는 라즈베리파이를 사용하고있다.

사설 서버를 빌려 진행할 수 있었지만, 같이 진행하는 친구가 라즈베리파이로 서버를 구축해줘서

서버를 빌려 진행하는 수고를 덜 수 있었다.

 

하지만 문제가 생겼다.

현재 작성된 코드는 Prisma와 typeORM을 사용해 작성되어있는데,

라즈베리파이의 아키텍처인 ARMv7은 ORM에서 지원하지 않는 아키텍처였다.

 

물론 사용은 할 수 있지만, 이렇게 한다면 다시 서버의 OS를 지우고

다시 시작하는데 시간이 많이 걸릴거라는 생각이 들어 Prisma와 typeORM을 사용하지 않는

방향으로 결론이 났다.

 

이번 글은 내가 기존에 작성해둔 BE코드들 중 Prisma와 typeORM을 사용한 코드를

수정하는 글이 될것이다.

몰랐던 것들은 기록하면 작성한다.

 

NestJS 프레임워크를 사용, 서버는 mySQL을 사용한다.

추가적으로 설치한 라이브러리는 mysql2이다.

 

우선 DB와 연결해줄 db_connection.service.ts 파일을 작성해준다.

import { Injectable, OnModuleInit } from "@nestjs/common";
import * as mysql from "mysql2/promise";

@Injectable()
export class DBConnectionService implements OnModuleInit {
  public ConnectDB: mysql.Pool;
  constructor() {}
  
  async onModuleInit() {
    this.ConnectDB = mysql.createPool({
      host: process.env.DB_HOST,
      port: Number(process.env.DB_PORT),
      user: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      connectionLimit: 50
    });
    console.log('🚗 DB와 연결되었다 🚗');
  }
}

이제 실행시켜주면...

잘 되는 모습이다.

 

이제 연결도 되었으니 Prisma를 이용했던 코드를 바꿔주도록 하자.

/**
   * @param email 
   * @returns DB에서 가져온 유저 정보
   * { id: number, email: string,  nickname: string, profileImage: string, access_token: string, naverRefresh_token: string }
   */
  async findUserByEmail(email: string) {
    try {
      return await prisma.user.findFirst({
        where: {
          email: email,
        }
      })
    }
    catch (e) {
      console.log(e);
      return false;
    }
  }

  /**
   * @param createUserReq 
   * @returns DB에 유저 정보를 생성, 생성됬는지 boolean값 return
   */
  async createUserDate(createUserReq: any, accessToken: string) {
    try {
      await prisma.user.create({
        data: {
          email: createUserReq.email,
          nickname: createUserReq.nickname,
          profileImage: createUserReq.profileImage,
          access_token: accessToken,
          naverRefresh_token: createUserReq.naverRefresh_token
        }
      });
      return true;
    } catch (e) {
      console.log(e);
      return false;
    };
  }

  /**
   * @param email 
   * @returns DB에서 추출한 해당 email을 갖은 유저의 accessToken: string 값을 return
   */
  async getAccessToken(email: string) {
    try {
      const userAccessToken = await prisma.user.findFirst({
        where: {
          email: email,
        },
        select: {
          access_token: true,
        }
      });
      return userAccessToken.access_token;
    }
    catch(e) {
      console.log(e);
      return false;
    }
  }

 

위의 코드를 SQL쿼리를 이용하는 코드로 바꿔주면 아래의 코드로 변한다.

import { Injectable, OnModuleInit } from "@nestjs/common";
import * as mysql from "mysql2/promise";

@Injectable()
export class DBConnectionService implements OnModuleInit {
  public ConnectDB: mysql.Pool;
  constructor() {}
  
  async onModuleInit() {
    this.ConnectDB = mysql.createPool({
      host: process.env.DB_HOST,
      port: Number(process.env.DB_PORT),
      user: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      connectionLimit: 50
    });
    console.log('🚗 DB와 연결되었다🚗');
  }

  /**
   * @param email 
   * @returns DB에서 가져온 유저 정보 object 타입으로 반환
   * { access_token: string }
   */
  async findUserByEmail(email: string) {
    try {
      const userInfo = await this.ConnectDB.query(`SELECT * FROM User WHERE email="${email}"`)
      return userInfo[0][0]
    }
    catch (e) {
      console.log(e);
      throw e;
    }
  }

  /**
   * @param createUserReq 
   * @returns DB에 유저 정보를 생성, 생성됬는지 boolean값 return
   */
  async createUserDate(createUserReq: any, accessToken: string) {
    try {
      await this.ConnectDB.query(`INSERT INTO User (email,nickname,profileImage,access_token,naverRefresh_token) VALUES("${createUserReq.email}","${createUserReq.nickname}","${createUserReq.profileImage}","${accessToken}","${createUserReq.naverRefresh_token}")`)
      return true;
    } catch (e) {
      console.log(e);
      return false;
    };
  }

  /**
   * @param email 
   * @returns DB에서 추출한 해당 email을 갖은 유저의 accessToken: string 값을 return
   */
  async getAccessToken(email: string) {
    try {
      const access_token = await this.ConnectDB.query(`SELECT access_token FROM User WHERE email="${email}"`)
      return access_token[0][0].access_token;
    }
    catch(e) {
      console.log(e);
      return false;
    }
  }
}

OnModuleInit() 을 사용한 이유는 라이플 사이클이 호스트 모듈이 초기화 될때 호출되므로

서버가 켜졌을 때 연결되게끔 하기 위해 사용했다.

라이프 사이클에 대한 추가적인 정보는 링크에서 알게되었다.

 

 

 

 

후기.

 

Prisma와 typeORM을 사용하면서 기존에 사용했던 SQL쿼리 방식보다

훨씬 사용하기 편했던것 같다.

 

이번에는 결국 SQL쿼리 형식으로 돌아왔지만,

Prisma라는 기술을 경험해보면서 사용이 편리하다는것이 좋다는것을 다시한번 경험했다.

 

하지만 꼭 다 좋은것은 아니였다.

초기에 모델을 스키마에 정의할 때 상당히 많이 해맸었다.

내가 지식이 없는 기술이기도 했고, 내가 느끼기에는 복잡하다는 느낌이 있었기에

적응하는데 어려움이 있긴했다.

 

하지만 편리하다는 장점이 단점을 덮을 만큼 좋았다.

728x90