Pharo with postgresql

From 흡혈양파의 인터넷工房
Revision as of 07:47, 17 December 2019 by Onionmixer (talk | contribs) (오타 수정)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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 개의 하부배열을 가지는 배열이라고 소개하고 있다.


참고문서