본문 바로가기

프로그래밍 기술 노트/기타 정보

AppSync Subscription Data Field가 DB 에는 있지만, null 로 오는 경우 (Feat GraphQL)

그래프ql (AWS AppSync) 에서 에서 저장된 데이터를 실시간으로 땡겨오기 위하여 Subscription 을 사용 할 수 있는데

띠용 분명히 DB 에는 데이터가 있는데, Subscription 하니까 특정 field 가 null 로 오는 경우가 발생..

무엇이 문제인고 하니..

Event fields - Real-time data with subscriptions - Building GraphQL APIs with AWS AppSync (graphql-on-aws-appsync-book.com)

 AppSync only fills the subscription events with the fields that the mutation defined.

 

AppSync 는 (다른 그래프ql 은 몰?루) mutation 할때 defined 된 애들만 가져온다! 는 사실..

즉 DB 에서 Query 하는게 아니라, 실제 Mutation 이 쿼리가 return 하는 값만, 고대로~~ Subscrption 이 구독 한다는 말이다.

 

예를 들어

스키마는 다음과 같고

type Message {
	messageId: String!
	message: String!
	messageCreatedAt: String!
}

type Mutation {
	createMessage(message: String!): Message!
}
// createMessage 할때, 해석기 (resolver) 에서 id랑 createdAt 이 부여됨!

type Subscription {
	addMessage: Message
		@aws_subscribe(mutations: ["createMessage"])
}

schema {
	mutation: Mutation
	subscription: Subscription
}

 

Client 에서 사용할 쿼리는 다음과 같을때,

// CreateMessageAndQueryAllField 쿼리
mutation CreateMessageAndQueryAllField {
  createMessage(message:"메시지~~") {
    messageId
    message
    messageCreatedAt
  }
}

// messageCreatedAt을 확인하지 않는 CreateMessageAndQuerySomeField 쿼리
mutation CreateMessageAndQuerySomeField {
  createMessage(message:"메시지~~") {
    messageId
    message
  }
}

// 구독 subscription
subscription OnMessageAdded {
  addMessage {
    messageId
    message
    messageCreatedAt
  }
}

 

실제 `createMessage` 할때, resolver 에서 messageId 와 messageCreatedAt 을 부여하기 때문에, CreateMessageAndQueryAllField 이나 CreateMessageAndQuerySomeField 이나 상관없이, DB 에는 모든필드 (messageId, message, messageCreatedAt) 이 다 들어가있음에도 불구하고.

 

 OnMessageAdded 구독중일때 CreateMessageAndQuerySomeField 쿼리로 데이터가 삽입된 순간에는 messageCreatedAt 은 null 로 들어온다...

 

이런 개념이다. created 는 DB 에 있겠지만.. subscription 에는 안들어온다! subscription 은 DB 에서 쿼리하는게 아닌, mutation 정보가 고대로~ bypass 되는 개념이기 때문

 

728x90