일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- C
- 배열
- 자바스크립트
- Machine Learning
- GraphQL
- RxJS
- 프로그래머스
- 컨테이너
- cors
- RT scheduling
- 이진탐색
- 연결리스트
- 큐
- APOLLO
- 연결 리스트
- 브라우저
- 스택
- 알고리즘
- vue3
- alexnet
- 프로세스
- 자료구조
- 릿코드
- 코딩테스트
- pytorch
- 웹팩
- 타입스크립트
- 프론트엔드
- 포인터
- 해시테이블
- Today
- Total
프린세스 다이어리
[GraphQL] 2. GraphQL 형식으로 정보 주고받는 방법 정리 본문
1. GraphQL 형식 정리
(1) query
RestAPI로 따지면 get 같은 역할을 하는 게 GraphQL에서는 query다. 모든 팀의 정보 전체를 받아오기 위해 다음과 같이 쿼리를 날릴 수 있다.
query {
teams {
id
manager
office
extension_number
mascot
cleaning_duty
project
}
}
여기에서 manager와 office 정보만 받아오고 싶다면 이렇게 teams를 요청하면 된다.
query {
teams {
manager
office
}
}
그리고 id가 2인 팀을 받고 싶다면 team(id: 2)로 요청한다.
query {
team(id: 2) {
manager
office
}
}
이렇게 GraphQL에서는 query를 통해 간단히 원하는 정보만 걸러서 요청하고 받아올 수 있다.
팀의 정보와 인원의 정보를 한꺼번에 필요로 할 때, RestAPI를 이용할 때 team과 people은 다른 api로 받아와야 했다. 그러나 GraphQL에서는 그냥 팀에 대한 쿼리에 members를 같이 끼워 넣으면 된다.
query {
team(id: 2) {
manager
office
members {
team
first_name
}
}
}
이로서 team이라는 계층과 people이라는 정보를 한꺼번에 받아올 수 있는 것이다. 여기서 왜 people이 아니라 members냐 하면 typedefs로 members라는 키로 people을 조회하도록 설정했기 때문이다.
const typeDefs = gql`
type Team {
id: ID!
manager: String!
office: String
extension_number: String
mascot: String,
cleaning_duty: String!
project: String
members: [People]
}
}
`
const resolvers = {
Query: {
teams: (parent, args) => dbWorks.getTeams(args),
team: (parent, args) => dbWorks.getTeams(args)[0],
},
}
다시 이제 team(id: 1)이 아니라, 모든 팀에 대한 정보를 받아오기 위해선 teams로 쿼리를 날리면 된다.
query {
teams {
manager
office
members {
team
first_name
}
}
}
한편 현재 디비에는 roles라는 데이터도 있다. 아까 요청했던 teams와 roles을 같이 받아오고 싶다면 다음과 같이 둘 다 쓰면 된다.
query {
teams {
manager
project
}
roles {
id
job
}
}
이런 식으로 하면 overfetching, underfetching 모두 해결이 된다.
(2) mutation
GraphQL로 디비에 정보를 바꿀 때는 query가 아니라 mutation으로 요청한다. POST, PUT, DELETE가 모두 Mutation이다. postTeam이라는 명령어에 새 정보를 실어보내려면 다음과 같이 작성하면 된다.
mutation {
postTeam (input: {
manager: "John Smith"
office: "104B"
extension_number: "#9982"
mascot: "Dragon"
cleaning_duty: "Monday"
project: "Lordaeron"
}) {
manager
office
extension_number
mascot
cleaning_duty
project
}
}
그리고 다시 query로 팀을 요청해 보면 추가한 팀까지 조회되는 것을 알 수 있다. postTeam이라는 명령어를 사용할 수 있는 이유는 teams.js에 postTeam 명령어와 기능을 미리 정해놨기 때문이다.
const resolvers = {
Mutation: {
postTeam: (parent, args) => dbWorks.postTeam(args),
editTeam: (parent, args) => dbWorks.editTeam(args),
deleteTeam: (parent, args) => dbWorks.deleteItem('teams', args)
}
}
팀 정보를 수정하거나 삭제할 때에도 Mutaion 하위에 미리 정의한 명령어를 활용하면 된다.
2. GraphQL의 장점
(1) 필요한 정보들만 선택하여 받아올 수 있다.
- overfetching 문제 해결
- 데이터 전송량 감소
(2) 여러 계층의 정보들을 한 번에 받아올 수 있음
- underfetching 문제 해결
- 요청 횟수 감소
rest api를 사용하는 서비스에서도 기술적으로 위와 같은 해결 방법이 없는 것은 아니다. 그러나 rest api에 정해진 원칙을 지켜야 하기 때문에 데이터의 소통을 설계하는 데 있어서 제약이 생긴다. GraphQL은 이처럼 다른 형식을 사용하기 때문에 이와 같은 해결책이 가능한 것이다.
(3) 하나의 endpoint에서 모든 요청을 처리
- 하나의 URI에서 POST로 모든 요청 가능.
대신에 어떤 명령어로 어떤 요청을 할지 쿼리를 날리는 쪽에게 문서로 전달해야 한다.
서비스가 어떤 데이터를 어떻게 주고받냐에 따라서 rest api가 더 적합할 때가 있다. 둘의 차이를 이해해야 효율적으로 설계할 수 있을 것이다.
'GraphQL' 카테고리의 다른 글
[GraphQL] 6. Mutation 쿼리 짜는 기본 코드 설명 (0) | 2021.11.24 |
---|---|
[GraphQL] 5. Query 구현하는 기본 코드 설명 (0) | 2021.11.23 |
[GraphQL] 4. apollo-server 설치, 기본 실행 코드 설명 (0) | 2021.11.22 |
[GraphQL] 3. Apollo가 무엇이고 왜 쓰는지 (0) | 2021.11.21 |
[GraphQL] 1. RestAPI의 특징과 한계, GraphQL이 등장한 배경 (0) | 2021.11.20 |