좀... 많이 깁니다.
작업하신 것을 보았더니 GraphQL을 사용하셨는데 이유가 있을까요?
REST API와의 차이는 무엇인가요?
무언가를 사용하는데, 모르면서 사용하는 것은 아니라고 생각을 하기에
이번에 알고 있는 것을 정리하기 위하여 적어보는 포스트다.
그리고 난 그래프큐엘이 너무좋다(....)
Application Programming Interface의 약자로 기존에 있는 응용 프로그램을 통해서 데이터를 제공받거나 기능을 사용할 때 사용하는 인터페이스 및 규격을 말한다.
솔직히 무슨 말인지 일반인의 입장에서는 뭔 말인지 모르겠다고 생각한다.
내가 개발공부를 하기 시작하면서 계속해서 나왔던 API는 도무지 이해가 가지 않았기 때문이다.
아주 쉽게 풀어서 설명을 하면 아래와 같은 것이 API다.
위의 설명처럼 입력과 출력이 존재하는 것을 API
라고 생각하면 된다.
REST(REpresentational State Transfer)는 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다.
다음 대주제에서 REST API를 다루게 되겠지만 위의 설명을 조금 더 구체적으로 설명해보면
HTTP URI(Uniform Resource Identifier)을 통하여 자원을 명시하고,
HTTP Method(POST, GET, PUT, DELETE)를 통하여 자원에 대한 행위를 정한다고 볼 수 있다.
이게 무슨 소리에요 선생님 이해가 하나도 안가요
이해를 돕기 위하여 REST API의 예시를 보도록 하자.
GET은 가져온다
의 뜻을 가지고 있다보니 조회
를 할 경우에 사용
한다./users/yukina1418
은 users들
중에서 yukina1418
를 뜻한다.즉 user들 중 yukina1418을 조회하고 싶다. 의미를 가지게 된다.
이제 REST의 특징을 한번 살펴보고 본격적으로 REST API를 알아보도록 하자.
수많은 장점이 존재하기에 사실상 모두가 REST를 사용하고 있다.
하지만 단점과 한계도 분명 존재하는데, 이 부분에 대해서는 GraphQL에서 다룰 예정이다.
REST API란 REST 기반으로 API를 구현한 것을 이야기한다.
사실상 90% 이상이 활용하고 있다고 생각해도 된다고 생각하고
워낙 자리를 잡은지 오래되었기 때문에 OpenAPI(정부, 회사 등에서 누구나 사용할 수 있게 공개된 API)들이 대부분 REST API로 구성이 되어있다.
그리고 REST API는 설계의 규칙들이 존재한다.
이렇게 안만들어도 상관은 없는데 한소리 듣기 딱 좋다(...)
그리고 잘 지켜내서 만들어낸 REST API를 RESTful
하다고 많이 표현한다.
작업을 계속 하다보면 이 모든 것을 지키면서 개발하는 것은 어렵다.
하지만 지키지 않을 경우에는 복잡도가 상승하여 문제가 발생하게 된다.
이러한 것을 극복하기 위해서 나타난 GraphQL에 대해서 알아보고, 두개의 차이점을 확인해보자.
빠른 속도로 수많은 데이터를 주로 핸드폰 사용자가 많았던 페이스북에서는 앱의 복잡성이 늘어남에 따라서 REST API를 사용한 방식의 문제에 직면하게 됐다.
REST API에는 무슨 문제가 있었을까?
페이스북은 이러한 문제를 해결하기 위하여 GraphQL을 만들게 되었다.
없으면 내가 만들면 되는건데 마인드...?
2012년도에 페이스북 개발자들이 개발하여 2015년에 공개적으로 발표한 쿼리언어다.
REST를 대체할 수 있고, 장점이 상당히 많아서 최근 사용자가 늘어나고 있는 추세다.
공식 홈페이지 : https://graphql-kr.github.io/
위의 REST API의 문제점을 개선하려고 노력한 것이 바로 그래프큐엘이다.
어떤식으로 해결이 되었는지 하나하나 짚어가면서 설명을 해보려고 한다.
수많은 엔드포인트로 나눠져있던 것들은 한개로 합쳐져서 편리하게 사용할 수 있게 되며
REST API의 GET은 Query로 POST PUT DELETE는 Mutation으로 두가지로 사용할 수 있다.
3가지의 메소드가 뮤테이션으로 통합되다보니 어떤 API인지 확인을 하기위하여 API 앞단에
fetch,create,update,delete 뒤에 자원의 이름을 붙여서 사용하는 편이다.
Query라는 타입으로 조회를 게시판들을 조회하는 API의 코드
Mutation이라는 타입으로 게시글을 생성하는 API의 코드
RestAPI
는 axios
를 사용하여 API를 통신하고
스웨거같은 툴을 사용하여 손수 API Docs를 만들어야하는 Schema First의 RestAPI와는 다르게
(포스트맨이라거나 다양한 것들을 활용하여 자동으로 API Docs가 만들어지긴 하는 것 같다.)
GraphQL
은 Apollo Clinet / Server
을 사용하여 API를 통신하고
Code First를 적용시켜 작업한 api에 대한 명세를 자동으로 갱신시킨 후
플레이그라운드라는 IDE에서 API를 사용해볼 수도 있고,
API에 대한 세부적인 명세를 확인할 수 있다.
실제로 사용하고 API에 대한 명세를 볼 수 있는 플레이그라운드
API를 호출하였을 경우에 모든 것을 가져오는 Rest API와는 다르게 그래프큐엘은 원하는 것만 골라서 가져올 수 있다.
팀 프로젝트에서 권한 분기를 위해 사용하는 API
해당 API는 메인 페이지의 헤더에 프로필사진과 닉네임을 띄워주기 위해서 사용하고 있다.
저렇게 수많은 리턴값 중에서 단 2개만
을 사용하는데, RestAPI를 사용한다면 Over-Fetching의 문제가 발생할 것이다.
하.지.만 GraphQL의 경우에는 필요한 것만 골라서 받아올 수 있다.
front에서 해당 api를 사용하는 코드
위의 코드처럼 필요한 것만 정해서 받을 수 있기에 한개의 API로 다양하게 활용할 수 있다.
이것은 공식 홈페이지에 있는 움짤인데 한눈에 설명을 할 수 있다고 생각한다.
Luke의 친구들을 모두 불러오는 것을 확인할 수 있는 움짤
이렇게 많은 문제점을 해결하였기 때문에 최근 GraphQL을 활용한 프로젝트들이 상당히 많이 늘어나고 있는 것으로 확인된다.
하지만 완벽한 것은 아니다(....)
단점으로는 몇가지가 존재하는데 겪은 것에 대해서는 이정도가 있는 것 같다.
파일 업로드
지속적으로 성장하고 있다보니 계속해서 생겨나고 있는 생태계라서 완벽하지 않은데
제일 아쉬운 것은 파일 업로드다.
자체적으로는 돌아갈 수가 없어서 graphql-upload
라는 사용하고 있는데 이런저런 충돌 문제가 발생하고 있다.
Front단이 조금 괴롭다.
클라이언트가 직접 필요한 데이터를 스스로 결정해서 받아와야하는데
이 부분에서 문법상의 문제로 오류가 자주 발생하여 딜레이된 경험이 있었다.
정형화되어있는 요청을 만들기 힘들다.
경험이 적어서 그런 것인지는 모르겠는데
이번에 IP를 활용하여 화이트리스트를 만들다보니 GraphQL을 활용해서 링크만 누르는 것으로 api가 작동되게 어떻게 해야할지 영 감이 잡히지 않았다.
적은 것 이외에는 너무 좋다고 생각한다.
자세한 사용법에 대해서는 적을 수 없기에 글을 이정도로 마무리하겠지만, GraphQL 한번 써보시겠습니까?
끝.
많이 참고하고 보면 좋은 사이트 => https://buddy.works/tutorials/what-is-graphql-and-why-facebook-felt-the-need-to-build-it