프로젝트 기본 구조

3.1. 프로젝트 기본 구조

Flask는 개발자에게 높은 자유도를 부여합니다. 자유도가 높다는 것은 개발자의 입맛이나 취향에 맞게 웹 시스템을 개발할 수 있다는 뜻입니다.

웹 시스템에서 필요한 데이터베이스, HTML 페이지, 화면 처리 (view)와 같은 다양한 것들을 개발자가 자유롭게 구성할 수 있습니다.

우리가 개발할 웹 시스템이 아주 간단하다면 높은 자유도는 큰 장점이 될 수 있습니다. 하지만 웹 시스템이 복잡해지면 개발을 효율적으로 진행할 수 있는 프로젝트 구조가 필요합니다.

어느 정도 이상의 규모가 되는 프로젝트에서는 만들어진 프로젝트 구조 가 매우 중요합니다. 하지만 flask는 프로젝트를 구조화하는 어떠한 규칙이나 추천 사항도 없습니다. Django와 같은 프레임워크가 대부분의 개발 구조를 제공하는 반면에 Flask는 어떤 것도 제시하지 않습니다. 따라서 프로젝트 구조를 만들때 많은 고민과 생각이 필요합니다. 물론 경험과 노하우도 필요합니다.

그렇다면, 초보자인 우리가 접근할 수 있는 방법은 무엇일까요?

네, 맞습니다. 실력있는 개발자들이 자주 사용하는 프로젝트 구조를 흉내내어 개발하는 것입니다. 모방은 창조의 어머니다. 라는 말이 있지요? 처음에는 잘 정리된 프로젝트 구조를 따라할 수 밖에 없습니다. 자주 개발을 하다보면 자신만의 노하우가 생깁니다. 그때는 여러분 나름대로의 프로젝트 구조를 만들어서 사용하면 됩니다.

우리는 아래와 같은 구조를 사용할 예정입니다.

    [작업 디렉토리]
    │
    ├── [프로젝트 이름]/
    │      ├─ __init__.py
    │      ├─ models.py
    │      ├─ forms.py
    │      ├─ views/
    │      │   └─ main_views.py
    │      ├─ static/
    │      │   └─ style.css
    │      └─ templates/
    │            └─ index.html
    └── config.py

파이썬 기반 웹 개발 프레임워크인 Django는 새로운 프로젝트를 생성하면 위와 같은 프로젝트 구조를 자동으로 생성해 줍니다. Flask는 그렇지 못하기 때문에 개발자가 일일히 만들어 주어야 합니다.

참고로, 어떤 이름 끝에 / 가 붙어 있다면 폴더를 의미합니다. / 가 붙어있지 않다면 파일입니다. 예를 들어 위 프로젝트 구조에서 views/는 끝에 /가 붙어 있으므로 폴더를 의미합니다.

