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 구성 흐름
- GET: 특정 아이템을 조회합니다.
- POST: 새로운 아이템을 추가합니다.
- PUT: 기존 아이템의 정보를 업데이트합니다.
- 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)
코드 흐름 설명
- Item 클래스는 각 HTTP 메소드(GET, POST, PUT, DELETE)를 정의하는 클래스입니다.
- get(self, name): name 파라미터를 통해 특정 아이템을 조회합니다. 만약 해당 아이템이 없다면 404 상태 코드를 반환합니다.
- post(self, name): 새로운 아이템을 추가합니다. 기존 아이템이 있다면 중복 메시지를 반환하고, 없으면 새 아이템을 리스트에 추가합니다.
- put(self, name): 아이템을 수정합니다. 존재하지 않으면 새 아이템을 추가합니다.
- delete(self, name): 지정된 name의 아이템을 삭제합니다.
4. Flask-RESTful API 장/단점
장점
- 간단한 RESTful API 개발:
- Flask-RESTful은 간단한 코드로 RESTful API를 구현할 수 있습니다. 기본적으로 리소스(Resource) 개념을 사용하여 API를 구현할 수 있어 빠른 개발이 가능합니다.
- 직관적인 코드:
- Resource 클래스를 사용해 각 API 엔드포인트를 정의하는 방식은 직관적이고 이해하기 쉽습니다.
- 각 메소드(GET, POST, PUT, DELETE)를 클래스 내에서 처리할 수 있어 가독성이 좋습니다.
- 낮은 러닝 커브:
- Flask는 작고 간단한 웹 프레임워크로 학습하기 쉬운 특성을 가지고 있으며, Flask-RESTful 또한 이를 기반으로 추가된 기능이므로 학습이 쉽습니다.
단점
- 자동 문서화 도구의 부족:
- Swagger나 OpenAPI 같은 API 문서화 도구를 기본적으로 제공하지 않아서, 개발자가 자동으로 API 문서를 생성하거나 구성해야 합니다. 이를 위해 별도의 설정이 필요합니다.
- 성능:
- 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를 호출하고 응답을 쉽게 테스트할 수 있는 도구입니다.
- 아이템 조회: GET /item/<name> → 특정 아이템 조회
- 아이템 추가: POST /item/<name> → 새 아이템 추가
- 요청 본문: { "price": 20 }
- 아이템 업데이트: PUT /item/<name> → 기존 아이템 가격 수정
- 요청 본문: { "price": 30 }
- 아이템 삭제: DELETE /item/<name> → 아이템 삭제
Postman을 사용하여 테스트
- GET 요청: /item/item_name
- POST 요청: /item/item_name (body에 JSON 데이터 추가)
- PUT 요청: /item/item_name (body에 업데이트된 JSON 데이터 추가)
- DELETE 요청: /item/item_name