[개발일지] 230614 Amplify GraphQL

 

Amplify Data modeling


Amplify는 GraphQL 스키마에서 @model 지시어로 주석이 달린 GraphQL 유형에 대한 DynamoDB 데이터베이스 테이블을 자동으로 생성한다. 그리고 @model은 ID 필드를 데이터베이스 테이블에 primaryKey로 자동으로 추가한다.

 

아래는 Todo에 대한 간단한 GraphQL 스키마이다.

type Todo @model {
  content: String
}

 

위 예제의 GraphQL 스키마는 'Todo'에 대한 데이터베이스 테이블을 자동으로 생성한다.

Amplify CLI는 “amplify push"를 하면 Todo 데이터베이스 테이블을 생성하고 Todo 모델에 대한 Create, Read, Update, Delete 및 list operations을 수행할 수 있는 GraphQL API를 생성한다.

또한 @model은 createdAt 및 updatedAt 타입을 따로 스키마에 정의하지 않아도 자동으로 추가해준다.

 

위 스키마에 대한 결과는 아래와 같이 생성된다.

type Todo @model {
  id: ID!
  content: String
  createdAt: AWSDateTime
  updatedAt: AWSDateTime
}

 

primary key

@model 지시어가 있는 모든 GraphQL 유형에는 자동으로 id 필드가 pk로 설정된다. “@primaryKey” 지시어로 다른 필수 필드를 표시하여 이 동작을 재정의할 수 있다.

아래 예제에서 todoId는 데이터베이스의 pk이며 @primartKey를 사용했기 때문에 @model 지시문에 의해 id 필드가 더 이상 자동으로 생성되지 않는다.

 

type Todo @model {
  todoId: ID! @primaryKey
  content: String
}

 

 

주의할 점은 PK를 설정하고 배포된 이후에는 테이블을 삭제하고 다시 만들지 않는 이상 PK를 변경할 수 없다.

 

Default Values

@default지시어를 사용해서 선택적 scalar type 필드에 대한 기본값을 지정할 수 있다.

 

type Todo @model {
  content: String @default(value: "My new Todo")
}

 

위와 같이 Todo를 만들고 content의 값을 전달하지 않으면 Amplify는 기본 값으로 설정해준 “My new Todo”값으로 자동으로 설정한다.

 

@default를 사용해 기본값을 적용하면 "!" 를 사용하는것이 무시가 된다. 좀 쉽게 이야기하면 "String!"와 "String"은 동일하다는 이야기이다. 왜냐하면 값을 제공하지 않더라도 필드가 기본값을 가져오기 때문에 null이 되지않기 때문이다.

 

References

https://docs.amplify.aws/cli/graphql/data-modeling/#setup-database-tables

 

https://docs.amplify.aws/cli/graphql/data-modeling/#setup-database-tables

 

docs.amplify.aws