Web/spring-boot

[Spring] GraphQL 적용해보기(io.leangen.graphql)

부에나온다 2022. 6. 8. 14:12

1. GraphQL ?

  - GraphQL은 API를 만들 때 사용할 수 있는 쿼리언어이다. 그와 동시에 쿼리에 대한 데이터를 받을수 있는 런타임이기도 하다.

  - GraphQL은 선언형 데이터 feching 언어라고 흔히들 말하며, 그러므로 개발자는 무슨 데이터가 필요한지 요구사항만 작성하기만

     하면 되고 어떻게 가져올지는 신경쓰지 않아도 됩니다.

 

2. GraphQL vs REST API

  - REST API와 GraphQL API를 사용할 때 다른 이유는 REST API를 사용할 때 URL에서 바로 진행한다.

     URL을 통해 Json 파일을 얻어내고 그를 통해 비지니스 코드를 작성해서 프론트에서 처리한다.

GraphQL 이란 기존 굳건하게 지켜온 REST API를 대체할만한 수단이 될수도 있다.

post, get, patch 등등 url을 달리해야만 했던 Rest API와는 달리 endpoint가 하나인 그래프QL은 controller가 필요 없다는 점에서
기존 작성했던 방법보다는 확실히 생산성이 높은 편이다.

 

예를들어,

ex ) Rest API

/api/post

/api/post/:id

/api/post/:id/postinfo

/api/user

.

.

.

 

이런식으로 url을 계속 파고들고, 복잡해진다는 느낌이 있는데,

그래프QL 같은 경우 (defualt 값으로)

 

/graphql

 

이거 단 한개면 끝이다.

 

3. 구현해보기

  - 기존 GraphQL 을 적용할려면 graphqls라는 확장자로 스키마를 정의해야하는 번거로움이 있다.

post.graphql 예시

  - 그래서 찾아낸 것이 io.leangen.graphql 라이브러리로 Annotation을 사용하여 처리하는 방식이다.

  - 이렇게하면 기존의 RestAPI로 구현해놨던 방식에 Annotation만 선언하면 되므로 시간이 많이 걸리지 않는다.

의존성을 추가해면 따로 스키마와 Resolver를 구현하지않아도 GraphQL을 사용할 수 있다.

  - 하지만 단점으로는 Multipart를 이용한 파일 업로드 구현이 어렵다는 점이 있다.

 

  - @GraphqlApi로 Resolver 등록

@GraphqlApi 을 달아준 spring application  context의 모든 빈은 운영 소스로 간주되며 이 어노테이션은 빈 등록 어노테이션인@Bean, @Component, @Service, @Repository 등과 함께 사용 됩니다.

  - @GraphqlQuery(조회) 또는 @GraphqlMutation(생성,수정,삭제) 를 달아주면 기본적으로는 메소드 이름, 인자 이름으로 

     GraphQL 쿼리문에 매핑됩니다. 해당 메서드를 다른 쿼리문에 매핑시키려면 @GraphQLQuery, 

     @GraphQLArgument 에서 name 프로퍼티로 이름을 변경할 수 있습니다.

  - 클라이언트 부분

  - 클라이언트 부분에서 axios로 GraphQL을 호출해서 출력해봤다.

  - 호출하는 방식은 query에 GraphQL 방식으로 쿼리를 적어주면된다.

 

DB에 있는 데이터가 화면에 출력된 모습