본문 바로가기

# GraphQL

(16)
# GraphQL/TypeGraphQL [TypeGraphQL] 상속, Inheritance 상속 TypeGraphQL에서는 extends키워드를 통해 기존 타입을 상속받아 사용할 수 있습니다. 여기서는 아래의 3가지 관점에서 상속을 활용하는 방법을 설명하겠습니다. 주요 관점: 베이스 타입이 일반 클래스인 경우 베이스 타입이 추상 클래스인 경우 오버라이딩된 필드는 어떻게 되나? 일반 클래스 상속 위에서 이미 설명하였듯이, 평범하게 extends키워드를 사용하면 기존 타입을 확장할 수 있습니다. 예를 들어, 아래와 같이 2차원 좌표를 표현하는 ObjectType을 정의하면. @ObjectType() class Point2D { @Field(() => Int) x!: number; @Field(() => Int) y!: number; }상속을 사용하여 3차원 좌표로 쉽게 확장할 수 있습니다. @Ob..

2020. 7. 4. 13:37

# GraphQL/TypeGraphQL [TypeGraphQL] @EnumType 열거형 TypeGraphQL은 @EnumType 데코레이터를 통해 타입스크립트의 enum을 GraphQL EnumType으로 정의할 수 있습니다. 1. TS에서 enum 정의하기 먼저 TypeScript에서 열거형을 정의합니다. // // implicit value 0, 1, 2, 3 enum CounterCommand { UP, // 0 DOWN, // 1 } // // or explicit values enum CounterCommand { UP = "up", DOWN = "down", } 2. 열거형 등록 registerEnumType를 사용하여 열거형을 등록합니다. import { registerEnumType } from "type-graphql"; registerEnumType(CounterC..

2020. 6. 18. 12:19

# GraphQL/TypeGraphQL [TypeGraphQL] Scalar 스칼라 TypeGraphQL에서는 스칼라라는 이름으로 유저가 직접 Primitive Type을 정의하여 사용할 수 있습니다. 여기서는 RGB라는 스칼라 타입을 만들어보겠습니다. 1. 내부표현, 외부표현 설계하기 먼저 RGB 타입을 어떻게 디자인할지 생각해야 합니다. 여기서 내부적인 표현이란 구현, 외부적인 표현이란 직렬화에 관련됩니다. 사용자는 외부적인 표현을 사용하여 데이터를 표현하고, 서버는 외부적인 표현을 내부적인 표현으로 변환(파싱)하여 사용합니다. 먼저, 내부적으로는 다음과 같이 디자인하면 될 것 같습니다. class RGB { r: number; g: number; b: number; toHex(): string; static fromHex(hex: string): RGB; static fro..

2020. 6. 14. 20:13

# GraphQL/TypeGraphQL [TypeGraphQL] @InputType, @ArgsType 노드의 분류 GraphQL에서는 요청과 응답을 기준으로 노드의 타입을 크게 2가지로 나눌 분류할 수 있습니다. InputType OutputType ObjectType OutputType은 사용자에게 데이터를 반환활 수 있는 타입이며, ObjectType을 포함한 Primitive Value 및 Scalar Type이 포함됩니다. InputType 반대로 InputType은 사용자가 데이터를 전달할 수 있는 타입이지만, OutputType같이 종류의 집합이 아니라 ObjectType처럼 단일로 존재할 수 있는 노드입니다. ObjectType이 여러 필드를 묶어놓듯이 InputType은 여러 아규먼트를 묶습니다. TypeGraphQL에서 InputType을 생성하려면 다음 데코레이터 중 하나를 사용해야 합..

2020. 6. 13. 20:18

