Easiest CV 데이터베이스 변경하기 MariaDB에서 PostgreSQL로

홍시·2024년 2월 19일

EasiestCV

목록 보기
13/16

서론 : 변경 이유

Vercel에서 postgresql을 무료로 제공하고 있어서 이걸로 데이터베이스를 변경하기로 한다.
이미 Next.js를 Vercel에서 배포하고 있으니 같이 배포하면 얼마나 편한가.
Vercel에서 제공하는 DB들 중 원래 여기서 사용하던 MariaDB에서 갈아타기 제일 용이한 DB가 postgresql이었다.

클라우드타입의 프리티어는 매일 새벽에 서버가 중지되어서 매일 다시 켜줘야 한다는 문제도 있고.

본론 : 변경 과정

DB 설정

database.ts

import { Pool } from "pg";
  
const pool = new Pool({
  user: process.env.POSTGRES_USER,
  host: process.env.POSTGRES_HOST,
  database: process.env.POSTGRES_DATABASE,
  password: process.env.POSTGRES_PASSWORD,
  ssl: {
    rejectUnauthorized: false, // 개발 목적으로만 사용해야 
  },
});
  
export async function query(text: string, params?: any[]) {
  const res = await pool.query(text, params);
  return res.rows;
}

postgresql 라이브러리 사용법도 mariadb와 큰 차이 없다.

  • rejectUnauthorized: false : SSL 인증서 검증을 비활성화. 곧 Let's Encrypt로 무료 SSL 인증서를 발급받는 법을 배워볼 생각이다.

쿼리 수정

MariaDB와 PostgreSQL의 쿼리 문법이 약간 달라서 수정을 좀 해줘야 했다.

예를 들어 MariaDB의 문법은

"INSERT INTO users (userid, username, email, password) VALUES (?, ?, ?, ?)"

인데 postgresql은

"INSERT INTO users (userid, username, email, password) VALUES ($1, $2, $3, $4)"

이런 식이었다.

DB 바꾸는 김에 약간 수정

원래 각 탭마다 고유하게 부여하는 id를 parseInt(Math.random() * 100000)로 넣었었는데
테이블 새로 생성하는 김에 그냥 DB에서 Auto Increment 설정을 넣는 걸로 변경했다.

문법은 간단하다 그냥 SERIAL만 추가해주면 된다

CREATE TABLE tabs (
  tid SERIAL PRIMARY KEY,
  userid VARCHAR(50) NOT NULL,
  tname VARCHAR(50) NOT NULL DEFAULT '0',
  torder INT NOT NULL
);

이 과정에서의 작은 실수

getContents가 안 되더라고.

처음에는 DB에 삽입 자체가 안 되고 있는 건 줄 알았다. 아무것도 안 보이니까.
그런데 DB를 열어보니

들어는 가는데 tid, 그러니까 content가 소속된 탭의 id가 죄다 0이라고 되어 있더라.
그러니 "이 탭의 content들을 모두 보여줘"라는 뜻의 getContents가 실행이 안 되고
내용 업데이트 기능 역시도 맨 처음에 getContents를 한 뒤에 프론트에서 변경된 내용과 비교해 추가하거나 삭제, 변경하는 방식이기에 제대로 동작하지 않은 것이다.

문제는 여기에 있었다.

return query(
              "INSERT INTO contents (cid, userid, corder, type, ccontent) VALUES ($1, $2, $3, $4, $5)",
              [
                content.cid,
                content.userid,
                content.corder,
                content.type,
                content.ccontent,
              ]
            );

여기서 tid 넣는 걸 빼먹어서 생긴 문제였다. 자꾸 tid가 디폴트인 0으로 들어갔던 것.

내가 처음에 tid를 auto increment로 변경하면서 탭을 새로 만들 때 쿼리에서 tid를 뺐다. 디폴트로 자동 증가된 값이 들어가야 하니까.
근데 이것도 insert문이니까 여기서도 빼야 한다고 착각했던 거다. 이건 이미 있는 탭id 값을 받아와서 그 탭에다가 내용을 추가하는 쿼리인데.

결론 : 소감과 앞으로의 계획

소감

예상보다 훨씬 빨리 끝났다. DB를 교체하는 작업이라 오래 걸릴 줄 알았는데.
물론 안에 있는 데이터를 보존하지 않기로 결정했기 때문에 가능한 일이기는 했지만 그래도 이것보단 훨씬 오류파티일 줄 알았는데
당장 저 getContent 안 될 때만 해도 그럼 그렇지... 하면서 굉장히 좌절했었다고
하루만에 끝나버려서 얼떨떨하다 역시 처음부터 겁먹지 말아야겠다

근황과 계획

블로그에 월간 회고를 이미 올리고 있긴 한데, 부트캠프를 하고 있다.
핑계긴 하지만 부트캠프에 정신 팔려서 이 프로젝트에 완전히 손을 놓고 있었다.
이제부터 리팩토링도 하고 더 다듬을 거다. 진짜 할 거다. 이제 진짜 해야지. 제발.
당장 고치고 싶은 문제는

  • 로그인 할 때 시간 오래 걸리고 그 동안 화면에 아무 변화도 없어서 답답함 & 엔터 쳐서 로그인 됐으면 좋겠음
  • SSL 인증서?
  • 디자인 개구림
  • 폰트가 일부만 적용 안 되는 것 같은데
  • 파일명 왜 저따위로 지었지 주석은 왜케 덕지덕지
  • New Column 버튼 눌렀을 때 간헐적으로 안 먹히던데 언제인지 모르겠음
  • sessionStorage is not defined : 관리자 페이지에서 새로고침 했을 때 이거 왜 뜨는거지

배포 주소:
https://easiest-cv.vercel.app/test

profile
웹프론트엔드

0개의 댓글