3. RESTFul API
Method Path Body 동작
GET /users 회원 목록 읽기
GET /users/:id 회원 정보 읽기
POST /users {"email": "hi@wani.kr", .. } 회원 정보 저장
PUT/PATCH /users/:id {"email": "hi@wani.kr", .. } 회원 정보 수정
DELETE /users/:id 회원 정보 삭제
4. RESTFul API
대부분의 프레임워크가 지원, 누구나 쉽게 도입 가능
RESTFul에서 모든 모델은 CRUD로 표현
OAS(Open Api Specification) 표준 존재
5. RESTFul API 예시 - Github API
Method Path 동작
GET /user 회원 정보 읽기
GET /user/repos 사용자의 저장소 조회
POST /user/repos 저장소 만들기
DELETE /repos/:owner/:repo 저장소 삭제하기
POST /repos/:owner/:repo/transfer 저장소 이동하기
developer.github.com/v3
15. 주요 라이브러리
서버
Apollo, GraphQL Yoga, Type GraphQL, Graphity
웹 클라이언트
apollo-client (react, vue, svelte!)
앱 클라이언트
apollo-ios, apollo-android (flutter는 공식라이브러리가 없는 듯..)
41. GraphQL - N + 1
SELECT * FROM `users`
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
...
query GetUser($id: ID!) {
userPagination {
id
friends {
id
}
}
}
목록조회 1번 + 친구조회 20번 = 21번
42. GraphQL - N + 1
SELECT * FROM `users`
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
...
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
...
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
SELECT * FROM `users` WHERE `friend_id` = ?
...
query GetUser($id: ID!) {
userPagination {
id
friends {
id
friends {
id
}
}
}
}
1 + 20 + 20 x 20 = 421번
43. GraphQL - N + 1
query GetUser($id: ID!) {
userPagination {
id
friends {
id
friends {
id
friends {
id
}
}
}
}
}
????!
44. GraphQL - N + 1
SELECT * FROM `users`
SELECT * FROM `users` WHERE `friend_id` IN (?, .. )
SELECT * FROM `users` WHERE `friend_id` IN (?, .. )
SELECT * FROM `users` WHERE `friend_id` IN (?, .. )
query GetUser($id: ID!) {
userPagination {
id
friends {
id
friends {
id
friends {
id
}
}
}
}
}
49. GraphQL - Subscription
type Query {
user(id: ID!): User
userPagination(take: Int, offset: Int): ListOfUser
}
type Mutation {
createUser(input: InputCreateUser!): User
updateUser(id: ID!, input: InputUpdateUser!): User
deleteUser(id: ID!): User
}
type Subscription {
onUserCreated: User
onUserUpdated(id: ID!): User
onDeleteUser(id: ID!): User
}
Event 발생시, 구독가능
50. GraphQL - Image Response
corgi.photos/300/200
Response는 application/json 로 고정, 위와 같은 image/png는 처리할 수 없음.
(비슷한 예로 엑셀 다운로드)
52. 요약
GraphQL은 RESTFul API의 대체제로 충분하다.
GraphQL Custom Scalar를 활용하면 추가적인 데이터 유효성검사 라이브러리가 필요없다.
Apollo iOS / Android를 사용하면 앱에서 GraphQL을 훨씬 쉽게 사용할 수 있다.
1+N 문제는 생각보다 쉽게 해결가능하다.
GraphQL에서 파일업로드가 가능하다.
Subscription 활용을 활용하면 채팅 같은 서비스를 만들 수 있다.
이미지 Response는 URL로 사용하자.