안녕하세요 ! GDGoC Team Member 민서연 입니다
다들 프로젝트는 잘 진행되고 계실까요 😃
저는 이번에 SucceSS 프로젝트에서 ai 파트를 맡게 되면서,
파이썬을 활용해 애플리케이션을 개발할 수 있는 기회가 생겼습니다.
하지만 개발에 활용되는 API 개념들이 헷갈려서
이번 윈터 블로그 챌린지를 통해 정리해보려고 합니다
그래서 저의 이번 블챌 주제는 [파이썬과 사용하는 RESTful API 와 Flask] 입니다 ✨
1. Flask
웹 애플리케이션 개발을 위한 Python 기반의 경량 프레임워크입니다.
많은 개발자들이 Flask를 선택하는 이유는 복잡한 설정 없이 단순하게 필요한 기능만 추가하여 웹 애플리케이션을 개발할 수 있기 때문입니다.
또한 다양한 플러그인을 통해 기능을 확장할 수 있어 개발자에게 높은 유연성을 제공합니다.
이러한 특성 덕분에 Flask는 RESTful API를 구현하는 데에 적합한 도구로 자주 사용됩니다.
2. RESTful API
먼저 REST는 Representational State Transfer의 약자로, 웹 서비스를 만들기 위한 설계 방식 중 하나입니다
쉽게 설명하면, 웹 서비스가 아키텍처적으로 작동하는 방식을 정의하는 개념입니다.
따라서,
Flask에서 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있는 것 입니다.
RESTful API 의 특징
- 서버-클라이언트 구조 (Server-Client)
- 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client
- 클라이언트와 서버 간의 상태를 전송하는 방식
- 리소스 (Resources)
- 웹에서 식별 가능하고 조작 가능한 모든 것 (URI가 있으면 된다)
- ex) 문서, 그림, 데이터, 해당 소프트웨어 자체 ..etc
- 표현 (Representation)
- 클라이언트가 서버로 요청을 보냈을 때 응답 자원의 상태
- 리소스의 상태는 JSON, XML, RSS 등 여러 형태로 표현됨
- ex) "사용자 (User)"라는 리소스를 JSON 형식의 표현
{ "id": 123, "username": "john_doe", "email": "john@example.com", "age": 30, "address": { "street": "123 Main St", "city": "Cityville", "zipCode": "12345" } }
- 무상태 (Stateless)
- HTTP의 특성상, 서버는 클라이언트의 이전 요청 상태를 저장하지 않음
- 각 요청이 독립적으로 처리됨
- 계층화 (Layered System)
- 아키텍처를 여러 계층으로 나누어 독립적으로 구성
- 서버의 여러 레이어와 상호작용 가능
- 캐시 처리 기능 (Cacheable)
- 응답이 캐시될 수 있도록 설계되어 있어야 함
간단한 RESTful API 요청 예시
| HTTP 메서드 | URI | 설명 |
| GET | /users | 모든 사용자의 목록을 가져옴 |
| GET | /users/123 | ID가 123인 사용자의 정보를 가져옴 |
| POST | /users | 새로운 사용자를 생성함 |
| PUT | /users/123 | ID가 123인 사용자의 정보를 업데이트함 |
| DELETE | /users/123 | ID가 123인 사용자를 삭제함 |
RESTful API 설계 규칙
- 명사 사용: URI에는 동사보다는 자원을 나타내는 명사를 사용
- /users (O)
- /getUsers, /createNewUser (X)
- 소문자 사용: URI 경로는 소문자로 작성해야 함
- URI의 마지막에 '/' 사용하지 않음
- 파일 확장자 포함하지 않음
3. REST API? RESTful API?
REST API와 RESTful API 의 차이는 다음과 같습니다!
| REST API: | 단순히 REST 아키텍처를 기반으로 처리하는 API |
| RESTful API: | REST의 원칙을 철저하게 준수하는 API |
따라서 모든 REST API가 "RESTful"한 것은 아니며,
REST의 설계 규칙을 잘 지켜서 설계된 API를 RESTful API라고 합니다.
(설계 규칙은 위에서 말한 "REST API의 설계 규칙"이 모두 포함된다)
4. Flask를 활용한 RESTful API 동작 예시
POST 방식으로 JSON 데이터와 함께 API 호출을 하고,
서버에서는 받은 JSON 데이터 확인 및 간단한 응답 데이터를 보내주는 동작을 예로 들어봅시다.
1. 서버 만들기
app_controller.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/test", methods=['POST'])
def test():
params = request.get_json()
print("받은 Json 데이터 ", params)
response = {
"message": "success",
"received_data": params
}
return jsonify(response)
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=8080)
URL 설정, 메서드 설정
@app.route() 내부에 첫 번째 항목은 URL을 설정하는 것이고,
두 번째 항목은 메서드 종류를 설정하는 것입니다.
요청 시 보낸 데이터 확인
request.get_json()을 사용하여 데이터를 확인할 수 있습니다.
또한 get()를 사용하여 key값에 해당하는 값을 확인할 수도 있습니다.
return
return값을 보내면 API 요청한 쪽에서 return 보낸 값을 응답받을 수 있습니다.
2. API 호출 (클라이언트 코드)
import requests
import json
# API URL
url = "http://127.0.0.1:8080/test"
# 요청 헤더
headers = {
"Content-Type": "application/json"
}
# 요청 데이터
data = json.dumps({
"장소": "cafe",
"카테고리": "food"
})
# POST 요청 보내기
response = requests.post(url, headers=headers, data=data)
# 응답 출력
print("response.status_code:", response.status_code)
print("response.text:", response.text)
서버에 맞춰 내용을 입력한 후 requests.post()로 요청합니다.
3. 테스트 결과
서버에 요청을 보내면 다음과 같은 응답을 받을 수 있습니다
{
"message": "success",
"received_data": {
"장소": "cafe",
"카테고리": "food"
}
}
Flask의 간편한 구조와 RESTful API의 원칙을 활용하면 효율적인 웹 서비스를 구축할 수 있습니다.
이제 Flask와 RESTful API에 대한 이해가 높아지셨길 바랍니다! 😊
읽어주셔서 감사합니다 🙇