[Python] Django Web 구축부터 릴리즈까지(1)



목표

본 포스팅에서는 Python으로 Web을 구축하게 된 계기 및 Django 프레임 워크를 활용하여 배포 및 운영했던 사항에 대해 정리합니다.




목차


  1. Python으로 Web 구축을 고려한 이유
  2. Python으로 Web 구축 시 갖는 리스크
  3. Python Web Framework 「Django 」
  4. Application 구성에 대해서 (Url 관리 등)
  5. View & Template에 대해서
  6. 정리



1.Python으로 Web 구축을 고려한 이유

  • 데이터 처리와 관련 된 라이브러리에 있어 큰 이득을 볼 수 있습니다.
    : Pandas, Numpy, Tensorflow, Scrapy, Matplotlib 등
  • 코드 프로파일링할 수 있는 모듈을 내장하고 있어, 전체 실행 시간과 함수 동작 시간에 대해 측정하는 데에 유리합니다.
  • 신뢰할 수 있는 유용한 프레임워크들이 있습니다.
    : Django, Flask 등
  • 내・외부 라이브러리의 패키지 관리에 강합니다.
    : 개발-검증-상용 환경에 적용 될 각각의 라이브러리 명 혹은 버전에 대해서 리스트 업하여 관리할 수 있어 용이합니다.
  • 다른 언어들과의 호환성이 뛰어납니다.
    ①Cpython / IronPython
    : Cpython의 경우, C 함수를 직접 호출하여 파이썬으로 사용 가능하며 둘 다 .NET 프레임 워크에서 pandas나 numpy 등 데이터 처리 라이브러리를 호출할 때 사용할 때 많이 활용합니다.
    ②Jython
    : Why use Jython when you could just use Java? [closed]
    (요약하면, 견고한 자바를 간결한 파이썬의 구문으로 쓸 수 있다는 점인데 의견이 분분하다)
  • 다른 언어에 비해 더 명확하고 가독성이 좋으며, 고민할 요소들이 줄어듭니다.
    : 파이썬에서는 배열을 위한 메모리 할당, 메모리 정렬, CPU로 데이터를 보내는 순서 등을 고민 할 필요가 없습니다. (이 부분이 정말 매력적인 부분인 반면에, 아래의 단점에서 볼 수 있듯이 성능에 대한 많은 부분들을 포기해야 합니다.)


2. Python으로 Web 구축 시 갖는 리스크

  • CPU를 많이 사용하는 작업 처리 시, 복수의 프로세스 처리에 대한 지원이 부족합니다. 기본적으로 싱글 스레드 언어이기 때문에 병렬 처리를 위해서는 별도의 모듈을 사용해야 합니다.
  • 다른 언어에 비해 성능 면에서 손해를 보기 때문에 메모리를 활용해야 하는 작업에는 불충분합니다.
  • Java와 같이 다른 언어에 비해, 숙련된 Python 웹 개발자가 적습니다.



3. Python Web Framework 「Django 」


Python으로 웹을 작성하기 위해 사용되는 프레임워크에는 장고(Django)와 플라스크(Flask)가 있지만, 본 포스트에서는 Django에 대해 다룹니다.

  • 프로토타입을 빠르게 작성하는 데에 유리하여 애자일 개발 방식에 유리합니다. 장고는 기본적으로 아래의 3가지를 제공합니다.

    ① Admin 페이지 및 계정 관리 및 세션관리 기능
    ② DB 바인딩
    ③ 개발용 내장 서버

    웹 작성 초기에는 많은 수정 사항들이 발생하고, 기본 사양 및 구성이 변경되는 상황들이 빈번하게 발생합니다. Django의 경우 기본 어드민 페이지로 세션관리 기능을 테스트 해 볼 수 있습니다. 뿐만 아니라 Django Model 조작의 형태로 여러 데이터베이스를 공통된 형식으로 기본적인 조작(CURD)이 가능합니다. 또한 개발용 내장 웹 서버를 제공합니다. 상용 서버에 대한 설정이 없이도 웹을 작성할 수 있습니다.

  • 견고한 작업을 위해서는 별도의 모듈을 활용해 각각의 데이터베이스와 연결해야 하며, 릴리즈 전에는 보안을 위하여 내장서버가 아닌 자체 서버를 올려야 합니다.

    하지만, 위의 3가지 특징은 필요한 웹을 작성할 때 초기 스타트가 빠르고 쉽게 접근할 수 있다는 점에서 유리합니다.



