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

이제 사용자가 가지고 있는 모든 노트 목록을 반환하는 API를 추가할 차례입니다.

함수 추가하기

Change indicator services/functions/list.js라는 새 파일을 만들고 다음 내용을 추가합니다.

import handler from "./libs/handler-lib";
import dynamoDb from "./libs/dynamodb-lib";

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

  const result = await dynamoDb.query(params);

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

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

API 엔드포인트 설정

Change indicator serverless.yml 파일을 열고 다음 내용을 추가합니다.

list:
  # list.js의 main 함수를 호출하는 HTTP API 엔드포인트를 정의합니다.
  # - path: URL 경로는 /notes
  # - method: GET 요청
  handler: list.main
  events:
    - http:
        path: notes
        cors: true
        method: get

이 설정은 GET 요청을 처리하는 /notes 엔드포인트를 정의합니다.

테스트

Change indicator mocks/list-event.json 파일을 생성하고 다음 내용을 추가합니다.

{}

이 가이드에서 나중에 이 부분을 대체할 예정이므로 아직은 빈 mock 이벤트를 추가합니다.

그리고 프로젝트의 루트 디렉토리에서 함수를 호출합니다.

$ serverless invoke local --function list --path mocks/list-event.json

응답은 다음과 비슷하게 나타납니다.

{
    "statusCode": 200,
    "body": "[{\"attachment\":\"hello.jpg\",\"content\":\"hello world\",\"createdAt\":1602891322039,\"noteId\":\"42244c70-1008-11eb-8be9-4b88616c4b39\",\"userId\":\"123\"}]"
}

이 API는 단일 노트 객체를 반환하는 get.js 함수와 달리 노트 객체 배열을 반환합니다.

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