1. 개요
GraphQL 은 웹 서비스에서 통신 패턴으로 널리 사용되었습니다. GraphQL의 기본 전제는 클라이언트 측 애플리케이션에서 유연하게 사용할 수 있다는 것입니다.
이 사용방법(예제)에서는 유연성의 또 다른 측면을 살펴보겠습니다. 또한 GraphQL 필드가 다른 이름으로 노출되는 방법도 살펴보겠습니다.
2. GraphQL 스키마
다른 작성자 의 게시물 이 있는 블로그 의 예를 들어 보겠습니다 . GraphQL 스키마는 다음과 같습니다.
query {
recentPosts(count: 1, offset: 0){
id
title
text
category
author {
id
name
thumbnail
}
}
}
type Post {
id: ID!
title: String!
text: String!
category: String
authorId: Author!
}
type Author {
id: ID!
name: String!
thumbnail: String
posts: [Post]!
}
여기에서 최근 게시물을 가져올 수 있습니다. 모든 게시물 에는 작성자 가 함께 합니다 . 쿼리 결과는 다음과 같습니다.
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
3. 다른 이름으로 GraphQL 필드 노출
클라이언트 측 애플리케이션은 first_author 필드를 사용해야 할 수 있습니다. 지금은 작성자 를 사용하고 있습니다. 이 요구 사항을 수용하기 위해 두 가지 솔루션이 있습니다.
- GraphQL 서버에서 스키마 정의 변경
- GraphQL 의 별칭 개념 활용
두 가지를 하나씩 살펴보겠습니다.
3.1. 스키마 변경
게시물 의 스키마 정의를 업데이트해 보겠습니다 .
type Post {
id: ID!
title: String!
text: String!
category: String
first_author: Author!
}
저자 는 사소한 분야가 아닙니다. 그것은 복잡한 것입니다. 또한 이 변경 사항을 수용하기 위해 핸들러 메서드를 업데이트해야 합니다.
PostController 에서 @SchemaMapping 으로 표시된 uthor (Post post) 메서드는 getFirst_author (Post post) 로 업데이트해야 합니다 . 또는 @SchemaMapping에 필드 속성을 추가하여 새 필드 이름을 반영해야 합니다.
쿼리는 다음과 같습니다.
query{
recentPosts(count: 1,offset: 0){
id
title
text
category
first_author{
id
name
thumbnail
}
}
}
위 쿼리의 결과는 다음과 같습니다.
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
이 솔루션에는 두 가지 주요 문제가 있습니다.
- 스키마 및 서버 측 구현에 변경 사항을 도입하고 있습니다.
- 다른 클라이언트 측 애플리케이션이 이 업데이트된 스키마 정의를 따르도록 강제하고 있습니다.
이러한 문제는 GraphQL이 제공하는 유연성 기능과 모순됩니다.
3.2. GraphQL 별칭
GraphQL에서 별칭을 사용하면 스키마 정의를 변경하지 않고도 필드 결과의 이름을 원하는 이름으로 바꿀 수 있습니다. 쿼리에 별칭을 도입하려면 별칭과 콜론 기호(:)가 GraphQL 필드 앞에 와야 합니다.
쿼리 데모는 다음과 같습니다.
query {
recentPosts(count: 1,offset: 0) {
id
title
text
category
first_author:author {
id
name
thumbnail
}
}
}
위 쿼리의 결과는 다음과 같습니다.
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
쿼리 자체가 첫 번째 게시물을 요청하고 있음을 알 수 있습니다. 또 다른 클라이언트 측 애플리케이션은 최근 포스트 대신에 first_post 를 갖도록 요청할 수 있습니다 . 다시 말하지만 별칭이 도움이 될 것입니다.
query {
first_post: recentPosts(count: 1,offset: 0) {
id
title
text
category
author {
id
name
thumbnail
}
}
}
위 쿼리의 결과는 다음과 같습니다.
{
"data": {
"first_post": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
이 두 가지 예는 GraphQL로 작업하는 것이 얼마나 유연한지 명확하게 보여줍니다. 모든 클라이언트 측 애플리케이션은 요구 사항에 따라 스스로 업데이트할 수 있습니다. 한편, 서버 측 스키마 정의 및 구현은 동일하게 유지됩니다.
4. 결론
이 기사에서는 이름이 다른 graphQL 필드를 노출하는 두 가지 방법을 살펴보았습니다. 예제와 함께 별칭의 개념을 소개하고 이것이 올바른 접근 방법임을 설명했습니다.
항상 그렇듯이 이 기사의 예제 코드는 GitHub에서 사용할 수 있습니다 .