반응형

일단 내 상황은 이렇다.
사용해본 DB는 MSSQL을 15년 이상 주력사였고 최근 Oracle(과거 SI 잠깐 했을 당시에 2년 정도 토드사용해본게 전부였지만 최근 다시 사용) 그 외 잡다한 MySql, MSACCESS(ㅋㅋㅋ), DB같지도 않은 파라독스(S모 카드사에서 처음 접하고 개깜놀) 대충 이렇다.

이 상황에서 처음 PostgreSQL을 설치해보았다.
그리고 첫 실행을 하고자 설치된 폴더로 이동해보니 딱 저렇게 보인다.
느낌적으로 pgAdmin 4라는 툴이 MSSQL의 SQL Server Management Studio스러워 보인다.
SQL Shell은 아마 커맨드 라인으로 실행해주는 paAdmin 4일듯 싶다.

 

pgAdmin 4를 냅다 실행해본다.

 

음 역시나가 역시다.
탭 영역을 보니 대시보드가 있고 그 옆에 프로퍼티, 시퀄 등등등이 있다. 
눈깔을 좌측 트리로 이동해보자 Servers가 있다.


MSSQL처럼 UI가 마음에 드는구나.
트리를 펼쳐서 PostgreSQL 16을 눌러보자.
팝업윈도우가 뜬다.


아까 설치할 때 기록한 비번을 넣어준다.


이러니 Databases와 Roles, Tablespaces 등등 기본 시스템 DB쪽으로 추정된다.


자 그럼 이제 내 디비를 만들어봐야겠제?
PostgreSQL 16에서 마우스 오른쪽을 눌러본다. Create가 있다 그 옆에 Database가 있구나.
정말 직관적이다.(MSSQL 이용자라면 너무 쉽다.)
있어야 할 곳에 기능이 있다. 그게 MS의 최대 장점 아닌가?


Database를 선택하니 역시나 창이 하나 뜬다.
뻔하다. DB명 만들어주고 저장하면 그만이다.
그 옆 Definition, Security 등을 눌러봤지만 뭘 하는건진 아직 모르겠다. 
일단 DB나 만들자. Save 전에 SQL탭이 눈에 들어온다.
뻔하다. 내가 만드는 액션의 SQL문이겠지. 그리고 저 SQL문은 SQL Shell 프로그램에서 동작시키거나 SQL management처럼 쿼리분석기에서 실행시킬 수 있을것이다.
그냥 저런것도 보여주는구나 하고 넘기자. SAVE

 

Save를 하고 나니 내 첫 PostgreSQL DB가 생성된게 보인다.


그럼 테이블을 만들어 보자.
테이블이야 뭐 뻔하다 Schemas에 있겠지
역시나 Tables가 있다.
만들려면? 뻔하지 마우스 오른쪽 눌러보자.
Create가 나온다. 그리고 Table


그러면 Database 처럼 Table 생성창이 뜬다.
이름은 게시판이 제일 만만하니 board_tbl이라 정해준다.
그다음은? 당연히 컬럼이다. General 옆에 Columns가 보인다. 그거 누른다.


난 매우 간단하게 기준키 필드는 integer, 제목은 varchar, 내용은 text나 varchar로 만들고자 한다.
그런데 varchar가 안보인다.
이건 좀 당황스럽다.


chatGPT센세에게 물어보고 싶지만 내가 쓰는 버전은 3.5버전이므로 최신 정보는 알 수 없을 것 같다.
claude.ai 티쳐에게 물어보자.

16버전에선 varchar대신 text를 사용하는게 좋단다.
초기 버전엔 varchar를 제공했지만 요즘은 그냥 닥치고 text쓰란다.
그럼 varchar와 text가 아무런 차이점이 없다란 말인데... 흠..일단 믿어보자.

그런데 text[] 이건 뭐지? 배열인데...
또 claude.ai 티쳐에게 퀘스쳔

{'태그1', '태그2'...}이런식을 저장하는 자료형이란다.
대충 PostgreSQL이 일반적인 RDBMS가 아니라는말은 익히 들어왔었던지라 지리정보나 그따위 정보에 특화된 필드가 아닐까 추측해본다.
조금 구글링 해보니 JSON형도 있던데... 음... 그렇군 
옥히 도키

