Flask 완전 정복: 파이썬 웹 프레임워크의 모든 것

 

Flask 완전 정복: 파이썬 웹 프레임워크의 모든 것

파이썬(Python)으로 웹 서비스를 만들려고 한다면, Flask(플라스크) 를 꼭 한 번쯤 들어봤을 겁니다.

 

간단하면서도 확장성 높은 이 웹 프레임워크는 미국뿐 아니라 전 세계 개발자들에게 사랑받고 있는데요.

 

이번 글에서는 Flask의 기본 개념부터 실제 코드 예제, 그리고 앞으로의 발전 가능성까지 하나하나 꼼꼼하게 살펴보려고 합니다.

 

Flask가 낯선 분들도 쉽게 따라올 수 있도록 최대한 친근하고 쉽게 풀어봤습니다.

 

그럼 Flask에 대해 본격적으로 알아볼까요?

 

1. Flask란 무엇인가요?

Flask는 파이썬 기반의 경량 웹 프레임워크인데요.

 

웹 서비스나 API를 만들 때 자주 사용됩니다.

 

가장 큰 특징은 '최소한의 의존성(minimal dependencies)' 철학을 바탕으로 설계됐다는 점입니다.

 

Flask는 두 가지 핵심 라이브러리에 의존합니다:

  • Werkzeug(버크쭈그): WSGI(Web Server Gateway Interface) 툴킷
  • Jinja2(진자2): 템플릿 엔진

이 덕분에 Flask는 단순한 구조지만 유연하게 확장할 수 있습니다.

 

웹 서비스를 빠르게 시작하고 싶은 분들께 딱 맞는 프레임워크입니다.

 

2. Flask의 핵심 개념들

Flask를 제대로 이해하려면 몇 가지 핵심 요소들을 알아야 하는데요.

 

이 개념들은 서로 밀접하게 연결돼 있습니다.

 

Flask 애플리케이션

Flask 프로젝트에서 가장 먼저 만드는 것이 애플리케이션 객체입니다.

 

Flask 클래스를 인스턴스화하면 하나의 애플리케이션이 만들어집니다.

from flask import Flask
app = Flask(__name__)

 

Flask 라우팅

라우팅(Routing)은 사용자가 어떤 URL로 접근했을 때 어떤 동작을 할지 정하는 기능인데요.

 

Flask에서는 @app.route 데코레이터를 사용해 라우트를 정의합니다.

@app.route('/')
def index():
    return 'Hello, World!'

 

Flask 요청(Request)

요청은 클라이언트가 서버에 보내는 HTTP 요청입니다.

 

Flask에서는 request 객체를 통해 다양한 정보를 확인할 수 있습니다.

from flask import request

method = request.method
url = request.url
headers = request.headers
query_params = request.args
form_data = request.form

 

Flask 응답(Response)

응답은 서버가 클라이언트에게 보내는 HTTP 응답입니다.

 

Response 객체를 사용해 직접 응답을 구성할 수 있습니다.

from flask import Response

response = Response(
    response=b'Hello, World!',
    status=200,
    mimetype='text/plain'
)

 

Flask 컨텍스트(Context)

 

요청을 처리하는 동안 Flask는 컨텍스트(Context)를 생성합니다.

 

컨텍스트는 현재 애플리케이션, 요청, 사용자 정보를 담고 있는데요.

 

주로 current_app이나 g 객체를 통해 접근합니다.

from flask import current_app
app_name = current_app.name

 

Flask 설정(Configuration)

설정은 Flask 애플리케이션의 동작을 제어하는 값들입니다.

 

환경 변수, 설정 파일, 코드 내 직접 정의 등 다양한 방식으로 설정할 수 있습니다.

from flask import Flask

app = Flask(__name__)
app.config['DEBUG'] = True

 

 

3. Flask의 동작 원리

Flask가 요청을 처리하는 전반적인 흐름을 한 번 정리해볼게요.

 

요청 처리 흐름

  1. 클라이언트가 HTTP 요청을 보냅니다.
  2. Flask는 Werkzeug를 통해 요청 객체를 생성합니다.
  3. 사용자가 접근한 URL에 매핑된 라우트를 찾아서 해당 뷰 함수를 실행합니다.
  4. 뷰 함수는 응답 객체를 반환합니다.
  5. Flask는 이 응답을 클라이언트에게 전송합니다.

응답 생성

  1. Response 객체를 생성하고 응답 본문, 상태 코드, MIME 타입 등을 설정합니다.
  2. HTML 응답이라면 render_template()를 사용해 템플릿을 렌더링합니다.
  3. JSON 응답이라면 jsonify()로 변환합니다.

템플릿 렌더링 흐름

  1. 템플릿 파일을 불러옵니다.
  2. 뷰 함수가 반환한 값들을 템플릿에 전달하고 HTML로 렌더링합니다.
  3. 렌더링된 HTML을 응답으로 전송합니다.

 

4. 실제 코드로 보는 Flask

이제 Flask의 기본 사용법을 코드로 살펴보겠습니다.

 

Flask 애플리케이션 만들기

from flask import Flask
app = Flask(__name__)

 

라우트 정의하기

@app.route('/')
def index():
    return 'Hello, World!'

 

애플리케이션 실행하기

if __name__ == '__main__':
    app.run()

 

 

5. Flask의 미래와 도전 과제

 

향후 기대되는 발전 방향

  • 성능 최적화: 처리 속도 향상, 렌더링 개선 등
  • 확장성 강화: 더 많은 플러그인, 미들웨어, 서드파티 확장 지원
  • 문서와 커뮤니티: 튜토리얼, 샘플 코드, 한국어 자료 확대 등

Flask가 마주한 과제

  • 성능 병목: 요청 처리 속도, 템플릿 렌더링 속도 등
  • 확장성 한계: 대규모 프로젝트에서 구조화가 어려울 수 있음
  • 학습 곡선: 초보자 입장에서 개념 정리가 쉽지 않을 수 있음

 

6. 자주 묻는 질문(FAQ)

정적 파일은 어떻게 처리하나요?

from flask import url_for
url_for('static', filename='style.css')

 

Flask는 /static 경로 아래 있는 정적 파일을 자동으로 처리합니다.

폼 데이터는 어떻게 받나요?

from flask import request
name = request.form['name']

 

request.form은 HTML 폼에서 전송된 데이터를 딕셔너리 형태로 제공합니다.

 

파일 업로드는 어떻게 하나요?

from flask import request
file = request.files['file']

 

파일 업로드는 request.files를 사용해 처리합니다.

 

세션은 어떻게 관리하나요?

from flask import session
session['username'] = 'user1'

 

세션은 딕셔너리처럼 다룰 수 있으며, 쿠키 기반으로 작동합니다.

 

에러는 어떻게 처리하나요?

from flask import Flask
app = Flask(__name__)

@app.errorhandler(404)
def not_found_error(e):
    return 'Not Found', 404

 

@app.errorhandler 데코레이터를 사용해 에러 처리 핸들러를 정의할 수 있습니다.