https://www.inflearn.com/course/node-js-database/dashboard
orientdb로 웹앱제작 1 : 소개
Why OrientDb? 라는 공식 홈페이지의 페이지를 따라가며, orientDB의 장점을 하나하나 설명해주었는데, 생소한 개념들도 많아서 당장 모두 이해하기는 어려울 것 같다. 그나저나 공식 홈페이지를 들어가니 해당 페이지는 삭제된 듯 하다...
orientdb로 웹앱제작 2 : 설치
orinetdb는 java를 기반으로 만들어졌기 때문에 java가 기본적으로 필요하다. > 없다면 java jdk를 다운받자.
위의 링크에서 OS에 맞는 파일을 다운받아 압축을 푼다. 나는 윈도우로 진행하였다.
압축을 푼 파일을 적당한 위치로 옮긴다. 나는 C 드라이브 밑으로 옮겼다. - 운영체제에 따라 설치 방법이 조금씩 다르다.
그리고 cmd를 열어서 C드라이브 > orientdb > bin 폴더로 이동한 후 server.bat 을 입력하면 orientdb가 실행된다. 처음 실행 시에는 루트 비밀번호를 지정해야 한다.
제대로 서버가 작동되는 지 확인하기 위해 localhost:2480 에 접속해보면 orientDB가 기본적으로 제공하는 관리자 화면을 확인할 수 있다.
o2 라는 이름의 DB를 새로 만들어보자. 생성이 완료되면 해당 db에 관리자 권한으로 이것저것 제어를 할 수 있는 화면으로 이동된다.
orientdb로 웹앱제작 3 : 기본 사용법
orientDB의 클래스 == RDB의 테이블
orientDB 클래스의 Property == RDB 테이블의 column, field
Schema 탭으로 이동해 New class 버튼을 눌러 클래스를 생성하라고 하는데, 해당 버튼이 없어서 new Generic 버튼을 이용해서 topic이라는 클래스를 추가했다.
topic 클래스를 눌러서 들어간 후, String 값을 가지는 title 이라는 property를 추가했다. 이때 Mandatory에 체크를 해주어서 사용자가 꼭 입력해야하는 값이라는 명시를 해주었다.
New Record 버튼을 통해 행을 추가할 수 있다.
행을 추가할 때 Add field를 통해서 해당 행에서만 property를 추가할 수 있다.
추가한 데이터를 확인하려면 Browse 탭으로 돌아와 SELECT * FROM topic; 명령을 run 하면 된다.
하지만 그래프db 관계성을 사용하기 위해선 edge를 사용해야 한다.
logout후 GratefulDeadConcerts 라는 orientdb에서 기본적으로 제공하는 db에 접속한다.
Graph 탭에서 SELECT * FROM V 하고 run을 하면 그래프가 출력된다. 해당 그래프의 node 하나가 테이블의 행 하나를 뜻한다. 그리고 edge를 통해 관계성이 연결되어 있는데, 관계형 데이터베이스에서는 JOIN 방식으로 표현하는 것을 이렇게 표현하는 것이라고 한다.
orientdb로 웹앱제작 4 : orientjs설정
javascript를 이용해서 orientdb 제어하기 > orientjs 사용
설치
npm install orientjs --save
강의에서 나온 깃허브 주소를 들어가봤는데 오래된 강의라 그런지 내용이 바뀌어버렸다..!
https://github.com/orientechnologies/orientjs
일단 강의에 나온대로 따라해보았다.
var OrientDB = require('orientjs');
var server = OrientDB({ //configuring client
host: 'localhost',
port: 2424,
username: 'root',
password: '1111'
});
var db = server.use('os2'); //Using an existing database
db.record.get('#34:0').then(function(record){ //Loading a record by RID
console.log('Loaded record: ', record);
})
여기서 RID는 orinetDB의 유일무이한 식별자이다.
💣 Unhandled rejection OrientDB.RequestError: Session open with token flag false is not supported anymore please use token based sessions
record.get 방식에서 에러가 발생한다. 더는 지원하지 않는 방식이라고 하는데.. 그래서 공식 깃허브에 올라온 예제대로 연결을 시도하였다.
const OrientDBClient = require("orientjs").OrientDBClient;
OrientDBClient.connect({
host: "localhost",
port: 2424
}).then(client => {
client.session({
name: "o2",
username: "root",
password: "8818"
})
.then((session) => {
console.log('session open');
session.close().then(() => {
return client.close()
}).then(() => {
console.log('Client closed');
})
})
})
// OrientDBClient.connect({
// host: "localhost",
// port: 2424
// }).then(client => {
// client.session({
// name: "o2", username: "root", password: "8818"
// })
// .then(session => {
// console.log('session')
// return session.close();
// });
// return client.close();
// }).then(()=> {
// console.log("Client closed");
// });
처음에는 단순히 아래의 방식처럼 두 개의 코드를 잇기만 했는데, Error: pool is draining and cannot accept work 라는 에러가 났다. 구글링 해봤더니 session이 fire되기 전에 client를 먼저 close 해버려서 생긴 오류라고 한다. client를 closing 해버리면서 모든 pool이 같이 닫힌 것이다.
그래서 위의 코드와 같이 변경을 했더니 console에 session이 잘 출력되는 것을 확인할 수 있었다.
orientdb로 웹앱제작 5 : SELECT
CREATE, READ, UPDATE, DELETE => CRUD
여기도 이전 섹션처럼 강의의 예제를 그대로 따라하면 Unhandled rejection OrientDB.RequestError: Session open with token flag false is not supported anymore please use token based sessions 에러가 발생한다. 공식 깃허브에 있는대로 쿼리를 날려보자..
SELECT
OrientDBClient.connect({
host: "localhost",
port: 2424
}).then(client => {
client.session({
name: "o2",
username: "root",
password: "8818"
})
.then((session) => {
session.query("select from topic") //query 보내기
.on("data", data => {
console.log(data);
})
.on('error', (err)=>{
console.log(err);
})
.on("end", () => {
console.log("End of the stream");
session.close().then(() => {
return client.close()
}).then(() => {
console.log('Client closed');
})
})
})
})
그러면 위와 같이 출력이 된다.
특정 rid값을 갖는 row만 출력하고 싶다면, 다음과 같이 params를 사용해야 한다.
OrientDBClient.connect({
host: "localhost",
port: 2424
}).then(client => {
client.session({
name: "o2",
username: "root",
password: "8818"
})
.then((session) => {
session.query("select from topic where @rid = :id", {params: { id: "#34:0"}})
.on("data", data => {
console.log(data);
})
.on('error', (err)=>{
console.log(err);
})
.on("end", () => {
console.log("End of the stream");
session.close().then(() => {
return client.close()
}).then(() => {
console.log('Client closed');
})
})
})
})
잘 출력되는 것을 확인할 수 있다!
orientdb로 웹앱제작 6 : INSERT&UPDATE&DELETE
INSERT
깃허브를 보면 Idempotent SQL statement는 Query를 사용하고, Idempotent or non idempotent SQL statement는 Command를 사용한다고 하는데
이 indempotent라는 단어가 생소해서 찾아보니 '멱등성'이라고 한다.
전산학이나 수학에서 사용하는 용어로 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질, 연산을 여러 번 반복하여도 한 번만 수행된 것과 같은 성질을 의미한다. 즉 메서드가 여러 번 실행되어도, 결과는 같으므로 안전하게 사용할 수 있는 성질이기도 하다.
https://june0122.github.io/2021/08/05/term-idempotent/
그래서 INSERT 처럼 값을 변화시키는 sql문의 경우에는 session.query() 가 아닌 session.command()를 사용하는 것 같다.
http://orientdb.com/docs/last/orientjs/Session.html#command
여기 docs도 참고하자..
💣 쉽게 되는 게 없네.. 이번엔 parsing error가 난다. 문법은 다 맞는 것 같은데 대체 뭐가 문제인 걸까...?
Unhandled rejection OrientDB.RequestError: Error parsing query:
INSERT INTO topic (title, description) VALUES (:title, :desc)
^
Encountered " "(" "( "" at line 1, column 19.
라는데.. 저 sql문 그대로 orientdb studio 에서 run하면 잘만 만들어지는데.. 하...
시간도 없는데 사용하지도 않을 orientdb 연결하는 데 시간 쏟기 아까워서 일단 지금은 pass 하기로.. 찾아보니까 orientdb를 많이 사용하지도 않는 것 같다. 하이브리드라서 오류가 많다고..