weekly learning2019. 6. 9. 14:58

이번 주에 공부한 내용을 정리해보자.


멀티데이터베이스 사용하기

1. AWS에서 새로운 PostgreSQL 데이터베이스를 생성한다.

마스터 데이터베이스 생성시 주의할 점은 PostgreSQL 9.3.5 이상부터 읽기 전용 복제본을 사용할 수 있다.


멀티데이터베이스를 위해서 읽기 전용 복베존을 만들려면 백업 기능이 활성화되어 있어야 한다. 따라서 1일 이상으로 설정한다.


2. 데이터베이스 복제본 생성

복제본을 생성할 데이터베이스 인스턴스 선택 -> Actions -> Create read replica


db instance identifier를 적절한 이름으로 설정한다.


모든 설정을 완료 후 생성하면 다음과 같이 생성된 것을 확인할 수 있다.


3. settings.py에 멀티 데이터베이스를 입력한다.

DATABASES = {
	'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'Master username',
        'PASSWORD': 'password',
        'HOST': 'endpoint',
        'PORT': '5432',
	},
    'read1': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'Master username',
        'PASSWORD': 'password',
        'HOST': 'endpoint',
        'PORT': '5432',
	},


두번 째 또는 그 이상의 읽기전용 데이터베이스도 위와 동일하게 생성한다.


4. write, read 데이터베이스 분기를 위해 라우터 클래스를 생성한다. 파일의 위치와 이름은 자유롭게 지정한다.

# config/master_slave_router.py

import random

class MasterSlaveRouter:
    def db_for_read(self, model, **this):
        return random.choice(['read1', 'read2']) # 랜덤 분산

    def db_for_write(self, model, **this):
        return 'default' # == return None

    def allow_relations(self, obj1, obj2, **hints):
        db_list = ('default', 'read1', 'read2') # 특정 DB만 불러오기
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None # 무조건 default에 접근 또는 다음 라우터에 물어보겠다는 의미

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True


생성한 라우터를 settings.py에 추가한다. 라우터는 입력된 순서대로 실행된다.

DATABASE_ROUTERS = [
    'config.db_router.MasterSlaveRouter',
]


기능이 잘 동작하는지 django-debug-toolbar를 설치해서 확인해보자. 사용하는 데이터베이스를 확인할 수 있다.


유저 정보를 담는 데이터베이스 추가

# settings.py
'user': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'Master username',
        'PASSWORD': 'password',
        'HOST': 'endpoint',
        'PORT': '5432',
	},


유저 정보 데이터베이스를 위한 라우터를 추가한다.

# config/user_router.py

from django.conf import settings

class UserRouter:
    def db_for_read(self, model, **hints):
        if model._meta.model_name == 'user': # user model이라면 user 모델에서 읽겠다
            return 'user'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.model_name == 'user':
            return 'user'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        db_list = settings.DATABASES.keys()
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True


라우터를 settings.py에 추가한다.

DATABASE_ROUTERS = [
    'config.user_router.UserRouter',
    'config.db_router.Db_router',
]


이 방법을 사용하면 다른 서비스에서 가지고 있는 유저 정보를 그대로 활용할 수 있다.


커스텀 템플릿 태그 만들기

템플릿 문법에 없는 기능을 추가할 수 있다. 커스텀 템플릿 태그와 템플릿 필터를 만들 수 있다.


1. app/templatetags 폴더를 추가한다.



2. 원하는 기능을 작성할 파일을 작성한다. 템플릿 파일에서 이 파일명으로 기능을 불러온다.


3. 템플릿 라이브러리 변수를 만든다.

from django import template
register = template.Library()


4. 필터를 등록할 때는 다음과 같이 코드를 작성한다.

@register.filter
def add_two(value):
    return value+2


5. 등록한 필터는 다음과 같이 사용한다.

{% load blog %}
{{변수|add_two}}


6. 태그를 등록할 때는 다음과 같이 코드를 작성한다.

@register.simple_tag
def print_template():
    return render_to_string('blog/test.html')


7. 등록한 태그는 다음과 같이 사용한다.

{% load blog %}
{% print_template %}


8. 태그를 실행한 결과를 변수로 지정하려면 as 키워드를 사용한다.

{% load blog %}
{% print_template as test %}
{{test}}


9. 추가 인자가 있는 필터는 다음과 같이 코드를 작성한다.

@register.filter
def string_append(left, right):
    return left+"-"+right


10. 해당 필터는 다음과 같이 사용한다.

{% load blog %}
{{'string1'|string_append:'string2'}}


요새 수업 내용이 좀 어렵게 느껴지고 있다. 


하나하나를 놓고 보면 크게 어려운 내용은 아니지만, 예제에 적용한다든지, 실제 사용해보면 여러 내용이 복합적으로 얽혀서 적용하기 어렵고 헷갈리는 부분이 많아지고 있다..


이 부분은 개인 프로젝트를 진행 해보면서 더욱 느끼고 있다. 분명 수업 때 배운 내용이지만 적용하는게 조금씩 다르다 보니 헤매는 경우가 없지않아 많다.


그리고 또 사이트를 혼자 만들면서 느끼는건 아직 django에 대해 많이 모르고 있다는 것이다. 특히 view 부분이 많이 부족한 것 같다.


공부는 정말 끝이 없는 것 같다



Posted by gawain