-
GraphQL - GraphQL로 정보 주고받기Web 개발/Web 기본 지식 2023. 3. 23. 17:05
GraphQL로 정보 주고 받기
REST API는 어떤 라이브러리나 기술이 아니라 정보를 주고 받는 형식이다. 그래서 해당 형식에 따라서 여러 라이브러리들이 정보를 주고 받을수 있다.
위 화면은 Apllo라이브러리에서 제공하는 UI이다. 위 UI로 만들고 있는 GraphQL프로젝트에 여러 명령어들을 실행 할 수 있는 UI를 제공한다. REST API에서 사용되는 PostMan과 같은 기능을 한다고 생각하면 된다.
GraphQL 사용해 보기
teams정보 받아오기
query는 REST API에서 GET과 같은 것이다. 그 다음에 받아올 객체인 teams{ }을 입력하고 그 안에 team객체에서 받아오기를 원하는 모든 속성을 입력해준다. 일단 위 그림에서는 team에 존재하는 모든 속성을 입력한 다음에 재생 버튼을 눌러준다.
{ "data": { "teams": [ { "id": "1", "manager": "Mandy Warren", "office": "101A", "extension_number": "#5709", "mascot": "Panda", "cleaning_duty": "Monday", "project": "Hyperion" }, { "id": "2", "manager": "Stewart Grant", "office": "101B", "extension_number": "#4012", "mascot": "Tadpole", "cleaning_duty": "Tuesday", "project": "Zen" }, { "id": "3", "manager": "Smantha Wheatly", "office": "102A", "extension_number": "#3852", "mascot": "Falcon", "cleaning_duty": "Wednesday", "project": "Duranno" }, { "id": "4", "manager": "Francis Buckley", "office": "103B", "extension_number": "#1039", "mascot": "Beaver", "cleaning_duty": "Thursday", "project": "Genghis" }, { "id": "5", "manager": "Blake Smith", "office": "104A", "extension_number": "#7750", "mascot": "Wildcat", "cleaning_duty": "Friday", "project": "Acheron" } ] } }
그럼 위 JSON 형태로 모든 teams에 관련한 정보를 받아오는 것을 확인할 수 있다. 이는 REST API에서 teams에 해당하는 객체를 불러오는 것과 동일한 결과다.
teams의 필요한 정보만 받아오기
{ "data": { "teams": [ { "manager": "Mandy Warren", "office": "101A" }, { "manager": "Stewart Grant", "office": "101B" }, { "manager": "Smantha Wheatly", "office": "102A" }, { "manager": "Francis Buckley", "office": "103B" }, { "manager": "Blake Smith", "office": "104A" } ] } }
하지만 OverFetching의 문제를 해결하기위해 GraphQL의 특성을 활용하여 원하는 teams에서 원하는 속성인 manager와 office속성만을 불러온다.
teams를 id로 구분해서 특정 team만 받아오기
query { team(id:2) { id manager office } }
{ "data": { "team": { "id": "2", "manager": "Stewart Grant", "office": "101B" } } }
teams를 id로 구분한뒤에 해당 team에 속한 people(members)정보까지 받아오기
query { team(id:2) { manager office members { first_name last_name } } }
{ "data": { "team": { "manager": "Stewart Grant", "office": "101B", "members": [ { "first_name": "Alex", "last_name": "Davidson" }, { "first_name": "Page", "last_name": "Adams" }, { "first_name": "Dennis", "last_name": "Marshall" }, { "first_name": "Eleanor", "last_name": "Smith" }, { "first_name": "Zelda", "last_name": "Hall" }, { "first_name": "Brooke", "last_name": "Evans" }, { "first_name": "Victoria", "last_name": "Brown" }, { "first_name": "Nancy", "last_name": "Brooks" }, { "first_name": "Oliver", "last_name": "Simpson" }, { "first_name": "Simon", "last_name": "Henderson" } ] } } }
REST API에서는 teams와 people 두 계층의 정보를 한번에 받아올 수 없었지만 GraphQL에서는 team정보와 해당 team정보를 해당 query에 members들을 끼워 넣어서 보냄으로써 team이라는 계층과 people(members)이라는 계층의 정보를 한꺼번에 받아 올 수 있다.
팀 목록과 역할 목록 받아 오기
완전히 다른 정보들을 각자 요청해서 받아 올 수도 있다. 현재 프로젝트에는 teams정보들 뿐만 아니라 member들의 역할 즉 roles라는 데이터도 함께 있다. roles객체의 속성으로는 roles의 이름인 id와 해당 역활을 수행하기 위한 requirement가있다.
query { teams { manager office mascot } roles { id requirement } }
{ "data": { "teams": [ { "manager": "Mandy Warren", "office": "101A", "mascot": "Panda" }, { "manager": "Stewart Grant", "office": "101B", "mascot": "Tadpole" }, { "manager": "Smantha Wheatly", "office": "102A", "mascot": "Falcon" }, { "manager": "Francis Buckley", "office": "103B", "mascot": "Beaver" }, { "manager": "Blake Smith", "office": "104A", "mascot": "Wildcat" } ], "roles": [ { "id": "developer", "requirement": "computer science degree" }, { "id": "designer", "requirement": "graphic design certificate" }, { "id": "planner", "requirement": "portfolio" } ] } }
위 쿼리와 같이 요청하면 서로 다른 데이터 정보들이 평행으로 응답하는 것을 확인할 수 있다. 한번 요청에 여러 데이터을 함께 요청해서 받아 오는 것을 확인할 수있다. 이것으로 UnderFetching의 문제도 해결할 수 있다.
클라이언트에 필요한 정보만 요청하면서 그 요청이 여러번 반복 되지 안도록 할 수 있고, 이런 방식을 이용하면 네트워크를 통해 정보를 주고 받는 소프트웨어간에 데이터 낭비를 훨씬 줄일 수 있다.
그렇다면 GraphQL을 이용해서 정보를 넣을때는 어떻게 할까?
새팀추가
새로운 정보를 생성할 때는 mutation 명령어를 사용한다.
mutation request
mutation{ postTeam(input:{ manager: "John Smith" office:"104B" extension_number:"#9982" mascot:"Dragon" cleaning_duty:"Moday" project:"Lordearon" }){ manager office extension_number mascot cleaning_duty project } }
mutation response
{ "data": { "postTeam": { "manager": "John Smith", "office": "104B", "extension_number": "#9982", "mascot": "Dragon", "cleaning_duty": "Moday", "project": "Lordearon" } } }
데이터를 생성하는 것과 삭제하는 것도 mutation을 통해서 할 수 있다.
특정 번호의 팀 정보 수정
mutation{ editTeam(id: 2, input:{ manager: "Maruchi Han" office: "105A" extension_number: "2315" mascot: "Direwolf" cleaning_duty: "Wednesday" project: "Haemosu" }){ id, manager, office, extension_number, mascot, cleaning_duty, project } }
특정 번호의 팀 삭제
mutation{ deleteTeam(id: 3){ id, manager, office, extension_number, mascot, cleaning_duty, project } }
정리
GraphQL의 강점
1.필요한 정보들만 선택하여 받아올 수 있다.
- Overfetching 문제 해결
- 데이터 전송량 감소
2. 여러 계층의 정보들을 한 번에 받아올 수 있다.
- Underfetching 문제 해결
- 요청 횟수 감소
3. 하나의 endpoint에서 모든 요청을 처리
- 하나의 URI에서 POST로 모든 요청 가능
'Web 개발 > Web 기본 지식' 카테고리의 다른 글
OAuth2.0 - AccessToken, Role, Register (0) 2023.05.05 REPL란 무엇인가? (0) 2022.07.08 도커 와 마이크로 서비스 (0) 2022.04.29 JWT(JSON Web Token) (0) 2022.02.19 Web Server와 WAS의 차이 1 (0) 2022.01.17