Background : Non-Relational DBMS
Background : Non-Relational DBMS
RDBMS는 스키마를 정의하고 해당 규격에 맞는 데이터를 2차원 테이블 형태로 저장한다. 이는 복잡할 뿐만 아니라, 저장해야 하는 데이터가 많아지면 용량의 한계에 다다를 수 있다.
이러한 단점을 해결하기 위해 등장한 것이 Non-Relational DBMS (NRDBMS, NoSQL) 이다.
관계형 데이터베이스는 SQL Injection 이 발생할 수 있었는데 NoSQL 또한 이러한 문제가 발생 할 수 있다.
NRDBMS 비관계형 데이터베이스
NoSQL은 SQL를 사용하지 않고 복잡하지 않은 데이터를 저장해 단순 검색 및 추가 검색 작업을 위해 최적화된 저장 공간인 것이 특징이자 차이점이다. 키 - 값 을 사용해 데이터를 저장하는 차이점도 존재한다.
RDBMS는 SQL이라는 정해진 문법을 통해 데이터를 저장하기 때문에 한가지의 언어로 다양한 DBMS을 사용할 수 있다.
하지만 NoSQl은 Redis, Dynamo, CouchDB, MongoDB등 다양한 DBMS가 존재하기 때문에 각각의 구조와 사용 문법을 익혀야하는 단점이 있다.
MongoDB
MongoDB는 JSON형태인 도큐먼트(Document)를 저장한다. MongoDB 특징
- 스키마를 따로 정의하지 않아 각 콜렉션 (Collection) 에 대한 정의가 필요 없다.
- JSON 형식으로 쿼리를 작성할 수 있다.
- _id 필드가 Primary Key 역할을 한다.
다음은 MongoDB에서 데이터를 삽입하고 조회하는 쿼리의 예시이다.
$mongo
>db.user.insert({uid:'admin', upw:'secretpassword'})
WriteResult({"nInserted" : 1})
>db.user.find({uid:'admin'})
{"_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }
각 DBMS에서 “status”의 값이 “A”고 “qty”값이 30보다 작은 데이터를 조회하는 쿼리는 다음과 같다
| DBMS | Query |
|---|---|
| RDBMS | SELECT * FROM inventory WHERE status = “A” and qty <30; |
| MongoDB | db.inventory.find({ $and ;[ {status: “A”}, {qty : { $ly:30} } ] } ) |
MongoDB의 경우 “$”문자를 통해 연산자를 사용한다.
MongoDB 연산자
Comparsion
| Name | Description |
|---|---|
| $eq | equal |
| $in | in |
| $ne | not equal |
| $nin | not in |
Logical
| Name | Description |
|---|---|
| $and | AND |
| $not | NOT |
| $nor | NOR |
| $or | OR |
Element
| Name | Description |
|---|---|
| $exists | 지정된 필드가 있는 문서를 찾는다 |
| $type | 지정된 필드가 지정된 유형인 문서를 선택한다 |
Evaluation
| Name | Description |
|---|---|
| $expr | 쿼리 언어 내에서 집계 식을 사용할 수 있다 |
| $regex | 지정된 정규식과 일치하는 문서를 선택한다 |
| $text | 지정된 텍스트를 검색한다 |
MongoDB 기본 문법
SELECT
Sql
SELECT * FROM account;
MongoDB
db.account.find()
---------------------
Sql
SELECT * FROM account WHERE user_id="admin";
MongoDB
db.account.find({user_id : "admin"})
---------------------
Sql
SELECT user_idx FROM account WHERE user_id="admin";
MongoDB
db.account.find(
{ user_id: "admin" },
{ user_idx:1, _id:0 }
)
INSERT
Sql
INSERT INTO account(
user_id,
user_pw,
) VALUES ("guest", "guest");
MongoDB
db.account.insert({
user_id: "guest",
user_pw: "guest"
})
DELETE
Sql
DELETE FROM account;
MongoDB
db.account.remove()
---------------------
Sql
DELETE FROM account WHERE user_id="guest";
MongoDB
db.account.remove( {user_id: "guest"} )
UPDATE
Sql
UPDATE account SET user_id="guest2" WHERE user_idx=2;
MongoDB
db.account.update(
{user_idx: 2},
{ $set: { user_id: "guest2" } }
)
Redis
Redis는 키 - 값(Key - Value)의 쌍을 가진 데이터를 저장한다. Redis 는 메모리 기반의 DBMS이다.
메모리를 사용해 데이터를 저장하고 접근하기 때문에 읽고 쓰는 작업이 다른 DBMS 보다 빠르다. 다양한 서비스에 임시 데이터를 캐싱하는 용도로 주로 사용한다.
Redis 명령어 사용 예시
$ 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
CouchDB 또한 MongoDB와 같이 JSON 형태인 도큐먼트(Document)를 저장한다.
이는 웹 기반의 DBMS로, REST API 형식으로 요청을 처리한다.
HTTP 요청으로 레코드를 업데이하고 조회하는 예시이다.
| 메소드 | 가능 설명 |
|---|---|
| POST | 새로운 레코드를 추가한다 |
| GET | 레코드를 조회힌디 |
| PUT | 레코드를 업데이트힌다 |
| DELETE | 레코드를 삭제한다 |
CouchDB 레코드 업데이트 및 조회 예시
$ 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"}
댓글남기기