언제 Django를, 언제 Flask를 사용해야 할까?



DJANGO

VS

FLASK


1. 개요

때때로 질문을 받습니다.

 언제 Flask를 써야하고 언제 Django를 써야 하나요?

지금부터 말씀드리는 것은 무엇이 좋고 나쁘고의 의미가 아닙니다. Django와 Flask는 Web Framework 이고 Python 언어를 기반으로 한다는 것만 같고 서로가 서로를 비교할만한 그런 존재들이 아니기 때문입니다. Django와 Flask는 비교가 될 수 없고, 만약 속도와, 개발 편의성을 생각하는 것이라면 그 또한 그렇게 차이가 없습니다. 엔지니어 실력과 프레임워크의 퀄리티 보다 더 중요한것이 해당 프레임워크에 익숙한가? 이기 때문입니다.



2. 왜 별로 차이가 없나요?

Django를 다룰줄 아는사람은 Flask도 잘 다룹니다. Flask를 잘 다룰줄 알면 Django도 어렵지 않게 다룹니다. 아마 Flask를 잘 다루고 Django를 한번도 사용해 보지 않았다고 해도, 적응하는데 1시간이면 충분할 것이라 생각됩니다. 사실 해당 프레임워크들이 어떤 범주에 들어가느냐 의 차이부터 시작되지만, 실질적인 본질은 다른데 있다고 생각합니다. 우선 둘의 범주는;

  • Django - Full-stack Framework
  • Flask - Micro Framework (Django Rest Framework와 같음)


포럼이나 StackOverFlow 같은 곳에 가서 파이썬 웹프레임 워크 중 무엇으로 웹개발을 할까요? 라고 하면 열에 아홉은 Django를 사용하라고 할 것입니다. 그리고 나머지 한명은 그 웹의 용도가 뭐냐고 물을꺼에요. 선뜻 Flask를 권하지는 않습니다.


왜냐하면 Flask는 약 27,000줄 밖에 안되는 가벼운 프레임워크이기 때문에, 개발자가 거의 모든 것을 설정하고 세팅해야 하는 번거로움이 있습니다. 반면, Django는 이의 10배나 무거운 프레임워크입니다. 당신이 생각하는 (그 무엇을 생각하던) 이미 거의다 개발되어있고, 그냥 레고놀이 하듯이 블럭쌓기처럼 쌓아만 가도 멋진 웹을 서빙할 수 있을거에요. 



3. 그래서 Flask가 나쁜 것인가?

우선 Flask가 나쁜 것이 아니라 Flask는 다른 것입니다.

초심자 분들은 Flask가 배우기 쉽고 편하다 생각하실 수 있지만, 저는 Flask가 사실 조금 더 어렵다 생각합니다.


무엇이 다른가?

일단, 프로젝트 레이아웃이 다릅니다. Flask는 프로젝트마다 1개의 어플리케이션을 개발하도록 되어 있지만, Django는 한 프로젝트 내에 다양한 어플리케이션이 존재 할 수 있습니다. 같은 프로젝트 안에서 여러 어플리케이션이 동시에 사용하는 재사용 가능한 코드를 작성하기도 쉽고, 개별 프로젝트 관리도 편하게 됩니다. 유지보수의 기본은 분할 정복입니다. 작게 쪼개야 승리합니다.

둘째로, DB 접근입니다. Flask는 따로 ORM이 없기때문에 SQLAlchemy 등을 사용하는 반면, Django는 아주 아주 강력크한 ORM이 있습니다. Django ORM은 게을러 터져서 DB 접속을 최소화 합니다. 한번 써보면, 이거 없이 어떻게 지금까지 살았지? 할 정도 일거에요. Django 프로젝트가 아닌 다른 프로젝트를 진행해도 Django ORM Standalone 라이브러리를 사용해서 이용하는 사람들도 있습니다. 

셋째로, Django가 거의 모든 기능을 다 지원한다고 해도, 내가 원하는 기능이 따로 있을때 추가하는게 Flask보다 껄끄러울 수 있습니다. Flask는 마이크로프레임워크이고 편하게 확장할 수 있으며, 보다 유연합니다. 많은 웹프레임워크 비기너 분들이 여기서 Flask를 선택합니다. 확장과 커스터마이징이 편하니까요. 제가 다른 포스트에 작성했드시, 라이브러리는 우리가 작성한 코드가 불러오는 것이고, 프레임워크는 우리가 사용하는 것이 아니라, 프레임워크가 우리 코드를 불러가서 사용하는 것이라 말씀드렸습니다. 가볍고 편하며, 제약이 없는 대신 신경쓸 것이 많은 것도 사실입니다.

딩그르르: 다른 포스트(라이브러리와 프레임워크의 차이)


우린 이 둘을 비교하기전에 기본적인 개념을 하나 먼저 알아야 합니다.

  • 프레임워크가 많은 것을 해주면 당연히 유연해 질 수 없습니다.
  • 프레임워크 안에서 방대한 자유도를 가지게 되면, 보안의 문제가 생길 수 있고요.
  • 유연 = 책임 입니다.

