Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[Web_Hacking] stage6_NON-Relational DBMS 본문

Hack/DreamHack(로드맵)

[Web_Hacking] stage6_NON-Relational DBMS

CIDY 2022. 7. 29. 06:12

*NRDBMS, NoSQL

RDBMS의 경우 복잡하며, 용량의 한계가 있음 -> 이를 해결하기 위해 NRDBMS등장

 

NRDBMS의 경우 SQL을 이용하지 않고 복잡하지 않은 데이터 저장 -> 단순 검색에 최적화된 저장 공간

키-값(Key-Value)을 이용해 데이터를 저장한다.

 

RDBMS의 경우 SQL이라는 정해진 문법이 있었기에 한 가지 언어로 다양한 DBMS를 이용하면 됐었지만, NoSQL의 경우 DBMS의 종류에 따라 구조와 사용 문법을 따로 알아야 한다.

 

(*NoSQL은 Not Only SQL -> SQL을 이용하지 않고 데이터 처리함을 의미)

 

 

 

*MongoDB

JSON형태인 Document를 저장한다.

 

-> 스키마를 따로 정의하지 않아 각 컬렉션(Collection)에 대한 정의가 필요없음

-> JSON형식으로 쿼리 작성

-> _id필드가 Primary Key역할

 

*Collection은 RDBMS의 테이블 느낌이다. (데이터베이스 하위)

 

$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })
> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }

위는 데이터를 삽입/조회하는 쿼리 예시이다.

 

Mongo의 경우 $로 연산자를 쓴다. 기본적인 연산자는 다음과 같다.

 

->비교 연산자

$eq : 지정 값과 같은 값 찾음

$in : 배열 안의 값들과 일치하는 값 찾음

$ne : 지정 값과 같지 않은 값 찾음

$nin : 배열 안 값들과 일치하지 않는 값을 찾음

 

->논리 연산자

$and : 연결된 각 쿼리를 모두 만족하는 문서 반환

$not : 쿼리 식 효과 반전(쿼리 식과 일치하지 않는 문서 반환)

$nor : 각 쿼리를 모두 만족하지 않는 문서 반환

$or : 연결된 각 쿼리 중 하나라도 만족하는 문서 반환

 

->Element

$exist : 지정된 필드가 있는 문서 찾음

$type : 지정된 필드가 지정된 유형인 문서 선택

 

-> Evaluation

$expr : 쿼리 언어 내 집계 식 사용

$regex : 지정된 정규식과 일치하는 문서 선택

$text : 지정된 텍스트 검색

 

 

기본 문법은 다음과 같다. RDBMS에서 배웠던 SQL문법과 비교하면서 알아보자.

 

->SELECT == find

SELECT * FROM account; == db.account.find()

 

SELECT * FROM account WHERE user_id="admin"; == db.account.find({user_id: "admin"})

 

SELECT user_idx FROM account WHERE user_id="admin"' == db.account.find({user_id: "admin"}, {user_idx:1, _id:0})

 

 

->INSERT == insert

INSERT INTO account(user_id, user_pw) VALUES ("guest", "guest"); == db.account.insert({user_id: "guest", user_pw: "guest"})

 

 

->DELETE == remove

DELETE  FROM account; == db.account.remove()

 

DELETE FROM account WHERE user_id="guest"; == db.account.remove({user_id: "guest"})

 

 

->UPDATE == update

UPDATE account SET user_id="guest2" WHERE user_idx=2; == db.account.update({user_id: 2}, { $set: {user_id: "guest2"}})

 

 

 

 

*Redis

키-값(Key-Value)의 쌍을 가진 데이터를 저장한다. 다른 데이터베이스들과는 달리 메모리를 기반으로 한다. 메모리를 이용해 데이터를 저장/접근하기에 읽고 쓰는 작업이 타 DBMS에 비해 빠름 -> 임시 데이터 캐싱 용도로 사용됨

 

$ redis-cli
127.0.0.1:6379> SET test 1234 # SET key value
OK
127.0.0.1:6379> GET test # GET key
"1234"

위는 Redis에서 데이터 추가/조회하는 명령어 예시이다.

 

 

->데이터 조회/조작 명령어

GET GET key 데이터 조회
MGET MGET key [key ...] 여러 데이터를 조회
SET SET key value 새로운 데이터 추가
MSET MSET key value [key value ...] 여러 데이터를 추가
DEL DEL key [key ...] 데이터 삭제
EXISTS EXISTS key [key ...] 데이터 유무 확인
INCR INCR key 데이터 값에 1 더함
DECR DECR key 데이터 값에 1 뺌

 

->관리 명령어

INFO INFO [section] DBMS 정보 조회
CONFIG GET CONFIG GET parameter 설정 조회
CONFIG SET CONFIG SET parameter value 새로운 설정을 입력

 

 

 

 

*CouchDB
JSON형태인 Document를 저장한다. 웹 기반 DBMS이고, REST API형식으로 요청을 처리한다. 

 

POST 새로운 레코드를 추가합니다.
GET 레코드를 조회합니다.
PUT 레코드를 업데이트합니다.
DELETE 레코드를 삭제합니다.

 

$ curl -X PUT http://{username}:{password}@localhost:5984/users/guest -d '{"upw":"guest"}'
{"ok":true,"id":"guest","rev":"1-22a458e50cf189b17d50eeb295231896"}
$ curl http://{username}:{password}@localhost:5984/users/guest
{"_id":"guest","_rev":"1-22a458e50cf189b17d50eeb295231896","upw":"guest"}

위는 CouchDB레코드 업데이트/조회 예시이다.

 

 

CouchDB에서는 서버나 데이터베이스를 위해 여러 기능을 제공하는데, _로 시작하는 URL과 필드는 특수 구성 요소이다.

/ 인스턴스에 대한 메타 정보를 반환합니다.
/_all_dbs 인스턴스의 데이터베이스 목록을 반환합니다.
/_utils 관리자페이지로 이동합니다.

 

/db 지정된 데이터베이스에 대한 정보를 반환합니다.
/{db}/_all_docs 지정된 데이터베이스에 포함된 모든 도큐먼트를 반환합니다.
/{db}/_find 지정된 데이터베이스에서 JSON 쿼리에 해당하는 모든 도큐먼트를 반환합니다.