graphql-code-generator에서 TypeScript 플러그인을 사용 중인데요,...
# 질문
x
graphql-code-generator에서 TypeScript 플러그인을 사용 중인데요, 혹시 @computed 디렉티브가 붙어 있는 필드들에 대해서는 TS 타입을 Nullable하게 출력하도록 하는 게 가능할까요?
h
디렉티브 직접 처리하셔야할것 같은데요
makeExecutableSchema 안쓰시나요
x
쓰고는 있는데 이 문제 해결에 어떻게 도움이 될지는 감이 안 잡히네요….?
h
어음...
잠시만요 세탁소좀 다녀와서
x
ㅋㅋㅋㅋㅋㅋ 넹
h
자 봅시다
일단 directive 와 executable schema 부터 설명하겠습니다
디렉티브는 sdl 과 operation 에 붙일 수 있는데 아시다시피 그 자체로는 역할이 없고 사용하는 GraphQL 엔진에서 구문확장의 용도로 주로 사용합니다.
그래서 보통 makeExecutableSchema 같은거 돌리는 과정에서 사라지고
makeExecutableSchema 유틸은 해당 디렉티브를 만난 곳에서 스키마나 리졸버를 덮어 씌우는 식으로 구현되어있습니다
x
그렇군요…
h
여기서 하고싶으신건 아마 graphql-codegen 으로 묶은 SDL 을 처리하고 싶으신걸텐데요
전에 맥락에서 유추해봤을 때 소스 스키마는 여러군데 있을것이고 이걸 graphql-codegen 으로 병합해서 하나의 SDL 파일을 얻으셨을 텐데 includeDirectives: true 옵션을 줘서 사용하신 디렉티브가 그대로 포함되어 있을겁니다
@computed
라는 디렉티브를 만들었는데 이걸 만나면 스키마를 nullable 로 바꾸는 처리를 하고 싶으신거잖아요
Apollo Server 같은거 쓰신다면 거기선 이미 makeExecutableSchema 를 써서 해당 동작을 구현하셨을테니 익숙하실텐데요
x
아닙니다 스키마는 원래 Nullability를 유지하어야 하고
TS 타입만 Nullable이 되고
h
어음.......
x
리졸버가 Null을 반환하면 Cascade하게 깨지는 게 생각 중이던 방향이었는데
h
굉장히 이상한 사례군요 타입이 부정확했으면 좋겠다는게 요구사항이 맞나요
x
음 어떤 면에서 이상하다고 생각하시나요? 세이프티가 깨진다는 측면이신가요
h
API 를 반영하는 타입이 아니라면 애초에 생성할 필요가...
막상 GraphQL 응답은 Non nullable 인데 TypeScript 에서 Nullable 이라는게 이해가 안됩니다
GraphQL 응답에 대한 직접적인 타입을 원하시는게 아닌거같습니다
x
Lazy하게 데이터를 당기고 싶다는 맥락인데요
h
그럼 그냥 생성한 타입을 사용해서 접근자 유틸같은걸 만드시면 됩니다
graphql 타입정보 가지고 해킹할건 아닌거같고요
x
그냥 getter 만들어서 get하는 타이밍에 로딩을 하라는 말씀이시죠?
그러면 타입은 유지되니까?
h
타입이 유지되는게 아니라
API 응답은 응답대로 놔두고 접근제어를 하라는 얘기엿습니다
non-null 을 Lazy<T> 로 바꾼다던지 그런건 아주 다른 관심사니까
graphql-codegen 은 클라이언트 생성기가 아니라 그냥 타입 코드만 뱉을 줄 알아요
클라이언트를 기대하시면 안됩니다. 클라이언트는 apollo-client 나 urql 같은게 클라이언트에요
x
아 넵 무슨 말씀이신지 대충 할 것 같습니다
h
그리고 이쪽엔 schema extension 은 안들어갑니다
x
Prisma와 리졸버 사이에 데이터 레이어를 하나 만들어주는 방식으로 진행해야겠네요
h
혹시 다루고 싶으신게 schema extension 이 아니라 operation extension 일수도 있겠다는 생각이 드는데
이건 완전 다른 주제라서
x
오오… 데이터 레이어 만드는 방향으로 진행 중인데 코드가 매우 마음에 들게 나오네요
이때까지 뭔가 단단히 잘못하고 있었구나 싶어지는…. 항상 좋은 가르침 감사합니다 🙇‍♂️