Python으로 만들어보는 GET, POST API (Flask, MongoDB)

Eunhye Kim·2024년 8월 14일
2

저번에 블로그에 작성한 거 처럼 Next.js에서 API를 만들어서 사용을 하다보니, 다른 언어에서는 어떻게 다르게 작성되는지 궁금하기도 하고, 백엔드 언어로 API를 만들고 싶다는 생각이 들어 이번에 Python을 사용해서 API를 만들어보았다.

1. 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']): usersURL로 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을 사용해서 데이터를 가져오면 끝이다.

2. MongoDB 연결

  1. pymongo를 설치.

  2. MongoDB에서 connect 할 수 있는 code 가져오기. (Python MongoDB Tutorial 이분 영상 따라하면 충분히 쉽게 할 수 있다. 5년전 영상이지만 흐름은 똑같다.)

  3. 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

이렇게 바꿔주면 된다.

GET API

이제 그럼 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에 있는 데이터가 조회가 된다!

POST API

이제 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(생성됨)을 반환한다.
    예외 처리: 예외가 발생하면, 일반적인 오류 메시지를 포함하여 상태 코드 500(서버 오류)을 반환한다.

try-except는 Javascript에서 try-catch와 유사하다.

이제 프론트에서 http://localhost:5001/usersURL로 POST요청을 하면 MongoDB에 데이터가 추가 되는걸 볼 수 있을 것이다!

마무리

이렇게 Python을 사용해서 처음으로 API를 만들어보았다. 솔직히 처음에 Python실행을 해야하는데 환경에러가 나서 거의 그거 해결하느라 시간을 다 썼다(ㅋㅋㅋ).

어쨌든 만들어본 소감은 확실히 Next.js보다 코드를 덜 작성한다는 것이다.
Next.js에서 했을 때는 Schema도 작성을 해서 그런 것도 있었지만 Python이 DB연결하기도 편했다.

앞으로 API을 만들때는 Python을 사용해보려고 한다.

다른 글 보기

  1. Next.js 하나로 Full Stack 작업1 (get, post API 제작 / MongoDB)
  2. Next.js 하나로 Full Stack 작업2 (기존 GET API에서 페이지네이션 및 검색 기능 추가 / MongoDB)
profile
개발에 몰두하며 성장하는 도중에 얻은 인사이트에 희열을 느낍니다.

0개의 댓글