안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask를 사용한 REST API 설계 및 구현에 대해 알아보겠습니다. REST API는 클라이언트와 서버 간의 통신을 간편하게 할 수 있도록 설계된 아키텍처로, 다양한 애플리케이션에서 데이터를 주고받는 표준으로 사용됩니다.
1. REST API란?
REST(Representational State Transfer)는 웹 기반 아키텍처 스타일로, 클라이언트와 서버 간에 HTTP를 통해 자원을 주고받는 방식을 정의합니다. REST API는 HTTP 메서드를 사용하여 자원을 처리합니다.
· GET: 데이터 조회
· POST: 데이터 생성
· PUT: 데이터 업데이트
· DELETE: 데이터 삭제
2. Flask에서 REST API 구축하기
Flask는 가벼운 웹 프레임워크로서, REST API를 쉽게 설계하고 구현할 수 있습니다. 예제로 간단한 CRUD API(생성, 조회, 업데이트, 삭제)를 만들어보겠습니다.
2-1. 프로젝트 구조
my_api_project/
│
├── app.py # Flask 애플리케이션
├── models.py # 데이터베이스 모델 정의
└── requirements.txt # 필요한 라이브러리
2-2. Flask와 SQLAlchemy 설정
우선 Flask와 SQLAlchemy를 사용하여 데이터베이스를 구성합니다. SQLite를 사용할 예정입니다.
pip install flask flask-sqlalchemy
# app.py
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
db = SQLAlchemy(app)
# 데이터베이스 모델 정의
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
price = db.Column(db.Float, nullable=False)
def __repr__(self):
return f'<Item {self.name}>'
# 데이터베이스 초기화
@app.before_first_request
def create_tables():
db.create_all()
2-3. API 엔드포인트 정의
이제 REST API의 기본적인 CRUD 엔드포인트를 만들어 보겠습니다.
1) 데이터 조회 (GET)
모든 데이터를 조회하거나 특정 데이터를 조회하는 GET 요청을 처리합니다.
# 모든 아이템 조회
@app.route('/items', methods=['GET'])
def get_items():
items = Item.query.all()
return jsonify([{'id': item.id, 'name': item.name, 'price': item.price} for item in items])
# 특정 아이템 조회
@app.route('/items/<int:id>', methods=['GET'])
def get_item(id):
item = Item.query.get_or_404(id)
return jsonify({'id': item.id, 'name': item.name, 'price': item.price})
2) 데이터 생성 (POST)
새로운 데이터를 생성하는 POST 요청을 처리합니다.
# 아이템 생성
@app.route('/items', methods=['POST'])
def create_item():
data = request.get_json()
new_item = Item(name=data['name'], price=data['price'])
db.session.add(new_item)
db.session.commit()
return jsonify({'message': '아이템이 생성되었습니다.'}), 201
3) 데이터 업데이트 (PUT)
기존 데이터를 수정하는 PUT 요청을 처리합니다.
# 아이템 수정
@app.route('/items/<int:id>', methods=['PUT'])
def update_item(id):
data = request.get_json()
item = Item.query.get_or_404(id)
item.name = data['name']
item.price = data['price']
db.session.commit()
return jsonify({'message': '아이템이 수정되었습니다.'})
4) 데이터 삭제 (DELETE)
특정 데이터를 삭제하는 DELETE 요청을 처리합니다.
# 아이템 삭제
@app.route('/items/<int:id>', methods=['DELETE'])
def delete_item(id):
item = Item.query.get_or_404(id)
db.session.delete(item)
db.session.commit()
return jsonify({'message': '아이템이 삭제되었습니다.'})
3. API 테스트하기
API를 테스트하기 위해 Postman과 같은 도구를 사용하여 GET, POST, PUT, DELETE 요청을 서버에 보낼 수 있습니다. 또는 curl 명령어로도 API 테스트가 가능합니다.
# 아이템 조회 (GET)
curl http://127.0.0.1:5000/items
# 아이템 생성 (POST)
curl -X POST -H "Content-Type: application/json" -d '{"name": "새 아이템", "price": 19.99}' http://127.0.0.1:5000/items
# 아이템 수정 (PUT)
curl -X PUT -H "Content-Type: application/json" -d '{"name": "업데이트된 아이템", "price": 25.99}' http://127.0.0.1:5000/items/1
# 아이템 삭제 (DELETE)
curl -X DELETE http://127.0.0.1:5000/items/1
4. REST API 설계 모범 사례
· 자원의 경로 설계: 각 자원에 대해 명확한 경로를 설계합니다. 예를 들어, /items는 모든 아이템을 나타내고, /items/1은 특정 아이템을 나타냅니다.
· HTTP 상태 코드: 성공적 요청에는 200 OK, 생성된 리소스에는 201 Created, 존재하지 않는 리소스 요청에는 404 Not Found 등의 적절한 HTTP 상태 코드를 반환합니다.
· JSON 형식의 응답: API의 응답은 대부분 JSON 형식을 사용합니다. 클라이언트와 서버 간의 데이터 전송을 효율적으로 처리하기 위해 표준화된 형식을 사용합니다.
5. Flask REST API 확장
· Flask-RESTful: Flask 애플리케이션에서 REST API를 더 쉽게 구축할 수 있도록 도와주는 라이브러리입니다. 복잡한 API 설계가 필요할 경우, 이 라이브러리를 고려할 수 있습니다.
· JWT 인증: 보호된 API를 설계할 때 JWT(Json Web Token) 인증을 사용하여 사용자 인증 및 권한 관리를 구현할 수 있습니다.
다음 시간에는 Flask에서 JWT를 사용한 인증 시스템을 구축하는 방법에 대해 알아보겠습니다!
- 이전 수업 목록
'프로그래밍 > Python' 카테고리의 다른 글
[Python 강의] 26강 - Flask 애플리케이션에 대한 최적화 기법 (0) | 2024.11.04 |
---|---|
[Python 강의] 25강 - Flask에서 JWT를 사용한 인증 시스템 (0) | 2024.11.01 |
[Python 강의] 23강 - Flask 웹소켓(WebSockets) (1) | 2024.10.30 |
[Python 강의] 22강 - Flask 애플리케이션 배포 (0) | 2024.10.29 |
[Python 강의] 21강 - 사용자 인증 및 권한 부여 (0) | 2024.10.28 |