노트 업데이트 API 추가하기

이제 사용자가 주어진 ID로 새로운 노트 객체를 사용해 노트를 업데이트할 수 있는 API를 만들어 보겠습니다.

함수 추가하기

Change indicator packages/functions/src/update.ts 파일을 새로 만들고 다음 코드를 붙여넣으세요.

import { Resource } from "sst";
import { Util } from "@notes/core/util";
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { UpdateCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";

const dynamoDb = DynamoDBDocumentClient.from(new DynamoDBClient({}));

export const main = Util.handler(async (event) => {
  const data = JSON.parse(event.body || "{}");

  const params = {
    TableName: Resource.Notes.name,
    Key: {
      // 생성할 아이템의 속성
      userId: "123", // 작성자 ID
      noteId: event?.pathParameters?.id, // 경로에서 가져온 노트 ID
    },
    // 'UpdateExpression'은 업데이트할 속성을 정의
    // 'ExpressionAttributeValues'는 업데이트 표현식의 값을 정의
    UpdateExpression: "SET content = :content, attachment = :attachment",
    ExpressionAttributeValues: {
      ":attachment": data.attachment || null,
      ":content": data.content || null,
    },
  };

  await dynamoDb.send(new UpdateCommand(params));

  return JSON.stringify({ status: true });
});

이 코드는 create.ts 함수와 비슷하게 보일 겁니다. 여기서는 params에 새로운 contentattachment 값을 포함해 DynamoDB의 update 호출을 합니다.

라우트 추가

노트를 가져오는 API를 위한 새로운 라우트를 추가해 보겠습니다.

Change indicator infra/api.ts 파일에서 GET /notes/{id} 라우트 아래에 다음 코드를 추가하세요.

api.route("PUT /notes/{id}", "packages/functions/src/update.main");

변경 사항 배포하기

터미널로 이동하면 변경 사항이 배포되고 있음을 확인할 수 있습니다.

새로운 API가 배포된 것을 확인할 수 있습니다.

+  Complete
   Api: https://5bv7x0iuga.execute-api.us-east-1.amazonaws.com

API 테스트

이제 새로운 API를 테스트할 준비가 되었습니다. 이전 챕터에서 노트 생성 API를 테스트했을 때, 새로운 노트의 ID가 noteId로 반환되었어야 합니다.

Change indicator 터미널에서 다음 명령어를 실행하세요.

$ curl -X PUT \
-H 'Content-Type: application/json' \
-d '{"content":"New World","attachment":"new.jpg"}' \
https://5bv7x0iuga.execute-api.us-east-1.amazonaws.com/notes/<NOTE_ID>

URL 끝에 있는 ID를 이전에 받은 noteId로 바꾸는 것을 잊지 마세요.

여기서는 업데이트하려는 노트에 PUT 요청을 보냅니다. 새로운 contentattachment를 JSON 문자열로 전달합니다.

응답은 다음과 같이 표시될 것입니다.

{"status":true}

다음으로, 주어진 ID를 사용해 노트를 삭제하는 API를 추가할 예정입니다.