저번에 블로그에 작성한 거 처럼 Next.js에서 API를 만들어서 사용을 하다보니, 다른 언어에서는 어떻게 다르게 작성되는지 궁금하기도 하고, 백엔드 언어로 API를 만들고 싶다는 생각이 들어 이번에 Python을 사용해서 API를 만들어보았다.
먼저 MongoDB와 연결을 하기 전에 목데이터를 사용해서 테스트를 진행했다.
from flask import Flask, request, jsonify
from flask_cors import CORS
app = Flask(__name__)
# CORS 설정
CORS(app)
# GET 요청
@app.route('/users', methods=['GET'])
def get_posts():
user_data = {
"name": 'kim',
"phone":'010-0000-0000',
"url":'',
"img":'',
"privacy": True
}
return jsonify(user_data), 200
# 서버 실행
if __name__ == '__main__':
app.run(debug=True, port=5001)
1. Flask 및 CORS 설정
Flask
:Python에서 웹 애플리케이션을 만들기 위한 마이크로 프레임워크이다. 특별한 도구나 라이브러리가 필요 없기 때문에 마이크로 프레임워크라 부른다.CORS(app)
: CORS를 설정하여, 다른 도메인에서 이 서버의 API를 호출할 수 있도록 허용해준다.2. /users 엔드포인트
@app.route('/users', methods=['GET'])
: users
URL로 GET요청이 들어올 때 실행되는 함수user_data
: 기본적으로 반환할 사용자 데이트return jsonify(user_data), 200
: user_data
를 JSON형식으로 반환하며, HTTP 상태 코드는 200으로 설정3. 서버 실행
if __name__ == '__main__'
: 이 스크립트가 메인 프로그램으로 실행될 때 Flask 애플리케이션을 실행한다.app.run(debug=True, port=5001)
: 서버를 디버그 모드로 5001번 포트에서 실행한다.이 코드를 Python으로 실행을하고 http://localhost:5001/users
로 들어가면 화면에 데이터가 뜰 것이다.
user_data = {
"name": 'kim',
"phone":'010-0000-0000',
"url":'',
"img":'',
"privacy": True
}
그럼 GET API는 문제없이 동작이 되는 거고 프론트에서 http://localhost:5001/users
URL을 사용해서 데이터를 가져오면 끝이다.
pymongo
를 설치.
MongoDB에서 connect 할 수 있는 code 가져오기. (Python MongoDB Tutorial 이분 영상 따라하면 충분히 쉽게 할 수 있다. 5년전 영상이지만 흐름은 똑같다.)
MongoDB에서 나중에 GET할 데이터를 넣기
import pymongo
from pymongo import MongoClient
from bson import json_util
import json
# MongoDB 연결
# MongoDB에서 connect 할 수 있는 code
client = MongoClient("mongodb+srv://test:<password>@test.tesw9mc.mongodb.net/?retryWrites=true&w=majority&appName=test")
db = client.test
collection = db.test
MongoClient
: MongoDB데이터베이스에 연결을 설정한다.db = client.test
: test
라는 데이터베이스를 선택collection = db.test
: test
데이터베이스 내의 test
컬렉션을 선택사진에서 보이는
- test
| test
이 부분을 가져오는 것을 명령하고 있다. 만약에 데이터베이스를 다른 이름으로 한 경우
예)
- db_test
| collection_test
db = client.db_test
collection = db.collection_test
이렇게 바꿔주면 된다.
이제 그럼 MongoDB에 만들었던 데이터를 가져올 차례다.
@app.route('/users', methods=['GET'])
def get_posts():
# MongoDB에서 모든 문서 찾기
result = collection.find()
# 결과를 리스트로 변환 후 JSON 응답으로 변환
users = list(result)
users = json.loads(json_util.dumps(users))
print("users", users)
return jsonify(users), 200
@app.route('/users', methods=['GET'])
: /users 경로를 정의하며, 이 경로는 GET 요청에만 응답한다.result = collection.find()
: MongoDB의 "test" 컬렉션에서 모든 문서를 조회한다.list(result)
: 조회된 결과(커서 객체)를 리스트로 변환한다.json.loads(json_util.dumps(users))
: BSON 객체(예: MongoDB의 ObjectId)를 JSON 형식으로 변환한다.return jsonify(users), 200
: 사용자 목록을 JSON 응답으로 반환하며, HTTP 상태 코드 200(성공)을 함께 반환한다.이제 프론트에서 처음 테스트한 것 처럼 http://localhost:5001/users
에서 GET요청을 하면 MongoDB에 있는 데이터가 조회가 된다!
이제 GET API를 만들었으니, 데이터를 추가할 수 있는 POST API를 만들어보자!
@app.route('/users', methods=['POST'])
def create_user():
try:
# 클라가 요청한 JSON 데이터 가져오기
user_data = request.json
# MongoDB에 새 문서 삽입
result = collection.insert_one(user_data)
# 삽입된 문서의 ID를 포함하여 응답 생성
response = {
'status': 'success',
'message': 'User created successfully',
'user_id': str(result.inserted_id)
}
return jsonify(response), 201
except Exception as e:
print("Error creating user:", e)
response = {
'status': 'error',
'message': 'Failed to create user'
}
return jsonify(response), 500
@app.route('/users', methods=['POST'])
: /users 경로를 정의하며, 이 경로는 POST 요청에만 응답한다.request.json
: POST 요청으로 들어온 JSON 데이터를 가져온다.collection.insert_one(user_data)
: 새로운 사용자 데이터를 MongoDB 컬렉션에 삽입한다.str(result.inserted_id)
: 삽입된 문서의 고유 ID(ObjectId)를 문자열로 변환한다 (ObjectId는 JSON으로 바로 변환할 수 없기 때문).jsonify(response), 201
: 삽입된 사용자 ID와 함께 상태 코드 201(생성됨)을 반환한다.
try-except
는 Javascript에서try-catch
와 유사하다.
이제 프론트에서 http://localhost:5001/users
URL로 POST요청을 하면 MongoDB에 데이터가 추가 되는걸 볼 수 있을 것이다!
이렇게 Python을 사용해서 처음으로 API를 만들어보았다. 솔직히 처음에 Python실행을 해야하는데 환경에러가 나서 거의 그거 해결하느라 시간을 다 썼다(ㅋㅋㅋ).
어쨌든 만들어본 소감은 확실히 Next.js보다 코드를 덜 작성한다는 것이다.
Next.js에서 했을 때는 Schema도 작성을 해서 그런 것도 있었지만 Python이 DB연결하기도 편했다.
앞으로 API을 만들때는 Python을 사용해보려고 한다.