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에서 사용할 수 있습니다 .

Generic footer banner