b_idx는 integer로 PK로 설정하고 다른 제목과 내용 역시 Not NULL로 설정한다. 기본값은 없다.

Save


저장하고 나니 역시나 좌측 트리 영역에 테이블과 필드가 잘 나타난다.


이제 데이터를 insert해보자
ANSI문법은 언제나 통하니 간단하게 insert문을 실행해보자.
드래그 후 F5(execute script)를 실행하니 error가 뜬다.


이런.. b_title인데 필드명 오타를 냈나보다.
보자.. 테이블 스키마 수정은... 뭐 뻔하지 마찬가지로 테이블의 board_tbl에서 마우스 우측 눌러 Properties를 누르면 되겠지


역시나다. b_titile 오타 i를 하나 제거하자
Save


저장하기 전 SQL문을 구경해보자
좀 특이하다. 이게 ANSI문법인가.
MSSQL과는 좀 다르다.
ALTER TABLE IF EXISTS.... RENAME 뭐 그런가보다.


다시 SQL문을 실행하자.
그 전에 나는 그냥 select 문도 추가하고 F5를 실행하였는데 오류가 난다.
아마 오라클처럼 ;를 넣어줘야 할 것 같다.


정상적으로 insert, select가 실행된다.
다시 한 번 실행해보면 b_idx값이 똑같이 1로 넣으니 당연히 duplicate 오류가 뜬다.


2로 바꾸고 실행하면 잘 넣어지고 잘 보여진다.

일단 첫인상.
매우 직관적이다.
MSSQL을 사용해봤다면 토드를 사용할 때와 다르게 친숙한 느낌을 받을 수 있다.
여기에 뭐랄까 script같은 느낌도 들고...
조만간 회사 오라클 DB를 PostgreSQL로 바꾸게 될 지 모르겠다.
대공사겠지만.

반응형
Posted by Hippalus
,

반응형

바쁜분들을 위해 그리고 기초는 있다란 가정하에 3줄 요약
1. npm install oracledb@5.2.0

2. 아래 링크로 접속하여 client 설치 후 yum으로 install
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
자신의 오라클 버전에 맞는 파일 다운로드(11g인 경우 Version 11.2.0.4.0의 RPM파일 다운로드)
 yum install oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

3. vi ~/.bashrc를 입력해서 환경변수 설정
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:${LD_LIBRARY_PATH}

안 바쁘면 이제 시작~

보통 node.js로 oracle로 db connection을 하려면 npm install oracledb로 oracledb를 설치 후 아래와 같이 하기 마련이다.
dbConfig.js에 DB 연결 정보를 설정해 두고

// Oracle DB 연결 정보
const dbConfig = {
    user: 'myid',
    password: 'pwd123',
    connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 200.100.80.10)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = pos)))"
  };

  module.exports = dbConfig;


이를 require로 불러와서 getConnection으로 연결 후 DB조회, 처리
 

const
oracledb = require('oracledb');
const dbConfig = require('./dbConfig.js'); // dbConfig 파일을 불러옴

oracledb.getConnection(dbConfig, (err, connection) => {
    if (err) {
      console.error('Error connecting to Oracle:', err.message);
      process.exit(1);
      return;
    }
    console.log('=======');
    // 연결이 성공한 경우, 쿼리 실행
    connection.execute(
      'SELECT * FROM YOUR_TABLE', // 적절한 테이블명으로 변경
      [], // 바인드 변수 배열 (여기서는 사용하지 않음)
      { resultSet: true, outFormat: oracledb.OUT_FORMAT_OBJECT },
      (err, result) => {
        if (err) {
          console.error('Error executing query:', err.message);
        } else {
          console.log('Query result:', result.rows);
        }
 
        // 연결 종료
        connection.close((err) => {
          if (err) {
            console.error('Error closing connection:', err.message);
          } else {
            console.log('Connection closed.');
          }
        });
      }
    );
  });


그런데 안된다.
절대 안된다.

thin모드를 지원하지 않는단다.
도대체 왜??????

자랑스럽게 node oracledb 6.0에선 Thin mode를 지원한다고 발표한 상태다.


설치된 oracledb 모듈의 버전도 6.0을 넘어 6.2였다.

