본문 바로가기

Django

Django - mysql 설치, settings.py 설정

Django(이하 장고)는 python framewok이다. framework는 사용자가 규칙에 종속된다. 규칙을 준수해야만 원하는 결과를 얻을 수 있다. medels.py에 DB 테이블을 정의, views.py에 로직을 작성하고 이 로직을 실행시킬 urls.py를 설정한다.

cf. 라이브러리는 사용자가 원할 때 load해서 쓴다. framework보다 종속성이 덜하다.

 

MVT(model, view, template) 개념으로 FE, BE를 한 번에 구현하는 방식은 app 단위인 Web 2.0에 해당한다. 장고 안에 html 파일 등을 넣어서 클라이언트에게 어떻게 보여줄지까지 포함했었다.

이제 여기서 BE만 활용해 API를 만들 것이다. 실제로 서버를 돌렸을 때 클라이언트와 서버간 요청-응답을 처리할 수 있도록 하는 게 목적이다. API화 한 뒤 BE의 클라이언트는 실제 사용자가 아닌 FE가 된다.

models.py

class를 기반으로 DB 테이블을 정의한다.

장고 ORM(rdbms를 객체로 맵핑)을 써서 DB와 CRUD 실행 가능

views.py

로직. 요청을 처리하기 위한 모듈.

여기서 바로 테스트하면 번잡스러우니 먼저 shell에서 해보고 나서 views.py에 그 로직을 적용시킨다.

urls.py

호출할 수 있는 경로를 지정해준다.

mysql 설치

mysql 서버 초기화했을 때 Would you like to setup VALIDATE PASSWORD plugin? yes/no를 물어본다. 원칙적으론 yes지만 no를 입력해야 가벼운 암호를 설정할 수 있다. 혹시 여기서 yes를 눌렀는데 가벼운 암호를 설정하고 싶다면 참고 링크를 보고 패스워드 정책을 변경한 뒤 다시 암호를 설정해야 된다.

Remove anonymous users?를 물어볼 때 y, Disallow root login remotely?를 물어볼 때 n, Remove test database and access to it?를 물어볼 때 y, Reload privilege table now?를 물어볼 때 y를 선택한다.

$ sudo apt install -y mysql-server

$ sudo mysql_secure_installation    # mysql 서버 초기화

$ sudo /etc/init.d/mysql restart    # mysql 데몬 실행

 

mysql 서버에 접속한다. 위에서 설정한 암호를 입력한다.

$ sudo mysql -u root -p

 

추후 mysql 로그인 때 sudo를 붙이지 않으면 에러가 난다. 암호 타입이 mysql_native_password인 암호로 변경하여 sudo 없이도 root 로그인이 가능하게 설정한다. 암호를 그대로 쓰고 타입만 변경해주는 방법도 있다. 참고 링크

$ sudo mysql -u root -p

mysql > use mysql;

mysql > alter user 'root'@'localhost' identified with mysql_native_password by <사용할 비밀번호>

mysql > flush privileges;

 

mysqlclient 설치 전 오류 방지를 위해 몇가지 패키지를 설치한다. docker를 사용하거나 8 이상의 Debian을 사용하는 경우엔 libmysqlclient-dev 대신 default-libmysqlclient-dev를 설치한다.

$ sudo apt-get install python3-dev libmysqlclient-dev build-essential

$ pip install mysqlclient

DB 생성

문자가 깨지지 않도록 utf8mb4 설정한다.

$ mysql server start

$ mysql -u root -p

mysql > create database <DB명> character set utf8mb4 collate utf8mb4_general_ci;

 

DB 목록을 확인하고 특정 DB를 사용하려면,

mysql > show databases;

mysql > use <DB명>

이후 dbshell처럼 사용할 수 있다.

장고 프로젝트 생성

프로젝트 폴더를 생성하고 싶은 위치에서 실행한다. 프로젝트명과 동일한 이름의 폴더가 안에 또 있다. asgi.py는 비동기, wsgi.py 웹서버 동작에 쓰이는 파일이다.

$ django-admin start project <프로젝트명>

 

프로젝트 폴더 구조를 보고 싶다면 $ tree를 사용한다. 만일 tree가 설치되어있지 않다면,

$ sudo install apt tree

 

프로젝트 폴더 안 manage.py가 있는 곳으로 위치를 옮긴 다음 프로젝트 내 application을 생성할 수 있다.

$ python manage.py startapp <app 이름>

settings.py 설정

DB 연결

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DB 명',
        'USER': 'root',
        'PASSWORD': 'DB 접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 

BASE_DIR은 manage.py가 있는 위치(root)

DEBUG가 True면 에러메세지를 보여준다. 서비스 되고 있는 production에서는 False로 해야된다.

ALLOWED_HOST는 누가 접근할 수 있는지 컨트롤하는 부분이다. ['*']로 설정하면 전부 허용이다.

INSTALLED_APPS에는 생성한 app을 추가해야 된다. makemigration시 생성한 app이 투명인간처럼 무시된다면 대개 여기에 추가하지 않아서이다. cf. 이중 admin, auth는 정상적으로 실행하기 위해 DB가 반드시 필요하다.

ROOT_URLCONF는 urls.py의 위치를 의미한다.

DATABASES는 DB 설정이다. 장고는 sqlite3(파일 기반 DB)를 기본으로 사용한다.

STATIC_URL은 정적 파일(html, css, 이미지 등)이 있는 위치를 잡아주는 데 쓸 경로다. BE API를 만들 때는 쓰지 않을 것이다.

 

 

추후 github에 코드를 올릴 때를 대비해 장고 secret key와 db 정보는 manage.py와 같은 위치에 my_settings.py를 만들어 따로 빼두고, settings.py엔 import my_settings를 추가한 뒤 원래 정보가 있던 자리를 my_settings.SECRET['secret']과 my_settings.DATABASES로 대체해 넣으면 중요 정보 유출을 막을 수 있다.