Django rest framework + MariaDB 맛보기 Feat.pycharm, swagger

2016년이였나??,, Django를 처음 접했던게? 대학교 3학년 때이다.
지금도 모르는게 많지만, 그때와 지금 비교해보면
그때는 지금보다 더 모르는게 많았었다.
만들고 싶은 웹서비스가 있어서, 프레임워크가 어떤것인지에 대한 개념도 모른 체로 무작정 사용 했었던 기억이 난다.

지금와서 다시 찾아보고, 공부하니까.. 예전에 고민했었던 사안이 생각난다.

과거에 선배 개발자들에게 선생님들에게 종종 물었었다.
"언어도 너무 많고, 라이브러리 프레임워크가 너무 많다. 공부할 게 너무 많다
어떻게 해야될지 모르겠다"라고 고민을 얘기하면

돌아오는 대답은 항상 비슷했다.
'하나를 깊게 알면, 언어가 달라도 금방 알 수 있다'라는 답변.
이 답변을 새삼 살결로 느끼게되었다.
물론 하나를 깊게 안다 라는 말은 과거의 나에비해 헤헤헤
상대성 이론은 완벽하다.


서두가 주저리주저리 너무 길었는데,
본론으로!!고우~


먼저, 프로젝트 생성.
경로는 알아서 해주고, 앱이름도 알아서 해준다.
보는 바와 같이 파이썬 버전은 3.7



Django 버전은 2.1.7
필수 패키지는
djangorestframework 3.9.2
django-rest-swagger 2.2.0
mysqlclient 1.4.2.post1


mysqlclient는 MariaDB가 설치 되어있지 않으면,
패키지 설치가 안되기 때문에
MariaDB설치 -> mysqlclient 패키지 설치해야된다.

본인은 맥에서 개발중인데,
brew는 이미 설치 되었다는 가정하고


brew update
brew install mariadb

하고나면, 블라블라~ 설치 어쩌구 로그들 완료되고
서버를 키는데, 아래처럼 /usr/local/etc/my.cnf.d 가 없단다.
그래서 직접 만들어주고 다시 실행.

namdong-gil-ui-MacBookPro:man namdong-gil$ mysql.server start
/usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory")
Fatal error in defaults handling. Program aborted
Starting MariaDB
./usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory")
Fatal error in defaults handling. Program aborted
/usr/local/Cellar/mariadb/10.3.13/bin/my_print_defaults: Can't read dir of '/usr/local/etc/my.cnf.d' (Errcode: 2 "No such file or directory")
Fatal error in defaults handling. Program aborted
190321 20:48:19 mysqld_safe Logging to '/usr/local/var/mysql/namdong-gil-ui-MacBookPro.local.err'.
190321 20:48:19 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
/usr/local/bin/mysql.server: line 264: kill: (80262) - No such process
 ERROR! 
namdong-gil-ui-MacBookPro:man namdong-gil$ mkdir /usr/local/etc/my.cnf.d
namdong-gil-ui-MacBookPro:man namdong-gil$ mysql.server start
Starting MariaDB
.190321 20:49:25 mysqld_safe Logging to '/usr/local/var/mysql/namdong-gil-ui-MacBookPro.local.err'.
190321 20:49:25 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
 SUCCESS! 
namdong-gil-ui-MacBookPro:man namdong-gil$ mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.13-MariaDB Homebrew

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> exit
Bye


로컬서버 잘 된다~
그럼 집에 있는 나스에 있는 MariaDB에 붙어볼까?

namdong-gil-ui-MacBookPro:man namdong-gil$ mysql -u 비공개 -p --port 비공개 --host 비공개
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4142
Server version: 10.3.7-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [accountBook]> exit
Bye

나스서버 잘 붙는다~
원격접속 권한주고 이런거는 생략하고
바로 Django로 돌아와서,

/프로젝트명/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'swagger.apps.SwaggerConfig',    'rest_framework',    'rest_framework_swagger']

'rest_framework',
'rest_framework_swagger'
추가

원래 기본은 sqlite인데 주석처리하고 ~
DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',        'NAME': '디비명',        'USER': '계정명',        'PASSWORD': '비밀번호',        'HOST': '너의 호스트',        'PORT': '너의 포트번호'    }
}