이윤즉슨 oracledb 모듈 버전이 6.0으로 올라서면서 thin을 지원하지만 
oracle 11g는 6.0으로 올려도 지원 자체가 불가능하다.
시간 많으면 여기가서 읽어보시라.
https://node-oracledb.readthedocs.io/en/latest/user_guide/appendix_a.html#id1

thin 모드와 thick 모드가 궁금하다면 chat gpt 센세에게 물어보면 잘 가르쳐 주신다.



결론은 node.js가 설치된 서버에 별도의 client를 설치해줘야만 한다.
또한 6.2버전을 thick 모드를 지원하는 5.2.0으로 다운그레이드를 해줘야 한다.
아니면 초장부터 5.2.0으로 설치 하던지
이렇게 말이다.
npm install oracledb@5.2.0

일단 oracledb는 5.2.0으로 설치완료했고
다음엔 망할 클라이언트 설치다.
바쁘면 그냥 아래 링크 눌러 다운받으면 된다.
* 오라클 11g용 Instant Client rpm파일의 다이렉트 링크는 아래와 같다.
https://download.oracle.com/otn/linux/instantclient/11204/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

바쁘지 않으면 천천히 읽어 내려가면 된다.

https://oracle.github.io/node-oracledb/INSTALL.html#prerequisites

3.2.1을 보면 Node-oracledb Installation on Linux x86_64 with Instant Client ZIP files가 보일것이다.
이걸 선택해주자.

 

그럼 node-oracledb.readthedocs.io란 사이트로 이동 할 것이다.
https://node-oracledb.readthedocs.io/en/latest/user_guide/installation.html#instzip

2.4.3.1. Oracle Instant Client ZIP Files에 x86-634 64-bit가 보일것이다.

이걸 선택하면 최종 종착지는 oracle.com이다.
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

여기서 자신의 오라클 DB 버전에 맞는걸 다운받아 주면 된다.
내 경우 oracle 11g이므로 version 11.2.0.4.0을 눌러 Instant Client Package (RPM)을 다운 받았다.
RPM은 Redhat Package Manager의 약자로 Windows를 예를들면 setup.exe와 비슷하다고 볼 수 있다
그래야 yum으로 리눅스에서 install이 가능하기 때문인데 
YUM은 Yellowdog Update Manager의 약자로 RPM의 단점인 의존성 문제를 해결하기 위해서 제공되는 것으로 특정 패키지를 설치할 때 의존성이 있는 다른 패키지들을 자동으로 먼저 설치해주는 지능적인 툴이다.


다운받은 파일을 적당한 곳에 복사해 두고 해당 디렉토리에서 yum을 이용해 rpm파일을 설치한다.
 yum install oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

혹시 다른 rpm파일을 잘못 설치했다면 리스트로 확인도 가능하고 제거도 가능하니 당황하진 말자
 yum list installed

제거하는 방법은
yum remove 패키지이름


마지막으로 환경변수를 설정해줘야 한다.



 vi ~/.bashrc 를 입력하자

export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:${LD_LIBRARY_PATH}
이렇게 입력해주고 :wq로 저장 후 나가준다.
제대로 설정되었는지 확인하려면 echo $LD_LIBRARY_PATH 를 입력해보자
/usr/lib/oracle/11.2/client64/lib: 
이렇게 뜬다면 정상이다.

이제 클라이언트 설치와 환경변수까지 모두 다 설정해줬다.
다시 node.js로 dbconnect 파일을 실행해보면 정상 접근이 가능한 걸 확인 할 수 있을것이다.

반응형
Posted by Hippalus
,

반응형

DROP SEQUENCE DB.MY_SEQ;

CREATE SEQUENCE DB.MY_SEQ
  START WITH 2393359
  MAXVALUE 999999999999
  MINVALUE 1
  CYCLE
  CACHE 1000
  NOORDER;

대충 이런식으로 MY_SEQ를 만들었다 치자.
그럼 MAPPER의 XML에서 MY_SEQ.nextval를 이용하여 대충 이런식으로 사용하면 되겠다.

<insert id="mailInsert" parameterType="dMap">
insert into mail (seq, email)
select
MY_SEQ.nextval, 
<choose>
<when test='!email.equals("")'>
, #{email} 
</when>
</choose>
from .....
</insert>

 

 

반응형
Posted by Hippalus
,