자라나라 개발머리

[GraphQL/Apollo Server] directives 파헤치기 - Apollo Federation Directives(1) @key, @extends 본문

GraphQL

[GraphQL/Apollo Server] directives 파헤치기 - Apollo Federation Directives(1) @key, @extends

iammindy 2024. 6. 10. 00:09

오늘은~ Apollo Server의 directives를 알아본 것에 이어서, Apollo Federation의 directives에 대해 알아보려 합니다.

 

Apollo Federation에서 directives의 역할

Apollo Federation은 Micro Service Architecture에서 여러 개의 subgraphql을 하나의 graphql로 통합해주는 강력한 기능입니다.

사용자는 하나의 endpoint만 알면 여러 서버에 있는 쿼리, 뮤테이션 등의 operation을 모두 사용할 수 있는거죠.

 

여기서 directives는 여러개의 스키마가 합쳐질 때 일어날 수 있는 상황들을 제어하기 위해 쓰입니다.

예를 들어, 다른 서브그래프에서 쓰는 필드를 같이 쓰고 싶을 때 지시어를 추가해서 이건 다른 서브 그래프에 있는 필드야~ 하고 알려즐 수 있습니다.

 

오늘은 여러 directives 중에서도 graphql의 type을 관리하는 기본중에 기본! @key와 @extends에 대해 알아보겠습니다.

 

@key

directive @key(fields: FieldSet!, resolvable: Boolean = true) repeatable on OBJECT | INTERFACE

 

federation 환경 내에서 특정 type을 다른 그래프와 공유하고 싶을 때 entity라는 개념을 써서 공유하는데요.

entity로써 지정하면서 이 @key directive를 쓰게 됩니다.

이 지시자를 씀으로써 서브그래프들의 해당 엔티티의 인스턴스를 고유하게 식별할 수 있게 합니다.

 

argument

1. fields(required)

fields는 해당 type을 엔티티로 구성할 때, 해당 타입의 인스턴스들을 유니크하게 만드는(DB에서 primary key!) 필드를 적어줍니다.

FieldSet! 이라고 적혀있는걸 보아하니, 필수로 하나를 지정해줘야 하고 복수개의 필드를 기입하는 것도 가능한 걸 알 수 있습니다.

 

2. resolvable(defalut: true)

resolveable는 false인 경우, 해당 type의 리졸버를 정의하지 않았다는 의미입니다.

resolveable을 false로 해놓으면 해당 type을 다른 서브그래프에서 사용하지도 못하고, 선언하지도 못하겠죠?

 

사용법

type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Int
}

기존 type을 선언하는 맨 마지막 부분에 @key()를 추가해줍니다.

fields에 id가 추가되어 있는 것을 보니 Product type은 id로써 유일한 값이 되는 친구인가봅니다!

이렇게 선언한 Product는, 다른 서브그래프에서도 사용가능한 type(entity)이 됩니다.

 

관련된 내용에 대해서 자세한 예시가 필요하다면 아래 글을 읽어보셔도 도움이 될 것 같습니다. 😁

 

[GraphQL] reference resolver 의미/사용법

동료 개발자분이 entity 사용에 대한 질문을 주셨는데, 어영부영 대답을 드리긴 했으나 성에 차지 않았습니다. 이유는 reference resolver에 대한 개념이 제 머릿속에서 명확하지 않아서 였습니다. (사

growupdevmind.tistory.com

 

 

@extends

directive @extends on OBJECT | INTERFACE

 

이 지시어는 해당 객체 또는 인터페이스가 동일한 type의 확장 버전임을 알려주는 지시어입니다.

다른 원본 type이 있고, 이를 가져다 쓰겠다는 의미의 지시어 입니다.

현재 federation 2 version에서는 @extends 지시어는 사용하지 않고, extend라는 키워드로 이 지시어를 대신하고 있습니다.

 

사용법

위에서 사용했던 Product type 예시를 들고오겠습니다.

//subgraph A
type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Int
}

 

해당 스키마를 subgraph B에서 사용하고 싶으면, 아래 예시처럼 사용하면 됩니다.

//subgraph B
extend type Product @key(fields: "id") {
  id: ID!
}

 

 

 

오늘은 federation의 기본인, @key와 @extends 지시어에 대해서 알아봤습니다. 다음엔 좀 더 심화된 directives의 설명으로 다시 찾아뵙겠습니다. 읽어주셔서 감사합니다! 😊