위에서 언급한 프로젝트 구조에 대하여 하나씩 설명하겠습니다. 당장 모든 내용을 암기할 필요는 없습니다. 우리의 공부가 진행되면서 하나하나 완성해 가므로 자연스럽게 이해할 수 있습니다.

  • [작업 디렉토리]: 현재 여러분이 flask 웹 시스템을 코딩하기 위해 들어와 있는 디렉토리 이름입니다. 저는 Source_codes 라는 이름을 가진 디렉토리에서 작업하고 있습니다. 여러분은 여러분이 만든 이름을 가진 디렉토리에 있을 겁니다. 그 디렉토리 이름을 의미합니다.

  • [프로젝트 이름]: 우리가 만들 웹 시스템의 이름입니다. 디렉토리(폴더) 이름이기도 합니다. 우리는 지금까지 hello_cju라는 이름을 사용하였습니다. 여러분 나름대로 원하는 이름이 있다면 바꿔줘도 상관 없습니다. 다만 이름을 바꿨다면 환경 변수 설정을 할 때 바뀐 이름을 사용해야 합니다.

  • __init__.py: [프로젝트 이름] 디렉토리 안에 있는 파일들을 패키지처럼 사용할 수 있게 해주는 파일입니다. [프로젝트 이름]에 속한 파일들이 공통으로 초기화 해야 하는 내용이 담길 수도 있으며, [프로젝트 이름]의 원래 내용을 담을 수도 있습니다. 우리는 이전에 만들었던 hello_cju.py의 내용을 __init__.py에 옮겨 담아서 __init__.pyhello_cju.py 역할을 하도록 해 줄 예정입니다.

  • models.py: 우리는 웹 시스템에서 사용할 데이터베이스의 query 언어를 이해하지 못해도 데이터베이스를 쉽게 사용할 수 있는 ORM(Object Relational Mapping) 기술을 사용할 것입니다. ORM을 편리하게 사용할 수 있도록 지원하는 SQLAlchemy 라는 패키지를 사용할 것입니다. 우리가 개발할 프로젝트에서 사용할 데이터베이스 모델을 정의해 줄 파일이 필요합니다. models.py 파일은 데이터베이스 모델을 정의한 내용이 담길 파일입니다.

  • forms.py: 웹 시스템을 구현하다 보면 인터넷 사용자가 크롬과 같은 웹 브라우저에 입력한 데이터를 flask 서버 쪽으로 가져와야 하는 작업을 해야 합니다. 이때 사용하는 것이 form 이라는 것입니다. 우리는 WTForms라는 라이브러리를 활용해 데이터를 받아올 것입니다. WTForms에서 제공하는 Form 클래스를 어떻게 정의할지에 대한 내용이 담길 파일입니다.

  • views/: 이름 끝에 / 붙어 있으니 디렉토리(폴더)입니다. 인터넷 사용자가 접속 했을 때 flask 서버는 어떤 작업을 하고 그 결과를 사용자의 웹 브라우저에 뿌려줘야 합니다. 서버에서 어떤 작업을 처리하는 것을 view에서 처리한다고 표현합니다. view 작업을 정의한 파일들을 모아 놓은 디렉토리(폴더) 입니다. 위 예제에서는 main_view.py 라는 모듈이 하나 포함되어 있는 경우입니다. 우리는 이 폴더에 여러 개의 view 파일을 추가해 나갈 것입니다.

  • static/: 이름 끝에 / 붙어 있으니 디렉토리(폴더)입니다. static 이라는 의미는 정적, 고정된 이라는 의미를 가지고 있죠? 말 그대로 정적인 파일들을 모아 놓을 디렉토리(폴더) 입니다. 정적인 파일들은 HTML 내용에 효과를 입히는 CSS(Cascade Style Sheet), Java Script (.js 파일), 이미지 파일(.png, .jpg 등) 등이 있습니다. 우리는 이 폴더에 정적인 파일들을 차곡차곡 모아 놓을 것입니다. 위 예제에는 style.css라는 파일 1개만 들어 있는 상황입니다.

  • templates/: 이름 끝에 / 붙어 있으니 디렉토리(폴더)입니다. 웹 시스템은 기본적으로 웹 브라우저를 이용합니다. 웹 브라우저의 내용은 HTML 언어로 작성된 문서로 제공됩니다. HTML 언어로 작성된 문서는 .html 이라는 확장자가 붙게 됩니다. 우리는 다양한 웹페이지 파일 .html 파일들을 이 디렉토리에 모아 놓을 것입니다. 위 예제에는 index.html 이름을 가진 HTML 파일이 하나 담겨있는 상황입니다.

  • config.py: 웹 시스템을 개발하다 보면 개발 프로젝트에 적용할 환경 설정을 이것 저것 하게 됩니다. configconfiguration의 약자입니다. configuration은 컴퓨터 시스템을 작동시키기 위한 설정을 의미합니다. 개봘 과정에서 여기 저기에 환경 설정에 관련한 내용이 흩어져 있다면 관리하기 참 힘들겠죠? 개발에 필요한 환경 설정 내용을 모아 놓은 파일입니다.

여러분이 필요하다면 추가적으로 디렉토리(폴더)나 파일들을 얼마든지 추가할 수 있습니다. 자유롭게 추가하는 것은 여러분이 많은 개발 경험과 노하우를 쌓은 후에 해도 늦지 않습니다. 일단 우리는 위에서 제시한 프로젝트 구조를 가지고 학습을 진행해 나가겠습니다.

VS code의 File Explore 영역에서 마우스 오른쪽 클릭을 하거나, File 메뉴를 클릭하여 위에서 제시한 것과 같이 프로젝트 구조를 만들어 봅니다.

제가 만든 VS code에서의 프로젝트 구조는 그림 Fig. 3.1와 같습니다.

vscode project structure

Fig. 3.1 VS code에서 프로젝트 구조 생성

그림 Fig. 3.1을 자세히 살펴보면 __pychache__라는 디렉토리(폴더)가 자동으로 생긴 것을 볼 수 있습니다. Python은 실행하기 전에 소스코드를 바이트코드로 먼저 바꾸게 됩니다. 이렇게 바뀐 파일들은 바이트코드는 .pyc, 최적화된 바디트코드는 .pyo라는 확장자를 갖게 됩니다. Python을 실행하기 위해 바이트코드로 변경된 파일들을 모아 두는 디렉토리(폴더)가 바로 __pychache__ 입니다. 프로그래머는 신경쓰지 않아도 됩니다. 삭제하게 되면 다시 생깁니다.

이제 flask 프로젝트 구조에 대하여 구체적으로 살펴봤습니다.

우리가 앞으로 작업할 내용들에 대한 밑그림이 그려지나요?

지금 당장 모든 것을 이해할 수 없어도 상관 없습니다. 앞으로 계속해서 반복적으로 우리가 다루게 될 구조이므로 차차 알아가면 됩니다.

"아! flask를 개발할때 대략 이런 프로젝트 구조를 사용하는구나!" 정도면 충분합니다.

여러분, 이제 다음 기본기를 배울 준비가 되셨나요?

그러면 차근차근 스텝을 밟아 보도록 하겠습니다.

Next 아이콘을 클릭하여 시작해 보세요.