본문 바로가기
프레임워크/Flask

Flask 프레임워크의 특징

by 클레어몬트 2024. 10. 8.

 

Flask는 Python 기반의 마이크로 웹 프레임워크이다. "마이크로"라는 용어는 Flask가 웹 애플리케이션 개발에 필요한 핵심 기능만을 제공하고, 필요에 따라 다양한 확장 모듈을 추가하는 방식이라는 의미이다. 이러한 특징 덕분에 Flask는 매우 가볍고 유연한 프레임워크로 평가받고 있다. 따라서 작은 규모의 프로젝트에서 대규모 애플리케이션에 이르기까지 다양한 환경에서 사용된다.

 

[Flask의 주요 특징]

1. 간결하고 직관적인 코드
Flask는 웹 애플리케이션을 구축할 때 최소한의 코드만으로도 동작한다. 간단한 웹 페이지를 구축하기 위해 복잡한 설정이나 파일 구조가 필요하지 않으며, 개발자는 핵심 로직에 집중할 수 있다. 예를 들어, 기본적인 "Hello, World!" 웹 애플리케이션은 다음과 같이 매우 간결하게 작성된다

from flask import Flask # Flask 클래스를 가져온다

# Flask 클래스의 인스턴스를 생성하여 app 변수에 할당
# 이 인스턴스는 애플리케이션의 설정, 라우팅, 요청 처리 등을 담당
app = Flask(__name__) // __name__은 현재 모듈의 이름

@app.route('/') // '/'는 웹 애플리케이션의 루트 경로를 의미. 즉, 홈페이지에 해당
def hello(): // 'hello'라는 이름의 뷰 함수를 정의
    return 'Hello, World!' # 클라이언트에게 반환할 응답을 정의

if __name__ == '__main__': # 스크립트가 직접 실행될 때만 서버를 실행
    app.run() # Flask 개발 서버를 디버그 모드로 실행

 

위 코드는 Flask 애플리케이션의 기본 구조로, @app.route('/') 데코레이터는 루트 URL에 대한 요청을 처리하며, 해당 경로로 접속했을 때 "Hello, World!"라는 메시지를 반환한다. 이렇게 간단한 코드로 웹 서버를 실행할 수 있다는 것이 Flask의 장점이다.

 
2. 라우팅 시스템

Flask의 핵심 기능 중 하나는 라우팅 시스템이다. 라우팅은 클라이언트가 특정 URL을 요청할 때 어떤 함수가 그 요청을 처리할지 지정하는 역할을 한다. 예를 들어, /hello 경로로 요청이 들어왔을 때 다른 메시지를 반환하고 싶다면 다음과 같이 작성할 수 있다

@app.route('/hello')
def hello_page():
    return 'Hello, Flask!'

 

Flask는 URL과 함수 간의 매핑을 매우 직관적으로 설정할 수 있다. URL 경로마다 다른 처리를 수행하거나, URL 변수(동적 경로)를 통해 요청에 따라 다른 데이터를 반환할 수도 있다. 예를 들어, URL에 사용자의 이름을 포함하여 환영 메시지를 출력하고 싶다면 다음과 같이 작성할 수 있다

@app.route('/hello/<name>')
def hello_user(name):
    return f'Hello, {name}!'

 

이처럼 Flask의 라우팅 기능은 유연하고 간단하게 다양한 경로를 처리할 수 있는 방법을 제공한다.

 

 

3. 기본 템플릿 엔진: Jinja2
Flask는 동적 HTML 페이지를 생성하기 위해 Jinja2 템플릿 엔진을 기본으로 제공한다. Jinja2는 템플릿 내에서 Python과 유사한 문법을 사용하여, 변수와 제어 구조(조건문, 반복문 등)를 통해 HTML을 동적으로 생성할 수 있다. 예를 들어, 여러 사용자를 목록으로 출력하고 싶다면 다음과 같이 템플릿을 사용할 수 있다

 

(app.py 파일)

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/users')
def users():
    user_list = ['Alice', 'Bob', 'Charlie']
    return render_template('users.html', users=user_list)

 

(templates/users.html 파일)

<h1>Users</h1>
<ul>
{% for user in users %}
    <li>{{ user }}</li>
{% endfor %}
</ul>

 

위 예시에서 render_template 함수는 users.html 파일을 렌더링하고, 해당 파일에서 Flask에서 전달된 데이터를 사용하여 동적으로 HTML을 생성한다. 템플릿 내에서 {{ user }}와 같은 구문을 사용하여 Python 변수를 HTML에 삽입할 수 있다.

 

 

4. 확장성

Flask는 기본 기능 외에도 다양한 확장 모듈을 통해 기능을 확장할 수 있다. 예를 들어, DB 연결을 위해 SQLAlchemy, 폼 처리를 위해 WTForms, 사용자 인증을 위해 Flask-Login 등의 확장을 사용할 수 있다. 이러한 확장 모듈을 통해 필요한 기능만 선택적으로 추가할 수 있다는 것이 Flask의 큰 장점이다.

 

