안녕하세요! 질문 하나 드립니다. 프론트에서 graphql 쿼리를 보내는 작업을 하고 있는...
# 질문
u
안녕하세요! 질문 하나 드립니다. 프론트에서 graphql 쿼리를 보내는 작업을 하고 있는데요, query1과 같이 id를 루트(?)에 1번, 서브필드(routineRepeat)에서도 1번, 총 2번 조회하면 routineRepeat의 array 길이가 1 이상인데도 항상 길이가 0으로만 옵니다. (결과는 result1) 그런데 query2와 같이 루트(?)에서 id를 조회하지 않으면 서브필드의 array가 정상적으로 옵니다. (결과는 result2) 혹시 왜그런지 알 수 있을까요?
Copy code
// query 1
import { gql } from '@apollo/client';
const GET_WEEK_ROUTINES = gql`
  query getWeekRoutines($date: DateTime!) {
    getWeekRoutines(date: $date) {
      id
      title
      due
      routineRepeat {
        id
        date
      }
    }
  }
`;
// result1 (비정상)
[
  [
    {
      due: "2021-01-28T00:00:00.000Z",
      id: 157,
      title: "Routine Title",
      routineRepeat: [],
      __typename: "Routine"
    }
  ]
]
Copy code
// query2
import { gql } from '@apollo/client';
const GET_WEEK_ROUTINES = gql`
  query getWeekRoutines($date: DateTime!) {
    getWeekRoutines(date: $date) {
      title
      due
      routineRepeat {
        id
        date
      }
    }
  }
`;
// result2 (정상)
[
  [
    {
      due: "2021-01-28T00:00:00.000Z",
      id: 157,
      title: "Routine Title",
      routineRepeat: [
        {
          date: "2021-01-26T15:00:00.000Z",
          id: 337,
          __typename: "RoutineRepeat"
        }
      ],
      __typename: "Routine"
    }
  ]
]
플레이그라운드에서는 query1과 같이 해도 result2로 오는데 프론트 코드에서만 이상하게 result1로 오네요 😰
t
id가 어떻게 resolve 되는지 살펴봐야될거같아요. 아얘 다른곳에서 id 157이 겹칠 가능성이 있을까요?
u
네 getWeekRoutines의 리턴타입이 [[Routine!]!]! 여서 result1이
Copy code
[
  [
    {
      due: "2021-01-28T00:00:00.000Z",
      id: 157,
      title: "Routine Title",
      routineRepeat: [],
      __typename: "Routine"
    }
  ],
  [
    {
      due: "2021-01-28T00:00:00.000Z",
      id: 157,
      title: "Routine Title",
      routineRepeat: [],
      __typename: "Routine"
    }
  ]
]
이렇게 올 수도 있어요! 이게 혹시 문제가 될 수도 있나요? (본문 result1, result2 을 [Routine!]!으로 썼었는데, [[Routine!]!]!으로 변경했습니다)
t
id가 겹치면 가장 최근의 Routine으로 교체할거에요. 만약 첫번째로 아폴로가 받은 157번 Routine이 정상적이더라도, 다음에 받은 157번 Routine이 비정상적이라면 이전의 받은 157번 Routine이 수정된것으로 파악하고, 모두 내용을 교체해요.
u
아하..!!! 그러면 내용을 교체하지 못하게 하는 방법이 없고 이 쿼리 자체를 수정하는게 맞는건가요?
t
예를 들어 1004번 유저의 프로필 사진이 원래 A 였는데... 앱이 구동되던 도중 1004번 유저가 프로필 사진을 B로 바꾸었고, 어딘가에서 1004번 유저 요청의 응답으로 프로필 사진을 B로 내려주면 앱 내에 1004번 유저의 프로필 사진이 모두 B로 바뀌는 구조에요.
정확히는 모르겠네요 ㅠ 157번 Routine의 routineRepeat이 빌수도있고 채워질수도 있는게 맞나요??
u
네네 맞아요 result1처럼 올 수도 있고, result2처럼 올 수도 있는건데 이런 구조라서 제가 원하는 결과값을 받을 수 없던거군요
t
그래서 id는 오브젝트마다 유니크해야해요 ㅎㅎ 어플리케이션 로직상 동작인거같은데... id 체계를 바꿔보시는것도 추천드려요
“157:filled” “157:empty” 이런식으로?! ㅋㅋ
제가 어떤 앱인지 정확하게 몰라서 ㅠㅠ 구체적인 가이드라인을 드리지못하겠네요 ㅋㅋ 참고만 하셔요~~
u
그런 방법도 있겠네요 ㅋㅋㅋ 일단은 쿼리를 수정하는게 제일 맞는 방법일 것 같아요 하루종일 삽질할 뻔 했는데 정말 감사합니다 😄
루빗 이라는 앱입니다 ㅎㅎ
t
개인적인 의견은 쿼리를 수정해서 해결하기보다는 스키마(서버)쪽을 손대시는게 더 맞지않나 싶어요 ㅎㅎ 같은 id에 다른 오브젝트가 내려오는거니까요. 원리를 이해하셨으니 팀원분들과 함께 의논해보셔요!
👍 1