로직을 짬에 있어서 회의가 필요했는데,
아마 오늘 이사가 있던 것인지 바쁘셔서 회의가 진행이 안됐다.
어느정도 다 짜놓은 것이 있었기에,
1. 회의 결과에 따라서 모조리 다 날려버리던가
2. 조금만 변형해서 사용하던가
3. 전부 다 사용하던가
세개의 선택지가 남아있었는데, 딜레이가 생겨가지고 아. 그럼 다른거부터 하자! 라고 해서
오라클과 전쟁을 펼쳤다...
지금까지 사용해본 DB는 MySQL MongoDB였는데 얜 또 참 다르더라...
나같은 경우에는 지금 ORM을 TypeORM
을 사용하고 있었다.
그래서 ORM과 DB를 묶기 위해서는 라이브러리를 설치를 해야만 하는데
MySQL 같은 경우는 mysql2
PostgreSQL 같은 경우에는 pg
Oracle같은 경우에는 oracledb
을 깔아서 사용한다.
근데 여기서 차이점이 있었는데, MySQL같은 경우에는 그냥 알아서 연결이 됐다.
근데 오라클은 안돼
그래서 에러로그를 잘 보니 뭐 다운로드를 받으란다.
https://www.oracle.com/database/technologies/appdev/quickstartnodejs.html#macos-tab
현재 회사에서 사용하는 맥북의 경우는 인텔맥이라 위의 글을 따라서 진행을 했다.
https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html
(이건 패키지를 깔 수 있는 링크다, 회원가입 필수)
대충 패키지를 깔면 되는 줄 알았는데?
그래도 안돼 -_-
패키지를 열어보니 jar라고 적혀있다.
어, 이거 자바....?
그렇다, 과거에 ELK를 다룰 때 로그스태시가 자바로 돌아가서 jar 파일을 넣어서 돌렸던 적이 있었는데, 얘도 똑같은 것이였다..^^
다이렉트로 당근꺼냈다
아무튼 그래도 또 안된다.
왜?
오라클 클라이언트를 연결해줘야한단다.
import * as oracledb from 'oracledb';
oracledb.initOracleClient({ libDir: process.env.HOME + '/Desktop/api/oracle' });
// dmg 파일로 패키지를 다운로드받고 작업하는 폴더 내부로 넣어버렸다.
// 다운로드 위치에서도 쓸 수 있긴 한데 나중에 도커로 말아버릴거라 안으로 넣어놨다.
이렇게 했더니 드디어 오라클DB와 커넥션을 할 수 있었다(...)
아, 오라클같은 경우에는 database가 아니라 sid
를 쓰는 경우가 있었는데
그때는 sid
로 바꿔서 넣어주면 정상적으로 커넥션을 할 수 있다!
대충 아래처럼 쓰면 돌아감:>
type: 'oracle',
host: configService.get('DEV_DB_HOST'),
port: configService.get('DEV_PORT'),
sid: configService.get('DEV_DB_SID'),
username: configService.get('DEV_DB_USERNAME'),
password: configService.get('DEV_DB_PASSWORD'),
공급사의 DB를 사용하는데 그게 오라클이였고, 문서에 프로시저라는 클래스모양으로 나와있었다.
에헤헤 Entity 이름이 프로시저구나!!
응 아냐, 진짜 완전 틀렸어
대충 프로시저는 SQL에서 사용할 수 있는 함수고, 뭔가 정보를 은닉(?)할 수 있는 장치라고 볼 수 있다.
단점은 워낙 복잡하기 때문에, 유지보수를 하는 것이 정말 극악의 난이도라는 것인데..
반대로는 정말 잘 짜놓으면 참 오래 쓸 수 있다는 생각도 들었다.
(1000줄 넘던데...?)
아무튼 문제는 뭐다?
실행을 못하겠어
아니 일반적인 쿼리같은거라면 뭐 그냥 쿼리 땅 치면 되는데
이건 함수같은거니까 결국 함수를 호출을 해야하는건데
도무지 찾아도 보이지가 않는 것이였다. (TypeORM자료가)
그러다가 이 글을 봤다.
프로시저 사진이 있었던 글 링크
아!!!!!!!
dataSource.manager.query("CALL 프로시저 이름(:인자,:인자,:인자)",[입력값,입력값,입력값]);
이렇게 쓰는거구나!!
하고 바로 쳤는데 또 안돼
:로 정의를 하는데 :가 왼쪽에 붙어있어야 하는데 오른쪽에 있더라...
그래서 땅 쳤더니 프로시저 호출이 되면서 정상적으로 데이터가 들어가는 것을 확인할 수 있었다.
(재택이라 다행이지 사무실이였으면 혼자 책상치는거 누가 봤을 듯)
그리고 위에 좀 이상한게 하나가 있는데, 바로 dir:oracledb.BIND_OUT 이라는 것이 있다.
저게 뭐냐면 아마 프로시저의 영향인 것 같은데, 프로시저(함수)의 결과값을 반환해준다.
그래서 OUT으로 붙어있는 인자같은 경우, 위치를 맞춰가지고 이렇게 넣어주면 된다.
import * as oracledb from 'oracledb';
{ type: oracledb.DB_TYPE_VARCHAR, dir: oracledb.BIND_OUT },
그럼 쿼리의 결과로 OUT에 있던 값들이 뿅하고 배열 모양으로 튀어나오더라
해결!
새로운 서버를 만들었다보니, 가급적 최신으로 작업을 하고자 v0.3.9을 사용하고 있다.
그러면서 connotion이 사라지고, dataSource라는 것으로 변경됐는데 좋은지 잘 모르겠다(...)
대충 이해를 한 것으로는 DB와 끊임없이 연결을 하고 있는 것이 아니라
메소드가 호출될 때 연결이 됐다가 끊어진다 라는 것으로 파악하고 있는데
기존에 NestJS에서 databaseModule을 만들어서 사용하는 이유가 싱글톤을 위함으로 알고 있는데
저렇게 외부로 빼서 사용한다면 그게 싱글톤이 유지가 되는지...?
그리고 DB 연결을 굳이 끊어야하는 이유가 있는지 솔직히 모르겠다;
내가 알기로는 처음 호출 할 때 인덱스에 맞게 정렬이 되면서 그 이후부터 같은 쿼리 요청을 하면 빨라지는데
연결을 끊어버린다면 저게 유지가 되나 싶기도 하고...
커넥션과 데이터소스는 RDBMS에서 종종 쓰는 용어인 것 같아서 아마 이쪽 공부를 하다보면 해결책이 나올 것 같긴 하다.
(그래서 난 무엇을 써야하는지 모르겠다고오오)
오늘은 뭔가 회의를 하지 못해서 멍청해질 뻔 했는데,
하루의 시간을 거의 다 소모해서 중요했던 작업을 마무리할 수 있었다.
도대체 린트설정이 또 왜 안먹는지는 모르겠는데(ㅠㅠ) 이것을 좀 바로 잡고
테라폼이던 무언가를 써서 회사의 k8s 클러스터 내부에 넣기만 하면 이쪽 작업은 대부분 마무리가 될 것 같다.
이제 정말 끝이 보인다고 해야하나, 빛이 보인다고 해야하나? 갑자기 광명이 보이는 것 같다!
앞으로 해결할 것들
정말 정신없이 달려가고 있는데...
할 수 있네?
할만한데,,,?