4. Application 구성에 대해서 (Url 관리 등)

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
            0001_initial.py
        models.py
        static/
            polls/
                images/
                    background.gif
                style.css
        templates/
            polls/
                detail.html
                index.html
                results.html
        tests.py
        urls.py
        views.py
    templates/
        admin/
            base_site.html


  • manage.py
    : 프로젝트와의 상호작용을 위한 커맨드 라인의 유틸리티로, 프로젝트 생성 시 자동 생성 됩니다.

    ① startproject
    ② runserver
    ③ makemigrations
    ④ migrate
    ⑤ collectstatic

  • settings.py
    : 프로젝트의 환경 및 구성을 저장합니다. (7번에서 자세히 설명)

    ① ALLOWED_HOST
    ② DATABASE
    ③ INSTALLED_APP
    ④ MEDIA_URL
    ⑤ STATIC_DIR
    ⑥ DEBUG

    ⑦ SECRET_KEY

  • urls.py
    : 애플리케이션에서 사용자가 URL을 입력하면 어떤 페이지를 보여줄지에 대해 정리하며,  URL과 일치하는 view를 찾기 위한 패턴들의 집합입니다.

  • wsgi.py
    : WSGI(Web Server Gateway Interface)
    Python으로 작성한 애플리케이션이 웹 서버와 통신하기 위해 작성되는 미들웨어로, WSGI 서버는 애플리케이션의 서버에 대한 경로를 읽고, 코드를 호출합니다.

  • migrations
    : 데이터베이스에 필요한 테이블을 만들면서 적용되는 각 migration에 대한 정보를 표시하며 모델 (및 DB 스키마)에 대한 변경 사항을 저장합니다 (6번.Model에 대해서 참고)

  • static
    : 웹을 구축 할 때에는 Javascript 또는 CSS, 이미지와 같은 파일들을 포함하게 됩니다. Django에서는 이러한 파일을 static 디렉토리에서 관리합니다.

  • templates
    : Django는 웹 프레임워크이기 때문에, HTML을 동적으로 생성하게 됩니다. 이 때 템플릿에 원하는 HTML과 관련 코드들을 작성하게 되는데, 이를 template 디렉토리에서 관리합니다.



5. View & Template

  • View

Web에서 Request를 받고 Response를 반환하는 방법으로 View 함수를 사용합니다. 클라이언트에게 돌려보내는 응답은 HTML 페이지 자체가 될 수도, 리디렉션redirection이 될 수도, 오류를 반환할 수도 있습니다. 

따라서, View에는 클라이언트에게 Response를 반환하는 데 필요한 로직이 포함됩니다.  View에 작성한 코드는 Python 환경 아래에 있다면 어느 곳에서든 재사용 할 수 있습니다.

  • Template

Html을 동적으로 생성하는 부분을 위한 언어와, 로직을 담당하는 view의 언어를 깔끔하게 분리하기 위하기 위해서 ‘템플릿 언어’라는 미니 언어를 사용합니다.
이 템플릿 언어로 백엔드에 관계없이 템플릿을 로드 및 렌더링 할 수 있습니다.

템플릿 API에 대해서 설명하면, load는 주어진 식별자에 대한 템플릿을 찾고 이를 사전 처리 합니다. rendering은 문맥context 데이터로 찾은 템플릿을 보관하고, 가져온 데이터들을 문자열의 형태로 반환합니다.




6. 정리

파이썬은 데이터 처리 관련 라이브러리가 다양하고, 신뢰도 있는 프레임워크를 사용할 수 있다는 점에서 웹 구축시 이점을 가지고 있습니다. 또한 환경 별로 패키지 관리가 용이하기 때문에, 배포 시에도 실수를 막을 수 있습니다.

하지만 데이터 처리와 함께 성능에 대한 부분을 손해 볼 수 있기 때문에, 이에 대해서는 별도의 처리가 필요합니다.

Django에서는 커맨드 라인 유틸리티로 프로젝트를 생성하고 서버를 돌리며, View・Temlate・Model・Static 등을 통해 클라이언트와 백엔드를 구별하며, 동적으로 페이지를 생성합니다.

다음 포스팅에서는 환경 관련 설정 파일, 서버 구축 시에 필요한 WSGI 등에 대해 다룹니다.