그 다음은 프로젝트 만들 때 앱이름 작성했었다.
/만들고싶은앱이름/models.py
사용자가 글쓰고 댓글도 달아 볼까? 뭐 그런.. 모델링
from django.db import models


# Create your models here.
class Member(models.Model):
    email = models.CharField(max_length=50)
    name = models.CharField(max_length=15)
    age = models.IntegerField(default=0)


class Write(models.Model):
    author = models.ForeignKey(Member, models.CASCADE)
    pub_date = models.DateTimeField('date published')
    title = models.CharField(max_length=50)
    content = models.CharField(max_length=500)


class Reply(models.Model):
    author = models.ForeignKey(Member, models.CASCADE)
    target_write = models.ForeignKey(Write, models.CASCADE)
    pub_date = models.DateTimeField('date published')
    content = models.CharField(max_length=200)


시리얼라이저?
Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSONXML or other content types.

영어로 블라블라 하는데, 
복잡한 데이터(쿼리셋, 파이썬 모델 객체) -> JSON, XML 등등 으로 쉽게 렌더링 할 수 있는
Primitive Python 데이터 유형으로 변환 가능하도록 해준다.

직관적으로 말해서?
직렬화, 역직렬화
여러 플랫폼간에 데이터 통신하기 위해서 바이트코드로 변환하는 작업을 직렬화
바이트코드들을 파이선 객체로 변환하는 것을 역직렬화

뷰셋?
Django REST framework allows you to combine the logic for a set of related views in a single class, called a ViewSet. In other frameworks you may also find conceptually similar implementations named something like 'Resources' or 'Controllers'.

이것도 영어로 블라블라 하는데,
논리적으로 관련된 뷰들을 묶는 단일 클래스라고 한다.
다른 프레임워크들에서 Resources 혹은 Controllers 같은거라고 한다.
java spring 프레임워크에서 Controller와 비슷한 개념이라고 생각하면 될거 같은 느낌적인 느낌이 든다.

밑에서 라우터에 등록해주는 작업을 한다.

/만들고싶은앱이름/api.py
from .models import Member, Write, Reply
from rest_framework import serializers, viewsets


class MemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        fields = '__all__'

class MemberViewSet(viewsets.ModelViewSet):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer


class WriteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Write
        fields = '__all__'

class WriteViewSet(viewsets.ModelViewSet):
    queryset = Write.objects.all()
    serializer_class = WriteSerializer


class ReplySerializer(serializers.ModelSerializer):
    class Meta:
        model = Reply
        fields = '__all__'

class ReplyViewSet(viewsets.ModelViewSet):
    queryset = Reply.objects.all()
    serializer_class = ReplySerializer


라우터를 생성하고 위에서 만든 뷰셋들을 라우터에 등록해 준다.
라우터 + 뷰셋 == spring framework의 controller ? 맞다 : 아니다
구성 요소가 다른거 같지만 개념은 비슷하게 느껴져 일맥상통해 보인다.
너무 정치적이고 애매하게 말한거 같은데 그런 생각이든다.
/만들고싶은앱이름/urls.py
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers
from rest_framework_swagger.views import get_swagger_view
import swagger.api

app_name='swagger'
router = routers.DefaultRouter()
router.register('members', swagger.api.MemberViewSet)
router.register('writes', swagger.api.WriteViewSet)
router.register('replies', swagger.api.ReplyViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),    url(r'^api/doc', get_swagger_view(title='Rest API Document')),    url(r'^api/v1/', include((router.urls, 'member'), namespace='api')),]



그러면 한 번 돌려봅시다~



http://127.0.0.1:8000/api/v1/


http://127.0.0.1:8000/api/doc/



마무리
소잡는데 닭잡는 칼을 쓸 수 없듯이,
어느 프레임워크가 짱이다라고 말하는건 참 어리석고 웃긴일이지만 비교가 저절로 된다.

spring에 비해 정말 가볍다.
spring boot도 spring에 비해 가볍지만,
Django는 더 가벼운거 같다. 
느끼는 장점은 정말 빠르게 아이디어를 구현할 수 있다고 느꼈다.
물론 pycharm이 한 몫 했다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

Ruby on rails도 가벼워서 빠르게 실행할 수 있다고 들었는데, 
맛을 보고 포스팅을 해봐야 겠다.
그리고 flask도 궁금하다. 

댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째