PostgreSQL 만들며 개밥 먹기

조엘 온 소프트웨어에 처음 들었던 말이다.

난 현재 체커에서 제품책임이사로 근무하고 있다.

SQLGate 현재 버전에 총책임을 맞고 있다. 그렇지만 애석하게도 내가 직접 업무용 SQL을 짠 적이 언제였던가?

그런데 내가 최근에 SQLGate for PostgreSQL을 개발하게 되면서 개밥이란것을 먹고 있다.

진짜 개밥

어떻게 개밥을 먹느냐?

SQLGate는 결국 PostgreSQL 데이터베이스내에 딕셔너리를 잘 찾아서 UI에서사용자가 편리하게 볼 수 있는 툴이다.

그래서 딕셔너리를 엄청 분석한다. 여러 형태로 각 개체를 찾는 SQL을 작성한다.

그런데 아직 나도 SQLGate for PostgreSQL을 만들지 않았기에 다른 툴을 사용하게 되었다. 그 이름하여 PgAdmin4 이다.

PostgreSQL 사용자라면 PgAdmin 으로 개발하면 어려움이 따른다는 것을 잘 알고 있다.

하지만 나는 너무 괴로웠다. SQLGate를 만들면 이정도 쿼리는 개발자를 위해서 해주는게 참 많은데, 나도 만들기 직전이다 보니 다른 툴을 사용하게 되었다.

그런데 너무 너무 불편하다.

먼저 개체 패널,개체 탐색기 이런거 만들기 전에 편집기 부터 만들자

이 목표를 갖게 되었다. 사실 SQLGate 에는 편집기가 가장 기능이 많아서 시간을 나중에 할애하는 경우가 있는데, 이번에는 SQLGate의 편집기 기능이 너무 좋다는걸 이제야 알았다.

그런데!!!

PostgreSQL의 딕셔너리의 테이블이나 뷰는 왜 이리 필드명이 단축해서 만들었는지 가독성이 너무 떨어진다.

그나마 pg_index( Index 정보가 들어 있는 뷰)는 좀 낳다.

개체 정보가 있는 pg_classs 는 진짜 눈에 잘 안들어 온다.
대략 아래와 같다.

https://www.postgresql.org/docs/current/static/catalog-pg-class.html

아래의 코드는 특정 테이블의 컬럼을 추출하는 SQL이다.
하지만 눈에 잘 안들어온다.

SELECT   
a.attname AS COLUMN_NAME,
format_type(a.atttypid, a.atttypmod) as DATA_TYPE,
(NOT a.attnotnull)::INTEGER AS NULLABLE,
FROM pg_class c
INNER JOIN pg_namespace n
ON n.oid = c.relnamespace
INNER JOIN pg_attribute a
ON a.attrelid = c.oid
LEFT JOIN pg_attrdef ad
ON a.attrelid = ad.adrelid
AND a.attnum = ad.adnum
WHERE n.nspname = :P_OWN
AND c.relname = :P_TABLE
AND a.attnum > 0
AND NOT a.attisdropped

아래는 오라클의 테이블의 컬럼을 추출하는 SQL이다.
차이가 난다.

SELECT column_name AS "COLUMN_NAME",
nullable AS "NULLABLE",
data_type AS "DATA_TYPE"
FROM sys.all_tab_columns a
WHERE a.owner = :P_OWN
AND a.table_name = :P_TABLE
ORDER BY a.column_id

물론 아직까지 PostgreSQL을 다른 개체를 몰라서 이렇게 밖에 할 수 없을지도 모르지만… 여튼 PostgreSQL의 딕셔너리의 컬럼들이 너무 가독성이 떨어져서 개발이 더디게 진행되고 있었다.

그렇게 개밥을 흘려 먹던 중에 이래서는 안되겠다 싶어. 새로운 기능을 넣었다.

개체명만 알려줘 자동완성

이제 SQLGate for PostgreSQL의 개발이 조금 더 빨라질것 같아 기분이 좋다.

개밥먹기 1차 성공!!!