Flask

Chapter 2-3 Flask-RESTful API

Chansman 2025. 4. 18. 10:30

📌 Flask-RESTful API 활용하여 REST API 생성 - 상세 가이드

1. flask-restful api 설치

Flask-RESTful은 Flask의 확장 모듈로, Flask 애플리케이션에서 RESTful API를 빠르게 구축할 수 있게 해줍니다. 이를 설치하려면 pip를 사용하여 설치합니다.

설치 명령어

> pip install flask-restful

이후 Flask 애플리케이션에서 Api와 Resource 클래스를 사용하여 RESTful API를 쉽게 만들 수 있습니다.


2. Library Import

Flask 애플리케이션을 설정하고 API를 추가하려면 Flask와 함께 flask-restful의 Api와 Resource 클래스를 가져와야 합니다.

필요한 라이브러리

from flask import Flask
from flask_restful import Api, Resource
  • Flask: 웹 애플리케이션을 구동하는 기본 라이브러리입니다.
  • Api: Flask 애플리케이션에 RESTful API를 추가하는 클래스입니다.
  • Resource: 각 리소스(API 엔드포인트)를 구현할 때 사용되는 클래스입니다.

3. Flask-RESTful API를 활용하여 API 구축

Flask-RESTful을 사용하여 간단한 아이템 관리 API를 구축할 수 있습니다. 이 API는 아이템을 조회, 추가, 업데이트, 삭제할 수 있는 기능을 제공합니다.

API 구성 흐름

  1. GET: 특정 아이템을 조회합니다.
  2. POST: 새로운 아이템을 추가합니다.
  3. PUT: 기존 아이템의 정보를 업데이트합니다.
  4. DELETE: 아이템을 삭제합니다.

app.py - Flask 애플리케이션 설정

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

items = []  # 간단한 데이터베이스 역할을 하는 리스트

class Item(Resource):
    # 특정 아이템 조회
    def get(self, name):
        for item in items:
            if item['name'] == name:
                return item
        return {'message': 'Item not found'}, 404

    # 새 아이템 추가
    def post(self, name):
        for item in items:
            if item['name'] == name:
                return {'message': f"An item with name '{name}' already exists."}, 400

        data = request.get_json()  # 클라이언트로부터 받은 JSON 데이터
        item = {'name': name, 'price': data['price']}
        items.append(item)
        return item, 201
    
    # 아이템 업데이트
    def put(self, name):
        data = request.get_json()
        for item in items:
            if item['name'] == name:
                item['price'] = data['price']
                return item

        # 아이템이 존재하지 않으면 새로운 아이템을 추가
        new_item = {'name': name, 'price': data['price']}
        items.append(new_item)
        return new_item
    
    # 아이템 삭제
    def delete(self, name):
        global items
        items = [item for item in items if item['name'] != name]
        return {'message': 'Item deleted'}

api.add_resource(Item, '/item/<string:name>')  # 경로 추가

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

코드 흐름 설명

  1. Item 클래스는 각 HTTP 메소드(GET, POST, PUT, DELETE)를 정의하는 클래스입니다.
  2. get(self, name): name 파라미터를 통해 특정 아이템을 조회합니다. 만약 해당 아이템이 없다면 404 상태 코드를 반환합니다.
  3. post(self, name): 새로운 아이템을 추가합니다. 기존 아이템이 있다면 중복 메시지를 반환하고, 없으면 새 아이템을 리스트에 추가합니다.
  4. put(self, name): 아이템을 수정합니다. 존재하지 않으면 새 아이템을 추가합니다.
  5. delete(self, name): 지정된 name의 아이템을 삭제합니다.

4. Flask-RESTful API 장/단점

장점

  1. 간단한 RESTful API 개발:
    • Flask-RESTful은 간단한 코드로 RESTful API를 구현할 수 있습니다. 기본적으로 리소스(Resource) 개념을 사용하여 API를 구현할 수 있어 빠른 개발이 가능합니다.
  2. 직관적인 코드:
    • Resource 클래스를 사용해 각 API 엔드포인트를 정의하는 방식은 직관적이고 이해하기 쉽습니다.
    • 각 메소드(GET, POST, PUT, DELETE)를 클래스 내에서 처리할 수 있어 가독성이 좋습니다.
  3. 낮은 러닝 커브:
    • Flask는 작고 간단한 웹 프레임워크로 학습하기 쉬운 특성을 가지고 있으며, Flask-RESTful 또한 이를 기반으로 추가된 기능이므로 학습이 쉽습니다.

단점

  1. 자동 문서화 도구의 부족:
    • SwaggerOpenAPI 같은 API 문서화 도구를 기본적으로 제공하지 않아서, 개발자가 자동으로 API 문서를 생성하거나 구성해야 합니다. 이를 위해 별도의 설정이 필요합니다.
  2. 성능:
    • Flask 자체가 경량 웹 프레임워크이기 때문에, 대규모 애플리케이션에서는 성능상 한계가 있을 수 있습니다.
    • 대규모 서비스에는 Django REST Framework 같은 더 강력한 대체 프레임워크가 필요할 수 있습니다.

5. 기능별 코드 분리 (모듈화)

app.py - Flask 애플리케이션 설정

from flask import Flask
from flask_restful import Api
from resources.item import Item

app = Flask(__name__)
api = Api(app)

api.add_resource(Item, '/item/<string:name>')

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

resources/item.py - 아이템 리소스 클래스

from flask_restful import Resource, request

items = []  # 간단한 데이터베이스 역할을 하는 리스트

class Item(Resource):
    # 특정 아이템 조회
    def get(self, name):
        for item in items:
            if item['name'] == name:
                return item
        return {'message': 'Item not found'}, 404

    # 새 아이템 추가
    def post(self, name):
        for item in items:
            if item['name'] == name:
                return {'message': f"An item with name '{name}' already exists."}, 400

        data = request.get_json()
        item = {'name': name, 'price': data['price']}
        items.append(item)
        return item, 201
    
    # 아이템 업데이트
    def put(self, name):
        data = request.get_json()
        for item in items:
            if item['name'] == name:
                item['price'] = data['price']
                return item

        # 아이템이 존재하지 않으면 새로운 아이템을 추가
        new_item = {'name': name, 'price': data['price']}
        items.append(new_item)
        return new_item
    
    # 아이템 삭제
    def delete(self, name):
        global items
        items = [item for item in items if item['name'] != name]
        return {'message': 'Item deleted'}

6. API 테스트와 사용 방법

API 테스트를 위해 Postman을 사용할 수 있습니다. Postman은 API를 호출하고 응답을 쉽게 테스트할 수 있는 도구입니다.

  1. 아이템 조회: GET /item/<name> → 특정 아이템 조회
  2. 아이템 추가: POST /item/<name> → 새 아이템 추가
    • 요청 본문: { "price": 20 }
  3. 아이템 업데이트: PUT /item/<name> → 기존 아이템 가격 수정
    • 요청 본문: { "price": 30 }
  4. 아이템 삭제: DELETE /item/<name> → 아이템 삭제

Postman을 사용하여 테스트

  1. GET 요청: /item/item_name
  2. POST 요청: /item/item_name (body에 JSON 데이터 추가)
  3. PUT 요청: /item/item_name (body에 업데이트된 JSON 데이터 추가)
  4. DELETE 요청: /item/item_name