<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Pharo_with_postgresql</id>
	<title>Pharo with postgresql - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Pharo_with_postgresql"/>
	<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Pharo_with_postgresql&amp;action=history"/>
	<updated>2026-04-21T09:32:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://workspace.onionmixer.net/wiki/index.php?title=Pharo_with_postgresql&amp;diff=1505&amp;oldid=prev</id>
		<title>Onionmixer: 오타 수정</title>
		<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Pharo_with_postgresql&amp;diff=1505&amp;oldid=prev"/>
		<updated>2019-12-17T07:47:44Z</updated>

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