Flask로 웹 개발: #16 API 구현
미니 쇼핑몰 프로젝트를 구축할 때, 제품 정보를 효율적으로 관리할 수 있도록 API에 대한 정의를 모두 마쳤습니다. 이번 포스팅에서는 Flask를 사용하여 쇼핑몰의 제품 정보를 관리하는 API를 CRUD (Create, Read, Update, Delete)에 맞게 단계별로 설명하겠습니다.
1. 데이터베이스 설정 및 모델 정의
저희 쇼핑몰의 제품 정보를 간단하게 살펴보겠습니다. 아래 코드처럼 제품명, 가격, 정보로 이루어진 단순한 구조입니다.
class Product(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)
description = db.Column(db.String(200), nullable=False)
2. Flask 애플리케이션 설정
Flask 애플리케이션에서 제품 정보를 생성하거나 갱신 또는 삭제, 조회하는 기능들을 구현해 보겠습니다. 구현은 앞서 구현과 비슷하지만 api/ 경로를 부여할 것이며 HTTP Method 즉, GET, POST 방식에 따라 다른 기능들을 하도록 구현합니다. 약간의 코드 설명도 추가하겠습니다.
제품 생성 (Create)
쇼핑몰에 없는 제품을 등록하는 기능입니다. /api/products 경로를 새로 추가하였고 POST 방식으로 동작합니다.
@app.route('/api/products', methods=['POST']) # 1)
def create_product():
data = request.get_json() # 2)
if not data or not 'name' in data:
abort(400)
new_product = Product( # 3)
name=data['name'],
price=data['price'],
description=data.get('description', ''),
)
db.session.add(new_product) # 4)
db.session.commit()
result = { 'code':1000, 'message': 'Product created successfully' }
return jsonify(result), 201 # 5)
위 코드에 대한 설명입니다.
- 1) @app.route 데코레이터는 /api/products URL 경로에 대해 POST 요청을 처리하도록 add_product 함수를 매핑합니다. 즉, 클라이언트가 /api/products 경로로 POST 요청을 보내면, 이 함수가 호출됩니다.
- 2) request.get_json() 함수는 요청 본문에서 JSON 데이터를 파싱하여 Python 딕셔너리로 변환합니다.
- 3) JSON 데이터에서 각 필드를 추출하여 제품 객체의 속성에 할당합니다.
- 4) db.session.add(new_product) 라인은 새로 생성한 new_product 객체를 데이터베이스 세션에 추가합니다. db.session.commit() 라인은 세션에 추가된 변경 사항을 데이터베이스에 커밋합니다. 이 단계에서 새로운 제품이 실제로 데이터베이스에 저장됩니다.
- 5) jsonify 함수는 Python 딕셔너리를 JSON 응답으로 변환합니다. { 'code':1000, 'message': 'Product created successfully' } 처럼 사용자가 정의한 메시지를 포함한 JSON 응답을 반환합니다. 상태 코드 201은 요청이 성공적으로 처리되어 새로운 리소스가 생성되었음을 나타냅니다.
제품 조회 (Read)
제품 조회는 전체 상품을 조회하는 기능과 단일 상품을 조회하는 기능으로 나누어집니다.
@app.route('/api/products', methods=['GET'])
def get_products():
products = Product.query.all()
result = [
{'id': product.id, 'name': product.name, 'price': product.price, 'description': product.description}
for product in products
]
return jsonify(result), 200
@app.route('/api/products/<int:product_id>', methods=['GET'])
def get_product(product_id):
product = Product.query.get_or_404(product_id)
result = {'id': product.id, 'name': product.name, 'price': product.price, 'description': product.description}
return jsonify(result), 200
제품 업데이트 (Update)
제품의 정보를 변경하고자 할 경우가 있습니다. 예를 들어 가격이 변했다거나 정보 누락이 있어 추가하여아 한다는 경우입니다. 이럴 때 업데이트 기능을 이용하여 제품 정보를 업데이트 합니다.
@app.route('/api/products/<int:product_id>', methods=['PUT'])
def update_product(product_id):
data = request.get_json()
product = Product.query.get_or_404(product_id)
product.name = data.get('name', product.name)
product.price = data.get('price', product.price)
product.description = data.get('description', product.description)
db.session.commit()
result = { 'code':1000, 'message': 'Product udpated successfully' }
return jsonify(result), 200
제품 삭제 (Delete)
오래된 제품이거나 더 이상 팔지 않는 제품은 삭제해야 합니다. 삭제 API를 이용하여 제품을 삭제하는 기능을 구현하여 봅니다.
@app.route('/api/products/<int:product_id>', methods=['DELETE'])
def delete_product(product_id):
product = Product.query.get_or_404(product_id)
db.session.delete(product)
db.session.commit()
return '', 204
3. API 테스트
API가 제대로 동작하는지 확인하기 위해 Postman이나 cURL을 사용하여 테스트합니다. 여기서는 CMD에서 cURL 명령어를 이용해 동작확인을 해보겠습니다.
Flask 구동
우선 flask 애플리케이션을 구동합니다.
python app.py
1. 제품 생성 (Create)
제품 생성에 대한 API를 테스트합니다. Laptop 제품을 추가하였습니다. 여러분은 여러분의 제품을 추가해보셔도 좋습니다. 명령어를 2개를 드렸는데요. 위의 명령어가 동작한다면 좋겠지만 동작하지 않는다면 아래 명령어를 수행해보세요.
curl -X POST http://127.0.0.1:5000/api/products -H "Content-Type: application/json" -d '{"name":"Laptop","description":"Gaming laptop","price":999.99}'
curl -X POST http://192.168.10.126:5000/api/products -H "Content-Type: application/json" -d "{\"name\":\"Laptop\",\"price\":999.99,\"description\":\"Gaming laptop\"}"
2. 제품 목록 조회 (Read)
전체 제품을 조회하는 테스트입니다.
curl http://127.0.0.1:5000/api/products
3. 특정 제품 조회 (Read)
특정 ID의 제품을 조회하는 테스트입니다. DB에 저장할 때 각 제품마다 ID가 부여되는거 알고 계시죠? ㅎㅎㅎ
curl http://127.0.0.1:5000/api/products/${id}
curl http://127.0.0.1:5000/api/products/1
4. 제품 업데이트 (Update)
특정 제품을 업데이트하는 테스트입니다. 여기서는 ID 1번에 해당하는 제품의 가격을 변경하였지만 여러분은 여러분이 추가하신 제품의 가격을 변경해보세요.
curl -X PUT http://127.0.0.1:5000/api/products/1 -H "Content-Type: application/json" -d '{"price":899.99}'
curl -X PUT http://127.0.0.1:5000/api/products/1 -H "Content-Type: application/json" -d "{\"price\":899.99}"
5. 제품 삭제 (Delete)
필요 없어진 제품을 삭제하는 기능입니다. ID에 따라서 삭제가 되므로 ID를 입력하실때 주의하시기 바랍니다.
curl -X DELETE http://127.0.0.1:5000/api/products/${id}
curl -X DELETE http://127.0.0.1:5000/api/products/1
결론
이번 포스팅에서는 Flask를 사용하여 미니 쇼핑몰 프로젝트에서 제품 정보를 관리할 수 있는 CRUD API를 구현하는 방법을 살펴보았습니다. Flask와 SQLAlchemy를 이용하여 간단하고 효율적으로 데이터베이스와 상호작용하는 API를 구축할 수 있었습니다. 이 API를 기반으로 더 복잡한 기능을 추가하여 쇼핑몰 프로젝트를 확장할 수 있습니다.
여기서 배운 개념들을 바탕으로 여러분의 프로젝트에 맞게 응용해보세요. API를 가지고 논다는 느낌으로 여러 제품을 추가하여 볼 수도 있고 추가한 제품의 정보들을 다양하게 변경해볼 수도 있습니다. 이를 통해 flask와 파이썬 그리고 더 나아가 프로그래밍에 한 발 더 가까워진다는 느낌을 받으셨으면 좋겠습니다.
도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.
감사합니다!