NoSQL??

Not Only SQL’이라고 해석하는 게 더 적절하다.
그리고 NoSQL은 “관계형 데이터베이스이지 않은” 모든 데이터베이스의 데이터 모델과 제품을 아우른다.

Nosql 특징?

  • 유연성
    NoSQL 데이터베이스는 일반적으로 유연한 스키마를 제공하여 보다 빠르고 반복적인 개발을 가능하게 해줍니다. 이같은 유연한 데이터 모델은 NoSQL 데이터베이스를 반정형 및 비정형 데이터에 이상적으로 만들어 줍니다.

  • 확장성
    NoSQL 데이터베이스는 일반적으로 고가의 강력한 서버를 추가하는 대신 분산형 하드웨어 클러스터를 이용해 확장하도록 설계되었습니다. 일부 클라우드 제공자들은 완전관리형 서비스로서 이런 운영 작업을 보이지 않게 처리합니다.

  • 고성능
    NoSQL 데이터베이스는 특정 데이터 모델 및 액세스 패턴에 대해 최적화되어 관계형 데이터베이스를 통해 유사한 기능을 충족하려 할 때보다 뛰어난 성능을 얻게 해줍니다.

  • 고기능성
    NoSQL 데이터베이스는 각 데이터 모델에 맞춰 특별히 구축된 뛰어난 기능의 API와 데이터 유형을 제공합니다.

MongoDB

MongoDB 설정

  1. URL을 클릭 후 해당 사이트 이동
  2. Start free 클릭 후 or 부분에 input box 입력
  3. 무료버전의 Cluster 생성 후 Get Start 버튼의 순서대로 생성 시나리오 진행

Django 프로젝트 및 APP 생성

1
2
3
4
5
6
7
8
# MongoDB라는 프로젝트 생성
$ django-admin startproject MongoDB

# 해당 폴더로 진입
$ cd MongoDB

# nosql이라는 app 생성
$ python manage.py startapp nosql

DRF 설치 및 MongoDB 설치

1
2
3
4
$ pip install djangorestframework
$ pip install djongo
$ pip install django-cors-headers
$ pip install dnspython

settings.py INSTALLED_APPS에 APP 등록 및 설정

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
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'nosql', # app등록
'rest_framework', # DRF
'corsheaders', # CORS
]

# CORS 설정
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'http://localhost:8000',
)

# DB 설정
DATABASES = {
"default": {
"ENGINE": "djongo",
"CLIENT": {
"host": "mongodb+srv://<db id>:<db pw>@hyunsoo.dagbh.mongodb.net/<db name>?retryWrites=true&w=majority",
"username": "<db id>",
"password": "<db pw>",
"name": "<db name>",
},
}}

models.py 설정

1
2
3
4
5
6
7
8
9
10
11
from djongo import models

# Create your models here.
class Posts(models.Model):
id = models.ObjectIdField()
post_title = models.CharField(max_length=255)
post_description = models.TextField()
comment = models.JSONField()
tags = models.JSONField()
user_details = models.JSONField()
objects= models.DjongoManager()

urls.py

1
2
3
4
5
6
7
8
9
10
from django.urls import path
from nosql import views

urlpatterns = [
path('add_post/', views.add_post),
path('update_post/<int:id>', views.update_post),
path('delete_post/<int:id>', views.delete_post),
path('read_post/<int:id>', views.read_post),
path('read_posts/', views.read_posts),
]

views.py 설정

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from django.shortcuts import render
from .models import *
from django.views.decorators.csrf import csrf_exempt
from bson import ObjectId
from django.http import HttpResponse

@csrf_exempt
def add_post(requests):
comment = requests.POST.get("comment").split(",")
tags = requests.POST.get("tags").split(",")
user_details = {"first_name" : requests.POST.get("first_name"), "last_name" : requests.POST.get("last_name")}
post = Posts(
post_title=requests.POST.get("post_title"),
post_description=requests.POST.get("post_description"),
comment =comment,
tags = tags,
user_details = user_details
)
post.save()
return HttpResponse("Inserted_ID")


