본문 바로가기

Python/Frameworks.Libraries

웹서버를 짜주는 Django 에서 프로젝트를 구성하는 방식

Intro

방학을 맞이해서 우선은 DjangoDB 공부를 시작하게되었는데, 일주일에 한 번 정도는 배웠던 내용을 정리하고자 블로그에 포스트를 쓰려한다.

지금도 검색 한 번이면 중복되는 내용이 수두룩하게 나올만한 너무 흔한 내용은 이제 블로그에 적으나 마나이니까, 내가 궁금했던 것 바탕으로 알아본 내용 중 주로 세부적인 부분을 다뤄보려한다.

아무래도 첫 번째 글이다 보니, Django에 대한 전체적인 내용을 다루려하는데, 개인적으로 내가 당황했던 Django의 Project Structure에 대해 다뤄보려 한다.

Django 가 무엇이지?

간단히 말하자면 Web ServerWeb Application을 편리하게 짤 수 있도록 도와주는 Python Framework이다.

생각보다 Wikipedia Django 는 Programming 관련된 정보를 잘 정리해주는 경우가 많다. 내 글을 읽고 이해가 안 되는 부분이 있다면 방금 제시한 Wikipedia 링크로 가보자.

우선 Django의 장점이 몇 가지 있다.

  • 미리 짜여진 패키지들이 많아 따로 처음부터 구현하지 않아도 된다. 따라서 빠른 개발을 할 수 있다.
  • Project를 Application 별로 나누어 개발하기 때문에 유지.보수하기 편리하고 App directory를 필요한 Project에 갖다 붙이기만하면 돼서 재사용, 이식 또한 편리하다.

이외에도 많은 장점이 있지만 Django 가 무엇인가에 대해서는 이미 검색 한 번 이면 넘쳐나는 정보가 있기 때문에 생략한다.

Django 에서 쓰이는 주요한 용어

router, routing : 라우터는 사실 서버를 짤 때 정말 많이 등장하는 용어이지만, 간단하게, 알아듣기 쉽게 설명되어 있는 곳을 찾기는 쉽지 않다. 다른 거 다 떼 놓고 간단히 router를 설명하라고 한다면. 어떤 url에 접속했을 때 해야할 작업에 연결시켜주는 녀석이라고 할 수 있다. 여러 논란이 있을 수 있는 정의의지만, 라우터가 아예 뭔지 모르는 단계에서는 알아듣기 쉬울 것이다. 예를들어 www.naver.com/blog/는 대해 라우터를 정의했다는 것은 호스트의 주소인 www.naver.com에서 blog라는 경로에 대한 router를 정의했다는 것이고 이는 blog라는 경로에 접속했을 때 어떠한 view function을 수행할 지를 정의했다는 것이다. view function이 뭔지는 다음 줄에 나온다.

view function: router에서 아마 알아듣기 힘든 내용이 많이 나왔을 수 있다. view function이란 router가 경로와 경로에 접속했을 때 수행할 function을 정의하는데 이때 "수행할 function" 을 view function이라고 하는 것이다.

Flask vs Django

사실 FlaskDjango를 비교하는 글도 참 많지만 FlaskDjango를 몰랐던 시절 나에게는 딱히 와닿는 글은 찾기 힘들었던 것 같다.

그래서 이 부분은 한 번 내가 짚어보도록하겠다.

flask 에서 web server을 돌린다면 사실 별 다른 flask 지식없이도 간단하게

  • flask module을 install 하고 .py file 을 만든다.

  • 포트를 지정한다.

  • view function()과 경로를 정의하여 라우팅 작업을 한다.

  • 서버를 돌린다

하지만 Django는 처음 시작은 좀 복잡하다. 우선은 project와 그에 속하는 applications 바탕으로 서버를 구성한다.

DjangoDjango 자체와 관련된 command 들이 참 많다.

우선 project를 생성해야하고 필요에 따라(진짜 입문수준의 테스트가 아닌 한) application을 만들고 DB 등을 적용시키고 서버를 돌린다. 말은 간단해 보일지 몰라도 시작 과정은 참 복잡하다

우선 django를 install 했다면, 원하는 디렉토리에 가서 터미널에

django-admin startproject tutorial1 이라는 커맨드를 입력해 tutorial1이라는 프로젝트를 만들어준다.

( 명령어를 입력하면 뭔가 파일과 디렉토리가 많이 생겨서 멘붕이지만 아래에서 설명하도록 하겠다. )

그리고 python manage.py에 runserver 라는 인자와 IP:port 형식의 인자를 넘겨주어 서버를 실행하자

python manage.py runserver 127.0.0.1:8080 127.0.0.1은 local host의 IP이다.

Flask 보다 시작과정은 좀 더 복잡하게 느껴질 수 있다. 자세한 과정 및 개념은 아래에서 설명하겠다.

Flask와 Django의 장단점

딱 잘라 말하기는 오묘한 부분이다. Flask의 경우 기본적으로 제공되는 package들이 적고 유저가 직접 구현해야하는 내용이 많을 수 있지만, 자유로운 형식으로 구현할 수 있고, 원하는 내용으로 붙였다 뗐다 자유롭게 구성할 수 있고, 간단한 구현을 하는 경우 많은 개념은 필요 없을 수 있다.

