Vercel에서 postgresql을 무료로 제공하고 있어서 이걸로 데이터베이스를 변경하기로 한다.
이미 Next.js를 Vercel에서 배포하고 있으니 같이 배포하면 얼마나 편한가.
Vercel에서 제공하는 DB들 중 원래 여기서 사용하던 MariaDB에서 갈아타기 제일 용이한 DB가 postgresql이었다.
클라우드타입의 프리티어는 매일 새벽에 서버가 중지되어서 매일 다시 켜줘야 한다는 문제도 있고.
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)"
이런 식이었다.
원래 각 탭마다 고유하게 부여하는 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 안 될 때만 해도 그럼 그렇지... 하면서 굉장히 좌절했었다고
하루만에 끝나버려서 얼떨떨하다 역시 처음부터 겁먹지 말아야겠다
블로그에 월간 회고를 이미 올리고 있긴 한데, 부트캠프를 하고 있다.
핑계긴 하지만 부트캠프에 정신 팔려서 이 프로젝트에 완전히 손을 놓고 있었다.
이제부터 리팩토링도 하고 더 다듬을 거다. 진짜 할 거다. 이제 진짜 해야지. 제발.
당장 고치고 싶은 문제는