안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

장고 (Django)

[Django] 개발 환경 세팅 : CentOS7 (VirtualBox + Vagrant), PyCharm

피그브라더 2020. 5. 27. 14:19

1. CentOS7 가상 머신 설치

가상 머신(Virtual Machine)이란 특정 OS의 컴퓨터 환경을 가상화한 것으로, 또 다른 OS의 컴퓨터 한 대가 더 있는 듯한 착각을 제공하는 가상화 기술이다. VirtualBox나 VMWare 등이 바로 특정 가상 머신을 구동하기 위한 소프트웨어들에 해당한다. 그리고 Vagrant는 그러한 가상 머신들을 쉽게 설치하고 관리할 수 있도록 도와주는 소프트웨어이다. Vagrant를 이용하면 이미 누군가가 만들어 놓은 특정 환경의 가상 머신들을 쉽게 가져다 설치할 수 있다. 이러한 것들 하나하나를 가상 머신 box라고 부르며, 각 가상 머신 box에는 특정 OS와 그 OS에서 필요한 각종 소프트웨어들이 이미 갖추어져 있다. 가상 머신 box는 공식적으로 제공되는 것도 있고(https://app.vagrantup.com/boxes/search), 다른 유저들이 만들어서 제공하는 것(http://www.vagrantbox.es/)도 있다. 이 중에서 원하는 것을 선택하여 사용하자. Vagrant의 사용법과 관련한 대표적인 명령어는 다음과 같다.

 

  • box 추가 : vagrant box add {box 이름}
  • box 제거 : vagrant box remove {box 이름}
  • box 목록 : vagrant box list
  • 가상 머신 설치 : vagrant init {box 이름}
  • 가상 머신 실행 : vagrant up
  • 가상 머신 종료 : vagrant halt
  • 가상 머신 재부팅 : vagrant reload
  • 가상 머신 SSH 접속 : vagrant ssh (탈출 시 exit)

본격적으로, CentOS7 가상 머신을 설치하는 과정은 다음과 같다.

 

  1. VirtualBox 설치 (www.virtualbox.org/wiki/Downloads)
  2. Vagrant 설치 (www.vagrantup.com/downloads.html)
  3. Vagrant를 이용하여 CentOS7 box 추가 : "vagrant box add centos/7" 명령어를 수행한다.
  4. Vagrant를 이용하여 CentOS7 가상 머신 설치 : 가상 머신이 위치할 폴더 안에서 "vagrant init centos/7 명령어를 수행한다.
  5. 가상 머신 폴더 안에 생성된 "Vagrantfile"이라는 가상 머신 설정 파일의 내용을 다음과 같이 수정한다.
Vagrant.configure("2") do |config|
    config.vm.box = "centos/7"

    # Host : 가상 머신을 구동하고 있는 실제 PC
    # Guest : 가상 머신에 해당하는 가상 PC

    # Guest의 /vagrant 경로에 해당하는 내용을 Host의 . 경로에 동기화
    config.vm.synced_folder ".", "/vagrant", type: "virtualbox", rsync__exclude: ".git/"


    # 가상 머신 제공자(VirtualBox)에 대한 세부 설정 (EX. 구동할 가상 머신의 메모리 크기)
    config.vm.provider :virtualbox do |vb|
        vb.customize ["modifyvm", :id, "--memory", "4096"]
    end

    # Host의 8000번 포트로 접속하는 것을 Guest의 8000번 포트로 포워딩
    # Guest IP를 지정하지 않으면 기본적으로 모든 가상 PC의 IP에 대해 설정됨
    # Host가 공유기처럼 포트 포워딩을 맡게 되면서, Host에서도 8000번 포트가 막힘
    config.vm.network :forwarded_port, guest: 8000, host: 8000
end

 

2. VM 개발 환경 설정

앞서 구축한 가상 머신은 결국 앞으로 장고 서버 개발을 진행할 환경이 된다. 따라서 가상 머신에 개발을 위한 몇 가지 설정을 추가로 해줄 필요가 있다. "vagrant up" 명령어로 VM을 실행하고 "vagrant ssh" 명령어로 VM에 SSH로 접속한 뒤, 다음 과정을 하나씩 따라가 보자.

 

2-1. 의존성 패키지 설치

yum은 apt와 유사한 패키지 관리자 도구로서, 등록된 저장소(Repository)에서 특정 패키지를 다운로드하는 방식으로 동작한다. "yum repolist" 명령어를 수행하면 등록된 저장소의 목록을 확인할 수 있다. 참고로 "sudo"는 루트로 로그인한 것이 아닐 때 yum 명령어를 사용할 수 있는 권한을 부여하는 역할을 수행한다.

 

# EPEL (Extra Packages for Enterprise Linux, 리눅스 추가 패키지)
# CentOS7 yum의 경우, "CentOS-7 - Extras"라는 기본 저장소로부터 EPEL 저장소를 다운 받아 추가할 수 있다.
sudo yum install epel-release

# 등록된 저장소를 통해 업데이트할 패키지가 존재하는지 확인하고, 있다면 새로운 버전으로 업데이트한다.
# 패키지명을 명시하지 않으면 설치되어 있는 모든 패키지를 업데이트한다.

sudo yum update


# 개발을 위한 각종 도구 및 유틸리티 (git, gcc 등등)
# yum은 패키지들을 용도에 따라 그룹으로 분류하므로, 그룹 단위로도 패키지 설치가 가능하다.
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel

 

2-2. pyenv 패키지 설치

pyenv 패키지는 하나의 로컬 시스템에서 다양한 버전의 파이썬을 사용하고 관리할 수 있도록 하는 도구이다. 다음은 pyenv 패키지를 설치하고 pyenv를 사용하기 위한 몇 가지 초기 설정 작업을 수행하는 것을 나타낸다.

 

# pyenv 패키지 설치 (Github을 통해 직접 다운로드)
git clone https://github.com/pyenv/pyenv.git ~/.pyenv


# PYENV_ROOT : 사용자 정의한 쉘 변수로서, export 명령어에 의해 환경 변수로 지정된다.
# PATH : OS 환경 변수로서, pyenv의 경로를 추가하여 갱신된다.
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

# 쉘 스크립트 파일 실행 (쉘 스크립트 변동 사항 적용)
source ~/.bash_profile

 

2-3. pyenv-virtualenv 패키지 설치

pyenv-virtualenv 패키지는 pyenv를 이용하여 특정 파이썬 버전의 가상 환경을 쉽게 만들고 관리할 수 있도록 하는 도구이다.

 

# pyenv-virtualenv 패키지 설치 (Github을 통해 직접 다운로드)
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv


# eval : 가능한 모든 치환을 수행한 후 명령행을 수행
# pyenv-virtualenv가 정상 동작 할 수 있도록 쉘 설정 파일에 초기화 코드를 추가
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

# 쉘 스크립트 파일 실행 (쉘 스크립트 변동 사항 적용)

source ~/.bash_profile

 

2-4. 파이썬 및 가상 환경 설치

pyenv를 이용하여 원하는 버전의 파이썬을 설치하고, 그 버전을 바탕으로 가상 환경을 생성한다.

 

# 파이썬 3.6.7 버전 설치
pyenv install 3.6.7

# 파이썬 3.6.7 버전을 사용하는 가상 환경 생성
pyenv virtualenv 3.6.7 {가상 환경 이름}

 

2-5. 프로젝트 폴더 생성 및 가상 환경 지정

장고 서버 개발을 위한 프로젝트 폴더를 생성하고, 그 폴더에 들어가면 자동으로 앞서 만든 가상 환경에 진입이 되도록 설정한다.

 

# 프로젝트 폴더 생성
cd /vagrant
mkdir {프로젝트 폴더 이름}


# 가상 환경 선택 (해당 폴더에 들어가면 자동으로 가상 환경에 진입)
cd {프로젝트 폴더 이름}
pyenv local {가상 환경 이름}

 

2.6. 데이터베이스(PostgreSQL) 설치 및 설정

장고가 기본적으로 제공하는 SQLite3 데이터베이스가 아닌 PostgreSQL 데이터베이스를 사용하고 싶다면, 관련 패키지를 설치하고 다음과 같이 데이터베이스를 설정해줘야 한다. 참고로 장고 쪽에도 PostgreSQL 데이터베이스와 관련한 설정을 해줘야 하는데, 이는 아래에서 다루도록 하겠다. 여기서는 장고를 설치하기 전의 과정을 설명하기 때문이다.

 

# postgresql 9.6 관련 패키지 설치
sudo yum install \
https://
download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install postgresql96 postgresql96-server postgresql96-devel


# postgresql 설정 파일 바로가기 생성
sudo ln -s /usr/pgsql-9.6/bin/pg_config /usr/bin/pg_config


# postgresql 데이터베이스 초기화
sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb


# postgres 유저로 완전히 전환하고, PostgreSQL 설정 파일을 다음과 같이 수정한다. 
sudo su - postgres
    vi ~/9.6/data/pg_hba.conf
        # "local" is for Unix domain socket connections only
        local    all             all                                     trust
        # IPv4 local connections:
        host    all             all         127.0.0.1/32       trust
        # IPv6 local connections:
        host    all             all         ::1/128                 trust
    exit

# postgres 유저 비밀번호 설정
sudo passwd postgres

# 부팅 시 PostgreSQL 자동 실행
sudo systemctl enable postgresql-9.6

# start : PostgreSQL 실행
sudo systemctl start postgresql-9.6


# postgres 유저로 PostgreSQL 데이터베이스에 접속 후 데이터베이스 생성 (오류 발생 시 vagrant reload 후 재시도 권장)
psql -U postgres
   create database {데이터베이스 이름}; 
   \q

 

2.7. 장고 및 관련 파이썬 패키지 설치

pip는 파이썬 패키지 관리자 도구로서, Python Package Index라는 곳에 올라와 있는 파이썬 관련 특정 패키지를 다운로드하는 방식으로 동작한다. 앞서 설명한 yum과 유사한 성격의 도구인데, pip은 yum과 달리 '파이썬 관련' 패키지만 다운로드할 수 있다. pip 관련 대표적인 명령어는 다음과 같다.

 

  • pip list : 현재 설치된 파이썬 패키지 목록들을 확인한다.
  • pip install {패키지명} : 해당 파이썬 패키지를 다운로드한다.
  • pip uninstall {패키지명} : 해당 파이썬 패키지를 삭제한다.
  • pip install --upgrade pip : pip를 최신 버전으로 업그레이드한다.

 

우선 파이썬 패키지 설치를 위한 pip를 최신 버전으로 업그레이드해준다. 참고로 이 이후부터는 계속 가상 환경(프로젝트 폴더)에 진입되어 있다는 가정 하에 설명을 진행하도록 하겠다. 가상 환경 진입을 위한 코드를 매번 쓸 수는 없기 때문이다.

 

# 가상 환경 진입
cd /vagrant/{프로젝트 폴더 이름}/


# pip를 최신 버전으로 업그레이드
pip install --upgrade pip

 

그러면 이제 본격적으로 장고를 설치해 보자. 그런데 장고를 포함하여 서버 개발 시 해당 가상 환경에서 필요로 하는 파이썬 패키지는 여러 종류가 될 수 있다. 그 종류는 개발이 진척됨에 따라 점점 더 다양해질 것이다. 따라서 그러한 파이썬 패키지들에 대한 정보를 하나의 텍스트 파일에서 관리하도록 하자. 그러면 pip는 해당 텍스트 파일을 읽음으로써 필요한 파이썬 패키지들을 한 번에 설치할 수 있게 된다. 이는 새로운 로컬 환경에서 빠르게 개발에 필요한 환경을 설정하는 데 도움을 준다. 필자의 경우 프로젝트 폴더 안에 requirements.text라는 파일을 생성하고 그 안에 다음과 같이 필요한 파이썬 패키지들을 작성하였다.

 

# Django
Django==2.2.12

# Django 디버그 툴바
django-debug-toolbar==1.11

# 파이썬 코드 Convention 검사 도구
flake8==3.2.1

# PostgreSQL를 사용하기 위해 필요
psycopg2==2.8.1

 

이제 pip가 이 파일을 읽어서 파이썬 패키지들을 설치하게 해보자. 현재 디렉토리에서 requirements.txt 파일을 찾고, 해당 파일 내용을 바탕으로 필요한 파이썬 패키지들을 한 번에 설치하게 된다. 이로써 장고를 비롯한 몇 가지 파이썬 패키지들의 설치가 완료된다.

 

# 파이썬 패키지 일괄 설치
pip install -r requirements.txt

 

3. 장고 프로젝트 생성 및 설정

3-1. 장고 프로젝트 생성

장고가 설치됐으니, 장고 프로젝트를 한 번 생성해 보자. 그러면 프로젝트 폴더 구조는 다음과 같이 될 것이다. 이제 여기서 settings.py 파일을 열어 몇 가지 설정을 변경하자.

 

# 현재 디렉토리에 프로젝트 내용물 생성
django-admin startproject {프로젝트 이름} .
  • {프로젝트 폴더 이름}/
    • {프로젝트 이름}/
      • __init__.py
      • settings.py
      • urls.py
      • wsgi.py
    • requirements.tx
    • manage.py

 

3-2. 장고 프로젝트 설정 변경

먼저, 시간대를 대한민국 기준으로 변경한다. TIME_ZONE 및 USE_TZ 변수와 관련한 내용은 여기에 자세히 나와 있으니 참고 바란다. 다음으로, 데이터베이스 관련 설정을 해야 한다. 데이터베이스의 종류를 SQLite3에서 PostgreSQL로 변경해주고, 미리 생성해 놓은 데이터베이스를 장고와 연결해준다. 이로써 장고 어플리케이션이 PostgreSQL 서버와 통신할 수 있게 되었다.

 

# 시간대를 대한민국 기준으로 변경
TIME_ZONE = 'Asia/Seoul'

USE_TZ = True

# PostgreSQL 데이터베이스 연결
DATABASES = {
    'default': {
        'ENGINE''django.db.backends.postgresql_psycopg2',
        'NAME''{데이터베이스 이름}',
        'USER''postgres',
        'PASSWORD''{비밀번호}',
        'HOST''localhost',
        'PORT''5432',
    }
}

 

3-3. 장고 데이터베이스 마이그레이션

이제 다시 SSH로 프로젝트 폴더에 들어간 다음에 다음 명령어를 수행한다. 장고가 기본적으로 제공하는 여러 (앱의) 기능들을 현재 연결된 데이터베이스에 적용시켜준다.

 

python manage.py migrate

 

3-4. 장고 서버 실행

지금까지 한 설정을 바탕으로 장고 (개발용) 서버를 실행시켜보자. (참고로 이는 개발에만 사용하도록 장고가 기본 제공하는 간단한 버전의 WSGI 서버이다. 실제로 배포할 때는 mod_wsgi와 같은 WSGI 서버를 사용하게 된다.) 기본적으로는 "python manage.py runserver" 명령어를 수행하면 장고 서버를 실행시킬 수 있다. 그런데 우리는 가상 머신 환경에서 서버를 실행시키는 것이기 때문에 고려할 사항이 몇 가지 더 있다. 먼저, 가상 머신(Guest) 입장에서는 PC(Host)가 외부 컴퓨터이기 때문에 자신이 실행한 서버에 외부에서 접근 가능하도록 하려면 0.0.0.0 옵션을 줘서 실행해야 한다(실제로는 포트 포워딩에 의해 10.0.2.15 등의 가상 머신 IP로 접속이 되기 때문). 다음으로, 위의 VM 개발 환경 설정 파트에서 Host에서 8000번 포트로 접속하는 것을 Guest의 8000번 포트로 포워딩되도록 했기 때문에, Guest에서 8000번 포트로 서버를 실행하고 Host에서 8000번 포트로 접속해야 한다.

 

python manage.py runserver 0.0.0.0:8000

 

이제 브라우저의 주소창에 127.0.0.1:8000을 입력하여 장고 서버에 접속해보자. 다음과 같이 뜨면 성공이다.

 

 

4. PyCharm 개발 환경 설정

위 과정까지 잘 따라왔다면 기본적인 개발 환경 세팅은 마무리된 것이다. 그런데 매번 가상 머신에 SSH로 접속해서 vim 등의 편집기를 통해 개발을 하는 것은 너무나도 번거롭고 비효율적이다. 다행히도, 위에서 가상 머신(Guest)의 /vagrant 경로가 PC(Host)의 . 경로(가상 머신 폴더)에 동기화되도록 설정했기 때문에, 가상 머신에 접속하여 개발할 필요 없이 PC에서 바로 개발해도 된다. 즉, 단순히 PyCharm으로 프로젝트 폴더를 열어서 개발을 하기만 하면 해당 변동 사항이 실시간으로 가상 머신 내 파일 시스템에 반영될 것이라는 의미이다.

 

그러나 효율적인 개발을 위해서는 PyCharm에서 장고 서버를 실행시킬 수 있도록 별도로 설정해줘야 한다. 서버를 실행하지 않고 단순히 개발만 하는 경우는 거의 없다. PyCharm이 장고 서버를 실행시킬 수 있으려면 가상 머신 내에 우리가 구축해 놓은 가상 환경에 접근할 수 있어야 한다. 그래야 해당 가상 환경 내에 존재하는 파이썬 인터프리터와 각종 파이썬 패키지를 활용하여 장고 어플리케이션을 실행할 수 있기 때문이다. 다행히도 Professional 버전의 PyCharm은 Vagrant 기반의 가상 머신에 접속하여 그 안에 위치한 특정 가상 환경의 파이썬 인터프리터를 프로젝트의 인터프리터로 지정할 수 있도록 하는 기능을 제공한다. 아래에서 그 방법을 차근차근 알아보자. (Community 버전의 PyCharm에서는 이러한 기능이 제공되지 않는다.)

 

  1. PyCharm 실행
  2. [File > Open]을 선택하여 프로젝트 폴더를 연다.
  3. [File > Settings]을 선택하거나 [Alt + Ctrl + S] 단축키를 입력하여 설정 창을 띄운다.
  4. 좌측 탭에서 [Project: {프로젝트 폴더 이름} > Project Interpreter] 메뉴를 선택한다.
  5. 톱니바퀴 아이콘 클릭 후 [Add]를 선택하여 인터프리터 설정 추가를 위한 창을 띄운다.
  6. 좌측 탭에서 [Vagrant]를 선택한다.
  7. [Vagrant Instance Fold]에 가상 머신 폴더(= Vagrantfile이 위치하는 곳)를 지정한다.
  8. [Python interpreter path]에 가상 환경의 인터프리터를 지정한다. (/home/vagrant/.pyenv/versions/{가상 환경 이름}/bin/python3.6)
  9. [OK]를 클릭하여 인터프리터 설정 추가를 완료한다. 그러면 자동으로 프로젝트의 인터프리터 설정이 이것으로 지정된다.
  10. (선택) 다른 인터프리터 설정도 존재한다면, 이름 충돌을 예방하기 위해 각 인터프리터 설정에 이름을 부여하는 것이 좋다. 이를 위해서는 톱니바퀴 아이콘을 클릭한 후 [Show All]을 선택하여 각 인터프리터 설정을 편집하면 된다.
  11. [Run > Edit Configurations]를 선택하여 장고 서버 실행 설정 창을 띄운다. [Host]에는 0.0.0.0을, 그리고 [Port]에는 8000을 입력하여 장고 서버 실행 시 0.0.0.0 및 8000번 포트 옵션을 주도록 설정한다. (= 프로젝트 실행 시 "python manage.py runserver 0.0.0.0:8000"을 수행하도록 설정)
  12. 프로젝트 폴더를 마우스 오른쪽 클릭하여 [Mark Directory as > Sources Root]로 지정