그래서, 사실은 Flask가 조금 더 어려운 프레임워크라고 생각해요.



4. 그래서 언제 무엇을 써야 해요?

언제 Django를 쓸까?


  1.  웹앱이나, API 백엔드를 만들고 싶다!
  2.  빠른 개발, 빠른 배포, 빠른 업데이트!
  3.  CSRF, XSS, SQL 인젝션, 클릭재킹등 기본적 보안 완비!
  4.  스케일링 업, 스케일링 다운을 자유자재로 하고 싶다면!
  5.  개발하다 막혔을때 물어볼 곳이 많았으면!
  6.  SQL이 익숙하지 않아서 강력한 ORM이 필요하다면!


DJANGO 사용 서비스

  • Pinterest Engineering
  • Mozilla
  • Bitbucket
  • Udemy
  • The Onion
  • Disqus
  • Washington Post
  • NASA
  • Spotify
  • Instagram Engineering
  • National Geographic
  • The Guardian
  • JSFiddle


언제 Flask를 쓸까?

  1. 도저히 1개의 코드베이스에 담을 수 없을만큼 앱이 크거나,
  2. 아니면 너무 앱이 작다면!
  3. 밑그림부터 시작할 수 있는 실력에 내가 뭘하고 있는지 알고 있다면!
  4. 팀원 중 그 어느 누구라도 Django 와 Python에 익숙치 않다면!
  5. DB로 이미 생성된 NoSQL을 사용


Flask 사용 서비스

  • Pinterest
  • Twilio


만약 이미 생성된 NoSQL을 사용하시려면 답이 없습니다. 무조건 Flask입니다. 

Django는 SQL에 아주 특화되어 있습니다. MongoDB 커넥터인 Djongo는 시작하기전 스키마를 생성해야 합니다. 그냥 단순히 NoSQL을 SQL화 한것 과 같은데, 조금은 더 유연할 수 있어도... 가상의 스키마가 필요합니다. 이미 생성된 NoSQL DB가 아니라 처음부터 시작하면 Django도 나쁘지 않습니다. 콜렉션을 나눌수 있고 필요에 따라 정합성 체크도 해줄 수 있게되지요. .

하지만, 이미 기존 MongoDB가 있고 이걸 사용해서 어플리케이션을 개발해야 하면 Flask 와 PyMongo를 사용해야 합니다. 기존 RDB같은경우 inspectdb 와 같은명령어로 현 데이터베이스 스키마를 불러올 수 있지만, 몽고DB는 할 수 없기 때문인데요. 이 경우 현재 세팅된 몽고DB 각 콜렉션을 스키마로 일일히 만들어줘야 하는데, 실수를 안해 본적이 없고, 한방에 끝내본적이 없습니다. 내가 이럴려고 개발자 하나 하는 생각 듭니다.(레알)

제 Github에 몽고DB 커넥터를 플라스크로 만들어 두었습니다. 실제 사용하는 어플리케이션인데, 특정 어플리케이션 유저 정보가 MongoDB에 있어서, JWT로 SQL서버를 바라보고 있는 다른 Django 어플리케이션이나, 스프링 부트로 작성된 어플리케이션들이 JWT를 인증하기 위한 서버입니다.

https://github.com/riseryan89/Flask-Mongo-Connector



5. 속도?

별반 차이 없습니다.

Flask가 더 빠르다고 하던데, 그렇게 속도가 중요하면 Python으로 만든 것 자체가 처음부터 실수라고 생각합니다. 30ms 와 60ms는 2배 차이지만, 유저는 전혀 체감할 수 없는 차이 입니다. 어디선가 Flask + REST 조합과 Gin(Golang) + Graphql 속도 차이가 최대 10배까지 날 수 있다고 본 적 있습니다. 그러니 뭐 속도를 생각할 것이라면 다른 언어를 선택하시는게 옳다고 보여집니다.


그리고 이미 Django와 Flask는 둘다 초대형 트래픽을 잘 소화 해 내고 있습니다. 사용자가 많은 웹서버는 캐싱을 겁나 빡세게 하기때문에, 우리의 요청이 DB를 치거나, 백엔드 로직을 다 돌고 나올 가능성은 극히 적습니다.


같이 읽어 볼만 한 글: 
Node.js와 GO 웹서버 성능을 능가하는 파이썬의 웹서버가 나왔다. 아성에 도전한다. FastAPI written in Python

어쩌면.. FastAPI가 Django, Flask 를 1년 내에 능가할 수도..
파이썬 엔지니어들 뿐 아니라, 웹프레임워크의 지도를 다시 쓸 괴물이 Python에 나타났습니다.

Node.js 아성에 도전한다. FastAPI written in Python (클릭!)


  • [[a.original_name]] ([[a.file_size | fileSizer]])
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'파이썬' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]