[PSQL] `user`라는 이름의 테이블 조회 문제

심채원·2023년 5월 21일
0

-deprecated-

목록 보기
7/11

postgreSQL 'user'라는 테이블을 생성 시 조회 문제


서두

최근 사이드 프로젝트를 진행하며 RDBMS로 PSQL을 사용하고 있다.

이전 프로젝트에서 MySQL만 사용해왔기 때문에 오픈소스인 RDBMS 중, MySQL과 1, 2위를 다투는 PostgreSQL을 사용하고, 차이를 경험해보기 위해 결정하였다.

Programmers에서 SQL문 연습하는 부분이 있기도 하고, MySQL를 중점적으로 사용하였기 때문에, SQL은 모두 동일한 줄 알았으나, 우물 안 개구리였던 나...

SQL문 사용이나 Database 구조 등에서 생각보다 많은 차이가 있어 본격적인 시작 전, postgreSQL 전반에 대해 공부하는 시간을 가지면 좋겠다.

User라는 이름의 테이블 조회 문제

서비스를 이용하는 유저 테이블명을 'user'라고 명명했다.

프로젝트 BE 서버에서 회원가입, 로그인하는 과정에서 문제가 발생하는 것은 아니나, postgreSQL에 접속하여 직접 SQL 문을 사용할 때 해당 문제가 발생한다.

내가 확인해본 SQL문은 다음과 같다.
SELECT * FROM user;

위와 같이 SQL을 사용하면, postgres에서 생성한 계정 이름이 담긴 테이블이 나온다.

  1. 이는 user라는 이름의 테이블이 postgres 내장 테이블 중 하나인 pg_user 테이블과 충돌하여 생기는 문제라고 한다.

하지만 내가 pg_user 테이블에서 유저를 검색할 때와 위 SQL문을 통해 user를 검색할 때, 다른 결과가 나온다는 점에 의문점이 들었다.

그래서 또 다른 문제들을 사용해본 결과,
2. USER라는 예약어가 있기 때문에, 위의 쿼리를 사용할 때 문제가 발생하는 것으로 보인다.

select * from pg_user;select * from user;의 차이점은, 실제 쿼리를 실행해 보았을 때, pg_user 테이블은 PSQL에 등록된 모든 유저들을 저장하는 역할을 하는 테이블이고, user 테이블은 해당 Database를 생성한 유저의 값을 조회하는 역할을 하는 것이다.

'user' 테이블 조회 문제 해결법

SELECT * FROM "user"; 
SELECT * FROM public.user;

위 두 가지 방식으로 작성하면 문제 없이 사용자가 생성한 'user'라는 이름의 테이블을 사용할 수 있다.

참고로, PostgreSQL에서 쌍따옴표("")는 대소문자를 구분하는 식별자를 지정할 때 사용된다. string 타입의 Data를 INSERT할 때는 작은 따옴표('')를 사용해야 한다.

TypeORM API를 이용하여 백엔드 서버에서 query 실행 과정 확인 결과, TypeORM에서 자동으로 ... from "user";로 쌍따옴표를 붙이기 때문에 문제가 발생하지 않는다.


[PSQL] 다음에는 PSQL의 스키마와 데이터베이스 개념에 대해 공부할 예정

Reference

pg_user_tble 충돌

profile
인생의 디테일을 추가하는 심채원

0개의 댓글