본문 바로가기
다이어리

POST, PUT, PATCH 사용에 대해

by E.Clone 2024. 7. 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 설계가 명확하고 일관성 있게 됩니다.

반응형