하지만 Django의 경우는 앞서 살펴봤듯 일단 진입장벽 자체는 좀 있는 편이고 공부 또한, 직접 코드를 짜는 공부보다는 Django project의 structure를 이해하는 공부나 각 패키지가 어떤 식으로 돌아가는 지에 대한 공부가 위주이다. 이 부분이 잘 맞는 사람은 코드를 덜 짜도 되고 구현된 내용을 잘 갖다쓰며 편리하게 이용할 수 있다고 생각할 수 있지만, 반대의 경우는, 코드는 안 짜고 프레임웍에 대한 공부만 하는 느낌이고 재미가 없을 수 있다.

또한 미리 구현된 내용을 갖다쓰는 게 편리할 수도 있지만, 그것과 다른 방식으로 구현하고 싶을 때 하나하나 수정해가며 사용하다보면 더 답답하고 귀찮을 수도 있을 것 같다.

본론 - Django의 Project 구조

서론이 길었다. 드디어 Django의 Project 구조에 대해 자세히 알아보자.

앞서 설명한 대로 Django는 Project 내의 Applications 를 생성하는 구조로 되어있다.

예를 들어 Blog 를 운영하는 Project라면, 가입 application, 글쓰기 application, 댓글 application 등등으로 구성할 수 있다.

그럼 한 번 와닿지 않으니 Django project를 생성해보자. terminal을 열어

django-admin startproject {projectName}

을 입력 후 이후 디렉토리의 구조를 보자

manage.py 파일이 생겼고, {projectName}과 동일한 하부 디렉토리가 하나 생겼다.
맨 위의 {projectName} Directory는 project의 root directory이고 하부의 {projectName} 디렉토리는 나는 편의상 설정디렉토리라고 한다.
main url routing 부터 각종 setting들이 이 설정디렉토리에 들어가있다.

manage.py?

받아들이기 힘들겠지만 우리는 이제 manage.py에 인자를 전달함으로써 명령어를 실행시키며 server를 관리한다. 사진에도 다양한 manage.py 가 인자로 갖는 command 들이 예시로 나와있다.

그냥 django 관련한 명령어를 터미널에 쌩으로 입력하는 게 아니라 manage.py 에 인자로서 전달한다고 보면 되겠다.

예를 원래는 내가 서버를 run 하는 python file이나 nodejs 파일이 testServer.py 혹은 testServer.js라고해보자.

FlaskNode.js 였다면

python testServer.py

node testServer.js 라고 입력해서 서버를 run 했겠지만, Django는

python manage.py runserver 라는 인자로 전달되는 command를 통해 서버가 관리된다.

처음엔 이 manage.py가 뭘 하는 녀석인지, 왜 이렇게 진행하는지 공감하고 이해하기 힘들겠지만

받아들여야한다. Django는 python manage.py 에 추가로 command 역할을 할 인자를 전달함으로써 서버를 관리한다.

settings.py?

settings.py 는 project의 설정을 그냥 python으로 적어놓은 것이다. 예를 들면 이용할 Host ip, html file의 경로, static directory의 경로 등등을 python의 리스트나 str형태로 적어놓았고, 필요에 따라 수정해가며 사용한다.

urls.py?

개인적으로는 Django의 url 관리 부분이 가장 마음에 든다.

경로를 직접 설정하는 하드코딩류로 url을 설정하는 경우는 거의 없고 나눠진 앱 별로 urls.py 에서 라우팅을 한다.

그 중 프로젝트 설정 디렉토리에 있는 urls.py는 app의 루트 라우터를 지정해준다고 보면 된다.

예를 들어 내 Django project에

블로그 유저 프로필 관련된 profile Application이 있고

profile Application은 /profile?userid=1234 등의 url을 이용해 다양한 작업을 하고싶다고 치자

( 예를 들어 /profile/deleteUser?userid/, /profile/history/all_history 등등 상상해보자

이때 profile 에서 작업할 url들은 urls.py에서 그냥 자기가 라우팅 될 경로를 기준으로 그 하부만 작성한다고 보면 된다.

즉 /profile?userid=1234에 대한 router 경로는 "/int:userid"로, /profile/history/all_history는 "history/all_history"로

이후 메인 라우팅 작업을 하는 설정 디렉토리의 urls.py에 /profile/이라는 경로에 profile Applicaion의 urls.py의 작업을 include 시켜준다고 보면 된다.

처음에는 이해가 안 될 수 있지만, 여러 과정을 겪으면서 "아, 이소리구나!" 할 수 있을 것이다.

wsgi.py?

추후 업데이트.

__init__.py

본 파일이 속한 디렉토리가 하나의 package임을 알려주는 빈 파일이다.

class 내부에 __init__ 메소드가 정의된 경우는 class,

디렉토리 내부에 __init__.py가 정의되어 있는 경우는 package 라고 인식한다.

python package 관련한 내용은 검색해보면 많이 나온다.

마치며

원래는 간단히 어떤 식으로 Django project가 구성되는 지만 적으려 했었는데, 적다보니 전달하고 기록하고 싶은 내용이 많아져 글이 길어졌다.

이번 편은 Django의 project의 structure보다는 django가 무엇인지, 각 .py file들이 어떤 역할을 하는 지에 대한 전반적인 개념적 설명 위주였던 것 같은데, 다음 편에는 좀 더 실습적인 코드들과 함께 진행해보겠다.