[MySQL 연동 예시]

특히, MySQL과 같은 외부 데이터베이스와의 연동도 손쉽게 구현할 수 있다. Flask-SQLAlchemy와 함께 MySQL을 사용하려면 mysqlclient 또는 PyMySQL과 같은 MySQL 드라이버를 설치한 후, 다음과 같이 간단하게 설정할 수 있다:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/mydatabase'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)

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

 

위 코드는 MySQL 데이터베이스와 연동하는 간단한 예시이다. Flask-SQLAlchemy 확장은 MySQL뿐만 아니라 다른 DBMS와도 쉽게 통합될 수 있는 장점이 있다. ORM(Object Relational Mapping)을 통해 DB와의 상호작용을 객체 지향적으로 처리할 수 있으며, 이는 코드의 유지보수성을 높이고 개발 속도를 크게 향상시킨다.

 

 

5. 디버깅 및 개발 모드
Flask는 개발 중 디버깅을 용이하게 하기 위해 디버그 모드를 제공한다. 디버그 모드를 활성화하면, 코드 변경 시 서버가 자동으로 재시작되며, 오류가 발생할 경우 웹 브라우저 상에서 상세한 오류 메시지와 함께 디버그 정보를 확인할 수 있다. 이를 통해 개발자는 빠르게 문제를 파악하고 수정할 수 있다.

 

 

6. RESTful API 구축

Flask는 RESTful API를 구축하는 데에도 자주 사용된다. Flask의 라우팅 기능과 함께 요청 메서드(GET, POST, PUT, DELETE 등)를 지정하여 쉽게 API 엔드포인트를 구성할 수 있다. JSON이나 XML 데이터를 반환하거나, 파라미터를 처리하는 등, RESTful API 개발에 필수적인 기능들을 Flask에서 간단하게 구현할 수 있다.

 

[간단한 REST API 엔드포인트와 JSON 데이터 처리 예시]

아래의 코드는 /api/data 경로에 대한 GET 및 POST 요청을 처리하는 API를 정의한 것이다. jsonify 함수를 통해 데이터를 JSON 형식으로 반환하고, request.json을 사용하여 클라이언트가 전송한 데이터를 처리할 수 있다.

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/api/data', methods=['GET'])
def get_data():
    return jsonify({'data': 'sample data'})

@app.route('/api/data', methods=['POST'])
def post_data():
    new_data = request.json.get('data')
    return jsonify({'received': new_data}), 201
 
 
 
[간단한 REST API 엔드포인트와 XML 데이터 처리 예시]
아래의 코드는 /api/data 경로에 대한 GET 및 POST 요청을 처리하는 API를 정의한 것으로, XML 데이터를 반환하고 처리하는 방식을 보여준다. xml.etree.ElementTree 모듈을 사용해 XML 형식의 데이터를 생성하고, 이를 Response 객체로 반환한다. POST 요청에서는 XML 데이터를 받아 파싱하고, 그 데이터를 기반으로 새로운 XML 응답을 생성하여 반환한다.
from flask import Flask, request, Response
import xml.etree.ElementTree as ET

app = Flask(__name__)

@app.route('/api/data', methods=['GET'])
def get_data():
    root = ET.Element('response')
    data = ET.SubElement(root, 'data')
    data.text = 'sample data'
    xml_data = ET.tostring(root)
    return Response(xml_data, mimetype='application/xml')

@app.route('/api/data', methods=['POST'])
def post_data():
    xml_data = request.data
    tree = ET.ElementTree(ET.fromstring(xml_data))
    root = tree.getroot()
    received_data = root.find('data').text
    response = ET.Element('response')
    received = ET.SubElement(response, 'received')
    received.text = received_data
    response_xml = ET.tostring(response)
    return Response(response_xml, status=201, mimetype='application/xml')
 

 

 

 

(정리)

Flask는 가볍고 유연한 웹 프레임워크로, 빠르게 웹 애플리케이션을 구축할 수 있으며, 필요에 따라 다양한 기능을 확장할 수 있다. 간단한 코드로 라우팅, 템플릿 렌더링, DB 연동 등 다양한 작업을 처리할 수 있으며, 디버그 모드를 통해 개발 속도를 높일 수 있다. 이러한 장점 덕분에 Flask는 소규모 프로젝트나 프로토타이핑은 물론, 대규모 웹 애플리케이션 개발에도 적합한 프레임워크로 널리 사용되고 있다.

 

 

 

 

 

 

참고 및 출처: https://flask.palletsprojects.com/en/3.0.x/

'프레임워크 > Flask' 카테고리의 다른 글

Flask 기초 무료강의 추천  (5) 2024.10.08