# GraphQL/TypeGraphQL [TypeGraphQL] 기본 자료형과 @ObjectType 오브젝트 타입 ObjectType은 GraphQL에서 데이터 객체를 표현하는 단위이며, 데이터베이스로 비유하면 Relation의 개념에 가깝습니다. ObjectType은 서로다른 ObjectType와 관계를 맺을 수 있기 때문에, 수 많은 오브젝트 타입들이 엉키고설키면 마치 그래프와 같은 모양새가 나오게 됩니다. GraphQL이라는 이름이 붙은 이유도 이와 비슷할 것 입니다. @ObjectType 클래스 위에 @ObjectType() 데코레이터를 붙이면 클래스를 ObjectType으로 만들 수 있습니다. 마찬가지로 필드 위에 @Field() 데코레이터를 붙이면 Field of ObjectType로 만들 수 있습니다. 아래의 SDL을 클래스로 표현하면 다음과 같습니다. type Book { title: S..

2020. 6. 8. 18:48

# GraphQL/TypeGraphQL ApolloServer + TypeScript + TypeGraphQL 조합으로 GraphQL 서버 시작하기 TypeGraphQL TypeScript와 GraphQL을 함께 사용하려고 한다면 TypeScript가 생산성을 감소시키는 복병이 될 수 있습니다. 편하게 작업하려고 도입한 TypeScript가 오히려 개발을 어렵게 만들다니. 이게 어떻게 된 걸까요? 타입 불일치 문제는 SDL과 Actual Type이 일치하지 않을 때 발생합니다. Int라고 써놓고 String으로 읽는다거나 nullable을 빼먹는다거나... 문제는 이런 상황이 의외로 흔하고, 에러가 발생하기 전까지는 눈치채기도 어렵다는 것 입니다. // SDL type book { title : String! price : Int } // TypeScript class book { title : string; price : number; //< ty..

2020. 6. 7. 22:45

# GraphQL/GraphQL.js 아마존 AWS AppSync 시작하기 아마존 AppSync란? AWS AppSync는 아마존에서 제공하는 서버리스 GraphQL 서비스입니다. (= GraphQL As a service)아마존에서 사용되는 자원들을 쉽게 GraphQL에 부착할 수 있다는 것이 큰 장점이며,완전 관리형으로 동작하기 때문에 유지보수 비용도 크지 않습니다. 아래부터는 기본적인 GraphQL 지식이 있다는 가정하에 진행되므로,아직 GraphQL이 무엇인지 모르시는 분은 여기를 한번 살펴봐주세요. 요금 상세 GraphQL 서비스를 이용한 만큼 비용이 결정됩니다.쿼리와 뮤테이션 호출한 횟수 1백만 건당 4.00 USD 실시간 업데이트 (서브스크립션) 연결된 시간 1백만 분당 0.08 USD 수신된 자료 1백만 건당 2.00 USD ** 5kb 이하의 데이터는 1건으로 ..

2019. 12. 26. 17:29

# GraphQL/GraphQL.js 타입스크립트 GraphQL Cursor Based Pagination 커서 기반 페이지네이션 커서 기반 페이지네이션은 각 엔티티에 고유한 커서값을 할당하고, 기준 커서값과 사이즈로 다음 페이지를 가져오는 방식입니다. 오프셋 기반 페이징은 중간에 새로운 데이터가 삽입되면, 다음 페이지를 조회했을 때, 이전에 봤던 데이터가 포함되어 있을 수 있습니다. 몇 번째 페이지에서 몇 건 방식으로 가져오기 때문입니다. 하지만 커서 기반 페이지네이션은 그 데이터 다음에서 몇 건 방식으로 가져오기 때문에, 항상 새로운 데이터만 가져옴을 확신할 수 있습니다. 시나리오 유명한 게임인 League of Legned의 캐릭터 이름이 오름차순으로 정렬되어 배열로 주어집니다. 어떤 캐릭터 이후의 몇 명을 한페이지로 가져오고, 이것을 다음 검색에도 활용하기 위해, 다음 첫번째 캐릭터를 추가적으로 반환해..

2019. 12. 16. 02:48