Pharo with postgresql
pharo 에서 postgresql 을 접근하려면 p3 라는 패키지를 사용해야 한다. 또한 이 p3 라는 패키지는 ztimestamp 패키지를 필요로 한다. 다음의 순서를 따라 진행해 보자
데이터베이스의 세팅
기본 postgresql 의 데이터베이스 접근 정보는 다음과 같이 세팅된 것으로 정의한다.
- DB Address : SERVER_ADDRESS
- DB Name : pharostudy
- connection id : PGSQL_ID
- connection pw : PGSQL_PW
데이터베이스의 테이블 스키마는 다음과 같다. 이 문서에서는 schema 만 제공하므로 데이터는 맞추어 넣어두도록 하자.
-- TABLE DROP Script
-- DROP TABLE public.system_countries;
-- DROP TABLE public.system_languages;
-- Table: public.system_countries
CREATE TABLE public.system_countries
(
countries_code3 character(3) NOT NULL, -- ISO 국가코드에 따른 3자리 케릭터 국가코드
countries_code2 character(2) NOT NULL, -- ISO 국가코드에 따른 2자리 케릭터 국가코드
countries_name_eng character varying(50) NOT NULL, -- 해당 국가의 영문 표기명
countries_name_local character varying(50), -- 해당 국가의 로컬 명칭
CONSTRAINT system_countries_pkey PRIMARY KEY (countries_code3),
CONSTRAINT system_countries_countries_code2_unique UNIQUE (countries_code2)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.system_countries
OWNER TO PGSQL_ID;
COMMENT ON TABLE public.system_countries
IS 'system 전반적으로 사용되는 국가 정보 http://countrycode.org 를 참고';
COMMENT ON COLUMN public.system_countries.countries_code3 IS 'ISO 국가코드에 따른 3자리 케릭터 국가코드';
COMMENT ON COLUMN public.system_countries.countries_code2 IS 'ISO 국가코드에 따른 2자리 케릭터 국가코드';
COMMENT ON COLUMN public.system_countries.countries_name_eng IS '해당 국가의 영문 표기명';
COMMENT ON COLUMN public.system_countries.countries_name_local IS '해당 국가의 로컬 명칭';
-- Table: public.system_languages
CREATE TABLE public.system_languages
(
languages_code3 character(3) NOT NULL, -- 언어코드 ISO 639-3 에 따른 코드, 3자리 캐릭터로 구성
languages_code2 character(2), -- 언어코드 ISO 639-1 에 따른 코드, 2자리 캐릭터로 구성
languages_name_eng character varying(100) NOT NULL, -- 해당 언어의 영문 표기명
languages_name_local character varying(100), -- 해당 언어의 로컬 명칭
CONSTRAINT system_languages_pkey PRIMARY KEY (languages_code3),
CONSTRAINT system_languages_languages_code1_unique UNIQUE (languages_code2)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.system_languages
OWNER TO PGSQL_ID;
COMMENT ON TABLE public.system_languages
IS 'system 전반적으로 사용되는 언어 정보';
COMMENT ON COLUMN public.system_languages.languages_code3 IS '언어코드 ISO 639-3 에 따른 코드, 3자리 캐릭터로 구성';
COMMENT ON COLUMN public.system_languages.languages_code2 IS '언어코드 ISO 639-1 에 따른 코드, 2자리 캐릭터로 구성';
COMMENT ON COLUMN public.system_languages.languages_name_eng IS '해당 언어의 영문 표기명';
COMMENT ON COLUMN public.system_languages.languages_name_local IS '해당 언어의 로컬 명칭';
테이블을 DB 에 넣었다면 postgresql 의 postgresql.conf 에서 timezone 의 값을 다음과 같이 변경한다.
- GMT 또는
- Asia/Seoul
아마도 기본값이라면 GMT+9 으로 되어있을 수 있는데, 이 경우 ztimestamp 패키지가 오류를 낸다. 그러니 관련된 설정을 변경한 다음에 반드시 DB 를 재시작 해주도록 한다. DB 를 재시작 한 이후에는 별도의 도구(pgadmin 또는 psql 등)를 사용해서 다음의 SQL 구문을 통해 pgsql timezone 의 세팅이 "Asia/Seoul" 이 되었는지를 검토한다.
show timezone;
ztimestamp 의 설치
아래의 코드를 pharo 의 playground 에서 입력한다.
Metacello new
baseline: 'ZTimestamp';
repository: 'github://svenvc/ztimestamp';
load.
이후 System Browser 에서 ZTimestamp 라는 collection 이 생성되어 있는지를 확인한다.
p3 패키지의 설치
현재의 p3 패키지는 별도의 데이터베이스 드라이버 패키지를 같이 설치해야 한다. 일단 P3 부터 설치를 시작해보자.
Metacello new
baseline: 'P3';
repository: 'github://svenvc/P3';
load.
두번째의 glorp 을 설치하는 과정은 패키지가 크기 때문에 시간을 두고 기다려야 한다.(라지만 인터넷만 좋으면 2분을 넘기지는 않는다)
Metacello new
baseline: 'P3';
repository: 'github://svenvc/P3';
load: 'glorp'.
P3 패키지의 테스트
패키지가 설치되었다면 pharo 의 playground 에서 다음의 코드를 실행해서 pharo 에서 database 로의 접속이 정상적인지를 테스트한다.
(P3Client new url: 'psql://PGSQL_ID:PGSQL_PW@SERVER_ADDRESS:5432/pharostudy') in: [ :client |
[ client isWorking ] ensure: [ client close ] ].
이상이 있다면 P3 패키지에서 제공하는 P3ClientTest 클래스를 이용해서 접속과정을 보다 자세하게 디버깅한다. 다음의 코드를 playground 에서 inpectIt 하자.
(P3ClientTest url: 'psql://PGSQL_ID:PGSQL_PW@SERVER_ADDRESS:5432/pharostudy')>>#testTimezone.
DB 에서의 데이터 반환 확인
pgsql 의 접속까지 확인되었다면 간단한 SQL 을 이용해 데이터의 반환을 확인해보자. 다음의 코드를 inpectIt 한다.
(P3Client new url: 'psql://PGSQL_ID:PGSQL_PW@SERVER_ADDRESS:5432/pharostudy') in: [ :client |
[ client query: 'SELECT * FROM system_countries' ] ensure: [ client close ] ].
inpectIt 을 진행하면 Inspector 가 뜨는데 거기서 Variable 중에 Data 부분을 클릭하자. DB 에서 반환받은 모든 값이 다중배열로 들어 있음을 쉽게 확인할 수 있다. P3 github 페이지에서는 2 개의 하부배열을 가지는 배열이라고 소개하고 있다.
참고문서
- https://github.com/svenvc/ztimestamp
- https://github.com/svenvc/P3
- p3 installation : https://pharoweekly.wordpress.com/2017/06/29/p3-is-a-modern-lean-and-mean-postgresql-client-for-pharo/
- ztimestamp report : https://github.com/svenvc/P3/issues/19
- https://m.blog.naver.com/PostView.nhn?blogId=janghohyoung&logNo=221492226452&proxyReferer=https%3A%2F%2Fwww.google.com%2F
- http://www.devkuma.com/books/pages/484
- http://database.sarang.net/?inc=read&criteria=pgsql&subcrit=qna&aid=9259