Two Scoops of Django 3.x를 읽고 정리한 글입니다.
2.1. 동일한 데이터베이스 엔진을 사용하라
일반적인 실수는 로컬 개발 환경에서는 SQLite3를 이용하고 실제 운영 환경에서는 PostgreSQL을 이용하는 것이다.
두 개의 다른 데이터베이스가 똑같이 작동한다는 가정 아래 일어날 수 있는 전반적인 문제를 이야기 하려고 한다.
2.1.1. 운영 데이터를 완전히 똑같이 로컬에서 구현할 수는 없다.
- 운영 환경 DB엔진이 로컬 개발 환경의 DB엔진과 다르다면 데이터의 완벽한 사본을 가져올 수 없다.
- SQL 덤프를 해 와서 이전할 수 있지만, 정확한 사본이라고 볼 수는 없다.
2.1.2. 다른 종류의 데이터베이스 사이에는 다른 성격의 필드 타입과 제약 조건이 존재한다.
- 데이터베이스마다 필드 데이터의 타입 캐스팅을 다르게 처리한다. 장고ORM으로 모두 극복할 수 없다.
- SQLite3는 동적이고 느슨한 타이핑을 지원하지만 MySQL, PostgreSQL등은 엄격한 타입을 가지고 있다. 이는 개발환경에서는 발견되지 않고 (테스트코드를 실행하더라도) 운영 환경에서 본적 없는 제약 조건 에러를 뱉어낼 것이다.
- 운영과같은 데이터베이스를 구축하기 전까지는 이 문제를 재현하기도 어렵다.
최고의 조합 = 장고 + PostgreSQL이다. (대부분의 장고개발자가 선호한다고 함.)
-
PostgreSQL에서만 동작하는 다양한 데이터 유형을 제공한다.
-
PostgreSQL에서의 DB작업 수행을 위한 django.contrib.postgres가 있다.
-
지도 앱 및 지리데이터 저장을 위한 GeoDjango는 PostgreSQL에서만 완벽하게 호환
출처: link
Warning: Don't Use SQLite3 with Django in Production
- 사용자가 2명이상이어도 악몽이 시작된다. (동시성 처리 문제)
- 문제가 발생한 뒤라면, 동시성을 위해 설계된 DB(PostgreSQL 등)로 데이터를 마이그레이션 할때 이미 여러 복잡성과 어려움이 있다.
- 프로덕션에서 SQLite3를 옹호하는 기사가 많지만 이는 특별한 경우에만 해당한다.
2.2. pip와 virtualenv 또는 venv 사용하기
pip
: python패키지 인덱스와 그 미러 사이트에서 파이썬 패키지를 가져오는 도구이며 python 패키지를 설치하고 관리하는데 이용된다. (python 3.4 이상에는 기본으로 포함)
virtualenv
: 패키지 종속성을 유지하기 위해 분리된 python 환경을 만드는 도구이다.
Package Tip
- Virtualenv의 대안 -> Conda
- 윈도우, 맥, 리눅스에서 사용 가능
- Data Science 패키지를 사용하는 목적으로 윈도우 사용자가 쉽게 이용할 수 있도록 되어있음.
- Python 버전 관리가 쉽다.
- pip와 함께 사용한다.
- Pip+Virtualenv의 대안 -> Poetry, Pipenv
- Poetry (python-poetry.org)
- Python프로젝트의 종속성을 선언, 관리, 설치가 가능하다.
- 현재 의존성 관리 플랫폼으로서 인기가 많고 안정적이다.
- Poetry-설치-및-사용기
- requirements.txt없이도 버전 lock이 가능하며 무언가를 자동으로 생성??(의존성 잠금)
- virtualenv에 의존하지 않고도 전역에 패키지를 설치하지 않는다. (가상환경)
- 패키지1, 패키지2가 있을 때 패키지2가 패키지1의 2.0버전 이상을 요구한다. pip로 설치하게 되면 패키지1을 1.0으로 설치해도 문제가 없다. → poetry는 버전 관련 정보를 확인하고 아예 설치가 되지 않는다. (의존성 해결)
- Pipenv (pipenv.pypa.io)
- pip및 virtualenv를 단일 인터페이스로 래핑하는 도구이다.
- 환경 생성과 같은 프로세스를 자동화하고 결정론적 빌드가 가능한 파일인 Pipfile.lock을 도입한다.
주의: Linux에는 Pip가 기본적으로 설치되어 있지 않다.
- 많은 Linux는 python라이브러리에서 일부 모듈을 제거하고 별도의 설치 가능 패키지에 보관한다.
- Ubuntu에서 python3-pip, python3-setup tools, python3-wheel 및 python3-distutil을 설치해야 하는 경우가 있다.
- Window10의 WSL2도 비슷한 패턴으로 영향을 미칠 수 있다.
2.5. 선택 사항: 동일한 환경 구성하기
- 운영-개발의 동일한 환경은 불가능하다. (운영서버10000대, 개발서버 10000대 가능?)
- 똑같은 환경이란? '가능한 똑같은 환경'
- 다음 사항에 대해서는 환경 문제를 극복할 수 있다.
- 서로 다른 운영 체제: 개발은 맥이나 윈도우에서 이루어지고 운영 환경으론 우분투가 이용된다면 로컬과 운영환경에는 큰 차이가 있다.
- 서로 다른 파이썬 셋업: 파이썬 버전은 의외로 개발자들이 오판하거나 헷갈리는 경우가 많다.
- 개발자와 개발자 간의 차이: 개발자간의 셋업 차이에서 오는 문제.
- 동일한 환경을 구성하는 일반적인 방법중 하나는 Docker를 이용하는 것이다.
2.5.1. Docker
- 현재 시점(2021.08.26)에서 Docker는 컨테이너화를 위한 환경 구축에 대해 업계 표준이다.
- Virtual Machine환경과 유사하지만 가볍다.
- 호스트 운영체제를 나눠쓰지만 컨테이너 각각이 독립된 프로세스와 메모리를 쓴다.
- 로컬 개발을 위해 개발 및 프로덕션과 밀접하게 일치하는 환경을 훨씬 쉽게 설정할 수 있다.
- 예를들어 개발 랩톱이 Mac일 때, Docker Compose를 통해 Docker를 사용하여 로컬에서 가상 Ubuntu 개발 환경을 프로젝트에 필요한 모든 패키지 및 설정 구성으로 빠르게 가져올 수 있다.
- 모든 개발자들에게 동일한 로컬 개발 환경을 설정한다.
- 스테이징, 테스트 및 프로덕션 서버와 유사한 방식으로 이러한 로컬 개발 환경을 구성한다.
- 잠재적인 단점
- 추가복잡성이있다. OS 수준 레벨 차이를 크게 걱정하지 않는 단순한 프로젝트는 그냥 건너뛰는게..
- 구형 개발 기계에서는 경량 컨테이너라도 성능저하가 있다. 최신 시스템에서도 작지만 눈에 띄는 오버헤드가 추가된다.
References for developing with Docker:
® cookiecutter-django.readthedocs.io/en/latest/ developing-locally-docker.html
® http://bit.ly/1dWnzVW Real Python article on Django and Docker Compose
® dockerbook.com
2.6. 요약
- 동일한 데이터베이스 엔진을 위한 개발환경, pip , virtualenv, venv, conda, poetry, pipenv, version control, docker에 대해서 알아보았다.
- 이들은 장고뿐아니라 파이썬의 소프트웨어 개발에 전반적으로 이용되는 도구들이기에 반드시 익혀두어야 할 소중한 기술들이다.