본문 바로가기

PROGRAMMING

플라스크(Flask) - 개념과 사용 방법 및 예제 코드

반응형

Flask는 Python 기반의 마이크로 웹 프레임워크로, 최소한의 코드로 강력한 웹 애플리케이션을 개발할 수 있도록 설계되었습니다. 2010년 Armin Ronacher에 의해 개발된 Flask는 단순함과 확장성을 동시에 제공하여 초보 개발자부터 숙련된 프로그래머까지 폭넓게 사용되고 있습니다. 이번 포스트에서는 Flask의 특징, 핵심 기능, 사용법 및 실용적인 예제까지 자세히 살펴보겠습니다.

flask
Flask - 출처 : OpenAI

1. Flask의 특징

Flask는 '마이크로 프레임워크'라고 불리지만, 이는 기능이 부족하다는 의미가 아닙니다. Flask는 핵심적인 기능만을 제공하고, 필요에 따라 확장할 수 있도록 설계된 프레임워크입니다. 주요 특징은 다음과 같습니다.

  • 경량성: 기본적으로 최소한의 기능만 포함되어 있어 빠르게 웹 애플리케이션을 개발할 수 있습니다.
  • 확장성: 다양한 확장(Extensions) 라이브러리를 통해 데이터베이스, 인증, 폼 처리 등 필요한 기능을 추가할 수 있습니다.
  • 유연성: 개발자가 원하는 방식으로 애플리케이션을 구성할 수 있어 구조적인 제약이 적습니다.
  • Jinja2 템플릿 엔진: HTML 페이지를 동적으로 생성할 수 있도록 지원합니다.
  • Werkzeug WSGI 라이브러리 사용: WSGI(Web Server Gateway Interface)를 통해 웹 서버와의 상호작용을 돕습니다.
  • RESTful API 지원: 간단한 API부터 복잡한 RESTful 서비스를 개발하는 데 적합합니다.
 

2. Flask의 핵심 기능

Flask는 웹 개발에 필요한 기본적인 기능을 제공합니다.

2.1 라우팅 (Routing)

웹 애플리케이션에서 특정 URL을 특정 함수에 매핑하는 기능을 제공합니다.

from flask import Flask
app = Flask(__name__)

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

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

위 코드에서 @app.route('/')는 루트 경로('/')에 접속했을 때 home() 함수를 실행하도록 지정합니다.

 

2.2 요청과 응답 (Request & Response)

사용자의 요청을 처리하고, 적절한 응답을 반환할 수 있습니다.

from flask import request

@app.route('/greet', methods=['GET'])
def greet():
    name = request.args.get('name', 'Guest')
    return f'Hello, {name}!'

위 예제에서는 GET 요청을 받아 URL 파라미터(name)를 추출한 후 응답을 생성합니다.

 

2.3 템플릿 렌더링

Flask는 Jinja2 템플릿 엔진을 사용하여 HTML을 동적으로 생성할 수 있습니다.

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html', name=name)

 

👓 템플릿(hello.html):

<!DOCTYPE html>
<html>
<head><title>Flask Example</title></head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

템플릿을 사용하면 재사용성과 유지보수성이 증가합니다.

 

2.4 데이터베이스 연동

Flask는 SQLAlchemy 같은 ORM(Object Relational Mapping) 라이브러리를 통해 데이터베이스와 쉽게 연동할 수 있습니다.

from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
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)

    def __repr__(self):
        return f'<User {self.username}>'

3. Flask 애플리케이션 구조

Flask 프로젝트는 간단한 구조에서부터 대규모 애플리케이션까지 다양한 형태로 설계할 수 있습니다. 일반적으로 다음과 같은 디렉토리 구조를 따릅니다.

/my_flask_app
    ├── app.py  # 애플리케이션 엔트리 포인트
    ├── static/  # CSS, JS, 이미지 파일 등 정적 파일 보관
    ├── templates/  # HTML 템플릿 파일
    ├── models.py  # 데이터베이스 모델 정의
    ├── forms.py  # 폼 처리 (Flask-WTF 사용 가능)
    ├── config.py  # 설정 파일
    ├── requirements.txt  # 필요한 패키지 목록
    └── venv/  # 가상 환경 (선택사항)
 

4. 확장 기능

Flask는 다양한 확장 기능을 통해 보다 강력한 웹 애플리케이션을 개발할 수 있습니다.

  • Flask-SQLAlchemy: ORM을 통한 데이터베이스 연동
  • Flask-WTF: 폼 유효성 검사 및 CSRF 보호
  • Flask-Login: 사용자 인증 및 세션 관리
  • Flask-Mail: 이메일 전송 기능
  • Flask-RESTful: REST API 개발을 위한 도구
  • Flask-Migrate: 데이터베이스 마이그레이션 지원

 

5. 실용적인 예제: RESTful API 개발

Flask는 RESTful API를 개발하는 데 적합합니다. 간단한 API 예제를 살펴보겠습니다.

from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/api/data', methods=['GET'])
def get_data():
    sample_data = {'name': 'Flask', 'type': 'Framework'}
    return jsonify(sample_data)

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

위 코드에서처럼 jsonify()를 사용하여 JSON 응답을 반환하는 간단한 API를 생성할 수 있습니다.

 
반응형