relation "user" does not exist
오류 해결하기백엔드 개발 중 relation "user" does not exist
오류를 만났습니다. PostgreSQL에서는 대소문자나 스키마 이름 등 세부 사항이 쿼리에 영향을 미칠 수 있어, 이를 해결하기 위해 몇 가지를 시도해보았고, 이번 포스팅에서는 문제의 원인과 해결 과정을 정리했습니다.
로그인 API에서 user
테이블을 쿼리하는 과정에서 아래와 같은 오류가 발생했습니다.
Login error: error: relation "user" does not exist
PostgreSQL에서 "relation does not exist" 오류는 특정 테이블이나 컬럼이 존재하지 않거나, 대소문자/스키마 이슈로 인해 발생할 수 있습니다. 저의 경우 테이블 이름이 정확하게 user
임에도 불구하고 오류가 발생했기 때문에 다른 가능성을 살펴보았습니다.
물론 user
는 예약어이기 때문에 그대로 적어서는 안된다는 것을 잘 알고 있었고, 그래서 큰 따옴표 (”
)를 넣어 테이블을 제대로 명시해주었는데, 그래도 해결되지 않았기에 문제를 찾아보았습니다.
오류의 원인을 찾기 위해 다음과 같은 단계를 거쳤습니다.
psql
에서 \dt
명령을 통해 user
테이블이 데이터베이스에 실제로 존재하는지 확인했습니다.'SELECT * FROM "user" WHERE id = $1'
로 수정해보았습니다.user
테이블이 public
이 아닌 다른 스키마(main
)에 만들어두었다는 것을 기억해냈습니다. (db 잘 다룰 줄 몰라서… 새로운 스키마를 만들어야 하는 줄 알고 초기에 main
스키마를 만들어서 그 안에 구현해두었습니다……)어쟀든 테이블이 main
스키마에 있었기 때문에 스키마 이름을 명시한 쿼리로 수정하여 문제를 해결할 수 있었습니다.
// repositories/authRepository.js
import { pool } from '../db/db.js';
export const findUserById = async (id) => {
const result = await pool.query('SELECT * FROM "main"."user" WHERE id = $1', [id]);
return result.rows[0];
};
이렇게 스키마를 명시하니 오류가 사라지고 정상적으로 쿼리가 수행되었습니다.
이 오류는 스키마를 잘못 지정해 발생한 것이었습니다. PostgreSQL에서는 특정 테이블이 public
이외의 스키마에 있을 경우 반드시 스키마 이름을 명시해야 한다는 점을 꼭 기억해두어야겠습니다. (다음번에는… public
스키마에 db를 구축해야 할 것 같습니다);;