'더 좋은 Flask 어플리케이션 만들기'는 1 module 기반의 Flask 어플리케이션에서, 필자가 작성한 Flask-Large-Application-Example까지 나아가는 여정을 다룹니다.

약간의 웹 프레임워크 이야기

웹 프레임워크의 종류를 따지면 대부분 full-stack web frameworkmicro web framework로 나누곤 한다. full-stack web framework는 웹 어플리케이션 하나를 완성하기 위한 모든 게 준비되어 있고, micro web framework는 웹 어플리케이션 서버를 개발하기 위한 '최소한'이 준비되어 있으며 확장이 용이하게 설계되어 있는 것이 특징이라고 한다.

쉽지 않은 이야기고, 그냥 우리에게 당장 와닿는 부분은 '프로젝트의 초기 상태'일 것이라고 생각한다. Python 쪽에서 두 종류의 프레임워크를 대표하는 것이 Django(full-stack)Flask(micro)인데, 두 프레임워크의 초기 상태는 다음과 같다.

Django의 프로젝트 초기 상태

django-admin startproject {project_name} 커맨드를 입력해서 프로젝트를 시작하고, 명령어가 실행된 디렉토리에 아래와 같이 이런저런 파일들이 세팅된다. 프로젝트 이름이 planb라면, 아래처럼 만들어진다.

planb/
    manage.py
    planb/
        __init__.py
        settings.py
        urls.py
        wsgi.py

생성된 파이썬 모듈들에는 django가 자동으로 코드를 삽입해 둔 상태다.

Flask의 프로젝트 초기 상태

프로젝트를 시작하기 위한 커맨드는 없고, 그냥 모듈 하나 생성해서 아래처럼 코드를 작성하면 된다.

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
  return 'hi'

app.run()

뭐가 더 좋음?

뭐가 생산성이 더 좋고 그런건 없고, 그냥 익숙함과 취향의 차이라고 생각한다. 구조에 대해 신경쓰지 않아도 되고 ORM같은 것들을 이미 준비해 주어서 딱 맞춰 개발하면 되니까 Django를 좋아하는 사람들도 있고, 필자처럼 고민의 흔적이 들어간 '이유 있는 구조'를 만들어가는 것을 즐거워해서(솔직히 말하면 그냥 지 맘대로 하는 거 좋아해서) Flask를 좋아하는 사람들도 있다. 또는 클라이언트 사이드 렌더링 기반의 웹 서비스를 개발하기 위해 API 서버를 구현하기에 좋은 프레임워크라서 Flask를 쓰는 경우도 있고.

이 컨텐츠의 동기

고등학교 1학년 때 Flask라는 프레임워크를 쓰기 시작했고, 졸업한 지금까지도 + 회사에서도 쓰고 있다. Flask 어플리케이션의 '좋은 구조'를 만들기 위해 참 많이 고민했고, 이런 경험을 공유하고자 이 컨텐츠를 기획했다.

한 모듈에 이것저것 다 우겨넣은 어플리케이션을 리팩토링하는 방식으로 진행할지, 아니면 간단한 Hello World 서버로 시작해서 Flask에 대한 배경지식을 쌓아가며 진행할지 고민했었는데, 아무리 생각해도 후자가 좋을 것 같아서 이번 챕터에서 Hello World 서버를 작성하는 것으로 긴 여정을 시작하도록 하겠다.

일러두기

코드 참조

GitHub에 저장소를 만들어 두었다. 컨텐츠의 진행 흐름에 따라 커밋도 깔끔하게 정리하려고 한다. 첫 커밋부터 코드 스냅샷과 diff들을 보며 어플리케이션 구조가 잡혀가는 모습을 시간 순서대로 잘 살펴볼 수 있게 만들기 위함이다.

의존성 관리 방식

pipenv를 사용하겠다. 컨텐츠를 읽는 데에 필요한 필수 소양은 아니지만, 알아두면 좋을 것이라 생각한다.

파이썬 버전

Python 3.6을 사용하겠다.

gitignore

gitignore.io에서 Python, macOS, Windows, PyCharm+all을 선택하고, 그 내용을 .gitignore에 추가하겠다.

작업

Hello World 서버 작성

위에서도 이야기했듯, Hello World 서버를 작성하도록 하자. GET / 요청 시, text/plain으로 Hello World라는 문자열을 반환하는 WAS다. 그 전에 .gitignore 추가와 pipenv 설정도 진행했다. 스냅샷