
REST API와 RESTful API의 차이점
- REST API는 REST 아키텍처 원칙을 따르는 API를 의미합니다.
- RESTful API는 REST 원칙을 엄격하게 준수하는 API를 지칭하며, 상태를 저장하지 않고(GET, POST, PUT, DELETE 등의 메소드 사용), 리소스에 대한 요청을 처리합니다.
/users와 같이 명사를 사용해야 합니다.GET /usersPOST /usersPUT /users/{id}DELETE /users/{id}200 OK: 요청 성공201 Created: 새로운 리소스 생성 성공400 Bad Request: 잘못된 요청404 Not Found: 리소스를 찾을 수 없음500 Internal Server Error: 서버 내부 오류/api/v1/users는 API 버전 1의 사용자 리소스를 나타냅니다./users는 사용자의 집합을, /users/{id}는 특정 사용자를 지칭합니다.200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error 등이 흔히 사용됩니다.from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/users")
async def read_users():
return [{"username": "user1"}, {"username": "user2"}]
@app.post("/users")
async def create_user(user: User):
# 사용자 생성 로직
return {"username": "new_user"}
@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
# 사용자 업데이트 로직
return {"username": "updated_user"}
@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
# 사용자 삭제 로직
return {"message": "User deleted"}
@app.get("/users/{user_id}")
async def read_user(user_id: int):
if user_id not in users_database:
raise HTTPException(status_code=404, detail="User not found")
return {"username": "user1"}
/users는 사용자의 집합을, /users/{id}는 특정 사용자를 지칭합니다.200 OK, 201 Created, 404 Not Found./api/v1/users.아래는 사용자 관리를 위한 RESTful API의 기본 CRUD 연산을 구현한 예제입니다.
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from typing import List, Dict
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
id: int
name: str
email: str
users: Dict[int, User] = {}
# 사용자 인증을 위한 간단한 예시 함수
def get_current_user(token: str = Depends(oauth2_scheme)):
# 여기서는 단순화를 위해 토큰 검증을 생략합니다.
# 실제 애플리케이션에서는 여기서 토큰을 검증하고 사용자를 식별하는 로직이 필요합니다.
return {"user_id": token}
@app.post("/api/v1/users/", response_model=User)
def create_user(user: User):
if user.id in users:
raise HTTPException(status_code=400, detail="User already exists")
users[user.id] = user
return user
@app.get("/api/v1/users/", response_model=List[User])
def read_users(current_user: User = Depends(get_current_user)):
return list(users.values())
@app.put("/api/v1/users/{user_id}", response_model=User)
def update_user(user_id: int, user: User, current_user: User = Depends(get_current_user)):
if user_id not in users:
raise HTTPException(status_code=404, detail="User not found")
users[user_id] = user
return user
@app.delete("/api/v1/users/{user_id}")
def delete_user(user_id: int, current_user: User = Depends(get_current_user)):
if user_id not in users:
raise HTTPException(status_code=404, detail="User not found")
del users[user_id]
return {"detail": "User deleted"}
/api/v1/users/는 사용자의 집합을, /api/v1/users/{id}는 특정 사용자를 지칭). 또한, API의 버전(v1)을 URI에 포함시켜 API의 버전을 명시합니다.200 OK, 201 Created, 404 Not Found 등)를 사용합니다.OAuth2PasswordBearer를 사용하여 인증 메커니즘을 구현합니다. 이 예제에서는 간단한 토큰 기반 인증을 도입했습니다. 실제 애플리케이션에서는 이 토큰을 검증하여 사용자를 식별하는 추가 로직이 필요합니다.FastAPI는 OpenAPI 스펙을 기반으로 한 자동 문서화 기능을 제공합니다.
Swagger UI와 ReDoc은 FastAPI가 제공하는 두 가지 주요 문서화 도구입니다. 이 도구들을 통해 개발자와 사용자는 API의 엔드포인트, 가능한 요청 및 예상 응답에 대한 상세 정보를 쉽게 확인할 수 있습니다.
/docs 경로로 이동하여 접근할 수 있습니다. Swagger UI는 API의 인터랙티브한 문서를 제공하며, 실제 API 요청을 보내고 응답을 테스트할 수 있는 기능을 지원합니다./redoc 경로를 통해 접근할 수 있으며, Swagger UI와 비슷하지만 다른 스타일의 문서화를 제공합니다. ReDoc은 API 문서를 좀 더 읽기 쉬운 형식으로 제공합니다.Postman: 개발자가 API 엔드포인트에 대한 HTTP 요청을 보내고, 응답을 확인할 수 있게 해주는 인기 있는 도구입니다. 헤더, 바디, 쿼리 파라미터 등을 손쉽게 조작하며, 다양한 요청 메소드(GET, POST, DELETE, PUT 등)에 대한 지원이 가능합니다.
pytest: Python 기반의 테스트 프레임워크로, FastAPI 애플리케이션의 기능 및 통합 테스트를 자동화하기 위해 사용됩니다. pytest를 사용하여 API의 다양한 시나리오를 테스트하고, 예상치 못한 버그를 사전에 발견할 수 있습니다.
Postman을 사용한 테스트:
pytest를 사용한 테스트
해당 글은 아래 글을 참조하여 작성한 글입니다
https://medium.com/@techworldwithmilan/rest-api-design-best-practices-2eb5e749d428