최근 사이드 프로젝트를 진행하며 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에서 생성한 계정 이름이 담긴 테이블이 나온다.
하지만 내가 pg_user 테이블에서 유저를 검색할 때와 위 SQL문을 통해 user를 검색할 때, 다른 결과가 나온다는 점에 의문점이 들었다.
그래서 또 다른 문제들을 사용해본 결과,
2. USER
라는 예약어가 있기 때문에, 위의 쿼리를 사용할 때 문제가 발생하는 것으로 보인다.
select * from pg_user;
와 select * from user;
의 차이점은, 실제 쿼리를 실행해 보았을 때, pg_user 테이블은 PSQL에 등록된 모든 유저들을 저장하는 역할을 하는 테이블이고, user 테이블은 해당 Database를 생성한 유저의 값을 조회하는 역할을 하는 것이다.
SELECT * FROM "user";
SELECT * FROM public.user;
위 두 가지 방식으로 작성하면 문제 없이 사용자가 생성한 'user'라는 이름의 테이블을 사용할 수 있다.
참고로, PostgreSQL에서 쌍따옴표("")
는 대소문자를 구분하는 식별자를 지정할 때 사용된다. string 타입의 Data를 INSERT
할 때는 작은 따옴표('')
를 사용해야 한다.
TypeORM API를 이용하여 백엔드 서버에서 query 실행 과정 확인 결과, TypeORM에서 자동으로 ... from "user";
로 쌍따옴표를 붙이기 때문에 문제가 발생하지 않는다.