07
23

Post, Put, Patch의 사용을 결정하는 것은 HTTP 메서드의 의미와 의도에 따라 결정됩니다. 각각의 메서드는 특정한 목적과 사용 사례를 가지며, 이를 이해하면 적절한 메서드를 선택하는 데 도움이 됩니다.

HTTP 메서드의 의미와 사용 사례

  1. POST:

    • 의미: 새로운 리소스를 생성합니다.
    • 사용 사례:
      • 새로운 사용자 계정을 생성할 때
      • 새로운 게시글을 작성할 때
      • 새로운 항목을 데이터베이스에 추가할 때
    • 특징:
      • 멱등하지 않음: 같은 요청을 여러 번 보내면 여러 리소스가 생성될 수 있습니다.
      • 일반적으로 리소스의 URI는 서버가 생성합니다.
    • 예시:
      @app.post("/users/")
      async def create_user(user: User):
          # 사용자 생성 로직
  2. PUT:

    • 의미: 리소스를 생성하거나, 전체 리소스를 대체합니다.
    • 사용 사례:
      • 사용자의 전체 정보를 업데이트할 때
      • 특정 리소스를 전체적으로 대체할 때
    • 특징:
      • 멱등함: 같은 요청을 여러 번 보내도 결과는 동일합니다.
      • URI가 지정된 리소스를 대상으로 합니다.
    • 예시:
      @app.put("/users/{user_id}")
      async def update_user(user_id: int, user: User):
          # 사용자 정보 대체 로직
  3. PATCH:

    • 의미: 리소스의 일부를 수정합니다.
    • 사용 사례:
      • 사용자의 특정 필드를 업데이트할 때 (예: 이메일 주소 변경)
      • 리소스의 부분적인 업데이트가 필요할 때
    • 특징:
      • 멱등하지 않을 수 있음: 부분 업데이트는 여러 번 보내도 결과가 동일하지 않을 수 있습니다.
      • URI가 지정된 리소스를 대상으로 합니다.
    • 예시:
      @app.patch("/users/{user_id}")
      async def partial_update_user(user_id: int, user: PartialUser):
          # 사용자 정보 부분 수정 로직

결정 기준

  • 새로운 리소스 생성: POST

    • 예: 새로운 블로그 게시글 작성
    • 예: 새로운 주문 생성
  • 전체 리소스 대체 또는 생성: PUT

    • 예: 사용자 프로필 전체 업데이트
    • 예: 특정 ID의 제품 정보 전체 대체
  • 리소스의 일부 수정: PATCH

    • 예: 사용자 이메일 업데이트
    • 예: 주문 상태 변경

구체적인 예제

사용자 정보를 관리하는 API를 예로 들어보겠습니다.

  • POST: 새로운 사용자 생성

    from fastapi import FastAPI
    from pydantic import BaseModel
    
    app = FastAPI()
    
    class User(BaseModel):
        name: str
        email: str
    
    @app.post("/users/")
    async def create_user(user: User):
        # 새로운 사용자 생성 로직
        return {"message": "User created", "user": user}
  • PUT: 사용자 정보 전체 업데이트

    @app.put("/users/{user_id}")
    async def update_user(user_id: int, user: User):
        # 사용자 정보 전체 대체 로직
        return {"message": "User updated", "user_id": user_id, "user": user}
  • PATCH: 사용자 정보 부분 업데이트

    class PartialUser(BaseModel):
        name: Optional[str] = None
        email: Optional[str] = None
    
    @app.patch("/users/{user_id}")
    async def partial_update_user(user_id: int, user: PartialUser):
        # 사용자 정보 부분 수정 로직
        return {"message": "User partially updated", "user_id": user_id, "user": user}

이렇게 HTTP 메서드의 의미와 사용 사례를 명확히 이해하고, 각 메서드의 특징을 고려하여 적절한 메서드를 선택하면, API 설계가 명확하고 일관성 있게 됩니다.

반응형
COMMENT