모든 노트 목록을 반환하는 API 추가하기

이제 사용자가 가진 모든 노트 목록을 반환하는 API를 추가할 것입니다. 이 작업은 이전 챕터에서 단일 노트를 반환했던 것과 매우 유사합니다.

함수 추가하기

Change indicator packages/functions/src/list.ts 파일을 생성하고 다음 내용을 추가합니다.

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

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

export const main = Util.handler(async (event) => {
  const params = {
    TableName: Resource.Notes.name,
    // 'KeyConditionExpression'은 쿼리 조건을 정의합니다.
    // - 'userId = :userId': 'userId'가 일치하는 항목만 반환합니다.
    //   파티션 키를 기준으로 합니다.
    KeyConditionExpression: "userId = :userId",
    // 'ExpressionAttributeValues'는 조건의 값을 정의합니다.
    // - ':userId': 작성자의 id를 'userId'로 정의합니다.
    ExpressionAttributeValues: {
      ":userId": "123",
    },
  };

  const result = await dynamoDb.send(new QueryCommand(params));

  // 응답 본문에 일치하는 항목 목록을 반환합니다.
  return JSON.stringify(result.Items);
});

이 코드는 get.ts와 거의 동일하지만, 전달된 userId와 일치하는 항목만 반환하도록 조건을 사용합니다. 현재는 여전히 123으로 하드코딩되어 있습니다.

라우트 추가

이 새로운 엔드포인트를 위한 라우트를 추가해 보겠습니다.

Change indicator infra/api.ts 파일에서 POST /notes 라우트 위에 다음 코드를 추가하세요.

api.route("GET /notes", "packages/functions/src/list.main");

변경 사항 배포하기

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

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

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

API 테스트하기

모든 노트를 조회하는 API를 테스트해 보겠습니다.

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

$ curl https://5bv7x0iuga.execute-api.us-east-1.amazonaws.com/notes

예시 URL을 여러분의 Api 값으로 바꿔주세요.

간단한 GET 요청이기 때문에, 브라우저에서 이 URL로 직접 접속할 수도 있습니다.

응답은 다음과 같이 표시됩니다.

[{"attachment":"hello.jpg","content":"Hello World","createdAt":1629336889054,"noteId":"a46b7fe0-008d-11ec-a6d5-a1d39a077784","userId":"123"}]

단일 노트가 아니라 노트 배열을 반환한다는 점에 유의하세요.

다음으로 노트를 업데이트하는 API를 추가할 예정입니다.