Network/GraphQL

[GraphQL] 9. GraphQL fragment 사용해 query의 중복 제거하기

반응형

GraphQL의 fragment 

앞선 글들에서 사용되었던 방법으로는 GraphQL의 특정 블록들을 여러 번 재사용해야 하는 블록의 경우 매번 중복해서 써야한다. 예를 들어 다음 두개 Query들이 있다고 해보자. 

 

query QueryFilm1 {
  film(filmID: 1) {
    title
    director
    producers
  }
}

query QueryFilm2 {
  film(filmID: 2) {
    title
    director
    producers
  }
}

 

위 쿼리들에서는 title, director, producers들이 중복해서 사용된다. 이 필드들을 하나로 묶어 하나의 필드처럼 쓸 수 있다면 중복을 줄일 수 있을 것이다. GraphQL의 fragment가 바로 이 역할을 한다. GraphQL의 fragment는 중복되는 블록을 묶어 중복을 줄이기 위해 사용된다.

 

위의 코드는 fragment를 사용하면 다음과 같이 title, director, producer을 filmField라는 fragment로 묶을 수 있다.

 

query QueryFilm1 {
  film(filmID: 1) {
    ...filmFields
  }
}

query QueryFilm2 {
  film(filmID: 2) {
    ...filmFields
  }
}

fragment filmFields on Film {
  title
  director
  producers
}

 

위 코드를 실행하면 [그림1]과 같은 결과가 나오며, 같은 블록을 쓰는 코드들이 많아지면 많아질 수록 fragment의 성능은 강력해진다.

 

그림1. fragment 사용하기

 

 

fragment의 구성

fragment는 fragment의 명칭, fragment가 포함될 수 있는 객체, 그리고 필드들로 이루어진다. [그림2]에서 fragment의 명칭은 filmFields이며,  fragment가 포함될 수 있는 객체는 Film이고, 필드들은 title, director, producers이다. 

 

그림2. fragment의 구성

 

fragment의 필드들은 fragment가 포함될 수 있는 객체의 필드들만 선언될 수 있다. 따라서 Film 객체의 필드들만 [그림2]의 filmFields fragment에 포함될 수 있다. 따라서 title, director, producers 세개 필드들은 Film에 포함된 필드들이다.

 

 

fragment의 사용

선언된 fragment는 "..."이 앞에 붙어 전개된다. ...이 붙은 fragment는 fragment 필드 그대로 펼쳐진다(전개된다). 따라서 아래 코드의 두 개의 QueryFilm1은 같은 query이다. 

query QueryFilm1 {
  film(filmID: 1) {
    ...filmFields
  }
}

fragment filmFields on Film {
  title
  director
  producers
}

query QueryFilm1 {
  film(filmID: 1) {
    title
    director
    producers
  }
}

 

fragment의 의의

fragment는 필드들을 모은 하나의 단위이다. 우리는 보통 프로그래밍에서 이 단위를 객체라 한다. 즉, fragment는 그 자체로 객체가 되며, 의미있는 데이터들을 모은 단위가 된다. fragment를 잘 사용하면 재사용이 가능해지며 클라이언트에서 사용 시 fragment 별로 UI를 그리는 작업을 하거나 테스트를 하는 것이 용이해진다. 무엇보다. fragment가 이름을 가지고 있기 때문에 가독성이 매우 올라간다. 가독성이 올라가는 것은 결국 유지보수성이 뛰어남을 뜻한다. 이러한 장점들을 볼 때 GraphQL에서 fragment는 아주 중요한 부분을 차지함을 알 수 있다.

 

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.