@csrf_exempt
def update_post(requests,id):
post = Posts.objects.get(id=id)
post.user_details["first_name"] = requests.POST.get("first_name")
post.save()

return HttpResponse("Updated_UserDetail")

@csrf_exempt
def delete_post(requests,id):
post = Posts.objects.get(id=id)
post.delete()
return HttpResponse("Deleted_Post")


@csrf_exempt
def read_post(requests,id):
post = Posts.objects.get(id=id)
stringval= "First Name: " + post.user_details['first_name'] + "Last name: " + post.user_details['last_name'] + " Post Title : " + post.post_title
return HttpResponse(stringval)

@csrf_exempt
def read_posts(requests):
posts = Posts.objects.all()
stringval = ''
for post in posts:
stringval += "First Name: " + post.user_details['first_name'] + " Last name: " + post.user_details['last_name'] + " Post Title : " + post.post_title + "<br>"

return HttpResponse(stringval)

Views.py(DRF 수정)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from .models import *
from .serializers import *

from django.shortcuts import render
from rest_framework.parsers import JSONParser
from rest_framework.decorators import api_view
from django.views.decorators.csrf import csrf_exempt

from bson import ObjectId

from django.http import HttpResponse, JsonResponse

@csrf_exempt
@api_view(['POST'])
def add_post(request):
data = JSONParser().parse(request)
comment = data['comment'].split(",")
tags = data['tags'].split(",")
user_details = {"first_name" : data['user_details']['first_name'], "last_name" : data['user_details']['last_name'],}
post = Posts(
post_title= data['post_title'],
post_description= data['post_description'],
comment =comment,
tags = tags,
user_details = user_details
)
post.save()

try:
serializer = PostSerializer(post)
return JsonResponse(serializer.data , status=201)
except:
return JsonResponse(serializer.errors, status=400)


@csrf_exempt
@api_view(['POST'])
def update_post(request,id):

data = JSONParser().parse(request)

try:
post = Posts.objects.get(id=id)

post.comment = data['comment'].split(",")
post.tags = data['tags'].split(",")
post.user_details = {"first_name" : data['user_details']['first_name'], "last_name" : data['user_details']['last_name']}
post.post_title= data['post_title']
post.post_description= data['post_description']

post.save()

result = {"received": True, "detail" : "updated_" + str(id)}
return JsonResponse(result, status=201)

except:
result= {"error" : {"code": 404, "detail" : "Post Not Found"}}
return JsonResponse(result, status=400)

@csrf_exempt
@api_view(['GET'])
def delete_post(request,id):
try:
post = Posts.objects.get(id=id)
post.delete()

result = {"received": True, "detail" : "deleted_" + str(id) }
return JsonResponse(result, status=201)
except:
result= {"error" : {"code": 404, "detail" : "Post Not Found"}}
return JsonResponse(result, status=201)


@csrf_exempt
@api_view(['GET'])
def read_post(requests,id):
try:
post = Posts.objects.get(id=id)
except:
result= {"error" : {"code": 404, "detail" : "Post Not Found"}}
return JsonResponse(result, status=201)
try:
serializer = PostSerializer(post)
return JsonResponse(serializer.data , status=201)
except:
return JsonResponse(serializer.errors, status=400)


@csrf_exempt
@api_view(['POST'])
def read_posts(request):
posts = Posts.objects.all()
if len(posts) == 0:
result= {"error" : {"code": 404, "detail" : "Post Not Found"}}
return JsonResponse(result, status=400)
else:
result = {"answer" : []}
for post in posts:
serializer = PostSerializer(post)
result['answer'].append(serializer.data)

return JsonResponse(result , status=201)

Serailizers.py

1
2
3
4
5
6
7
8
9
from rest_framework import serializers 
from nosql.models import *


class PostSerializer(serializers.ModelSerializer):

class Meta:
model = Posts
fields = ('id', 'post_title', 'post_description', 'comment', 'tags', 'user_details')

결과

insert
insert
read
read
update
update
delete
delete