57
이이이 이이이 REST 이이 GraphQL 이 Relay 이 이이이이

[112]rest에서 graph ql과 relay로 갈아타기 이정우

Embed Size (px)

Citation preview

Page 1: [112]rest에서 graph ql과 relay로 갈아타기 이정우

이정우에디켓

REST 에서GraphQL 과 Relay 로갈아타기

Page 2: [112]rest에서 graph ql과 relay로 갈아타기 이정우

목차1. REST API - Status Quo & Limitations2. GraphQL - How it replaces REST3. Relay - Data fetching and management

Page 3: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1.REST API

Page 4: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 소개리소스를 URI 로 표현GET, POST, PUT, DELETE 활용웹 개발 아키텍처

Page 5: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 소개GET /api/users/ 유저 리스트 가져오기GET /api/users/1/ 유저 1 을 가져오기POST /api/users/ 유저 생성하기PUT /api/users/1/ 유저 1 를 수정하기DELETE /api/users/1/ 유저 1 를 삭제하기

예제

Page 6: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 현황GET /api/users/ 를 했으면 결과 값은 어떻게 돌려줘야하나 ?HTTP Response

Page 7: [112]rest에서 graph ql과 relay로 갈아타기 이정우

https://api.twitter.com/1.1/lists/members.json

1. REST API 현황Twitter 방식

https://dev.twitter.com/rest/reference/get/lists/members

Page 8: [112]rest에서 graph ql과 relay로 갈아타기 이정우

https://api.github.com/repos/octocat/Hello-World/issues/

1. REST API 현황Github 방식

https://developer.github.com/v3/issues/

Page 9: [112]rest에서 graph ql과 relay로 갈아타기 이정우

https://openapi.naver.com/blog/listCategory.json

1. REST API 현황Naver 방식

https://developers.naver.com/docs/blog/post

Page 10: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 현황사실상 각자 제멋대로…추가 함수는 ? POST Response? 필터는 ? 정렬은 ? 페이지네이션은 ?

Page 11: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 현황그래도 그나마 쓸만한…

http://jsonapi.org/

Page 12: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 현황• Relationship 가져오기 ? ✓• 부분 필드만 가져오기 ? ✓• 필터 적용방법 ? ✓• 정렬하기 ? ✓• 페이지네이션 ? ✓• POST Response? ✓• 깃허브에 별 갯수 ? ✓

Page 13: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계필드 제한 (Sparse Fieldset)

Page 14: [112]rest에서 graph ql과 relay로 갈아타기 이정우

모든 필드 전부다 가져와야 하나 ?접근 권한이 없는 필드는 가져오지 말아야 하나 ?Admin 과 일반 유저가 기본적으로 가져오는 필드가 다르나 ?

1. REST API 한계필드 제한 (Sparse Fieldset)

Page 15: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계

유저 1 의 모든 필드를 가져오고 싶지만그가 팔로우하는 유저들의 username, email 만 가져오고 싶은데…결과 : 모든 유저의 username 과 email 을 가져옴

필드 제한 (Sparse Fieldset)

Page 16: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계필드 타입

Page 17: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계POST /payments/ 를 하니 유저 1 의 credit 이 변경되었다 .그런데 클라이언트에서 이미 유저 1 를 불러왔으며 credit 값이 아직 동기화 되지 않았다 .- POST Response 에 만들어진 payment 와 같이 변경된 유저도 가져오기 ?- GET /users/1/ 로 한번 더 불러오기 ?

Side Effect

Page 18: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계실제사례 :- 요청의 저자 , 예약 , 예약한 에디터 , 교정본 , 교정본 에디터 , 그리고 교정본 리뷰를 가져오기- 더불어 각자 필드마다 가져올 수 있는 필드 제한하기GET /drafts/?include=author,reservation.editor,revision.editor,revision.review&fields[draft]=category,title,content,message,word_count,time_limit,point,status,created_at&fields[user]=picture_url,profile_path,username,is_following,is_blocking,college,workplace

Query Hell

Page 19: [112]rest에서 graph ql과 relay로 갈아타기 이정우

1. REST API 한계• RESTful 과 JSON API 는 프로토콜이지 쓸만한 라이브러리가 없다 .• 결국 직접 구현해서 사용 ... jsonapi.js• 서버의 모든 endpoint 에서 JSON API 에 맞게 답변을 해줘야한다 .• 클라이언트에서도 데이터를 받아서 Store 에 보관해야한다 .• 비즈니스 로직 짜기도 바쁜데 라이브러리 관리까지 ??

라이브러리 부족

Page 20: [112]rest에서 graph ql과 relay로 갈아타기 이정우
Page 21: [112]rest에서 graph ql과 relay로 갈아타기 이정우

React (2013) GraphQL (2015)

Page 22: [112]rest에서 graph ql과 relay로 갈아타기 이정우

JS 와 HTML 를 합쳐버림 REST 를 대체해버림

Page 23: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2.GraphQL

Page 24: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 소개쿼리 언어

쿼리를 부르면 Data 가 json으로

Page 25: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 소개쿼리 언어- Arguments- Alias- Fragment- Variables

자세한 설명은 공식 문서 참조

Page 26: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. REST 와 GraphQL 비교하기Different RequestREST 의 URI 는 GraphQL 쿼리로좀 더 간결하게 표현 가능

Page 27: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. REST 와 GraphQL 비교하기GET /drafts/?include=author,reservation.editor,revision.editor,revision.review&fields[draft]=category,title,content,message,word_count,time_limit,point,status,created_at&fields[user]=picture_url,profile_path,username,is_following,is_blocking,college,workplace

Page 28: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. REST 와 GraphQL 비교하기

Page 29: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. REST 와 GraphQL 비교하기Different MethodsGET → QueryPOST, PUT, DELETE → Mutation

Page 30: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제Schema Definition

Type System 으로 Schema 를 정의query 와 mutation 은 entry

point

Page 31: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제GraphQLObjectType

GraphQLObjectType 의 fields 를 정의

필드엔 type, args, resolve

Page 32: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제Arguments & Resolve method

userType 을 정의하고 필드의 타입을 userType 으로 정의함

Page 33: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제Mutation

Mutation 또한 args 와 resolve 사용

Page 34: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제Express-GraphQL

schema 를 express 서버에달아두면 완료 !

Page 35: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제Lokka - GraphQL client

Page 36: [112]rest에서 graph ql과 relay로 갈아타기 이정우

2. GraphQL 구현 예제GraphiQL자동 문서화와 Type Inspection이 가능한 강력한 툴

Page 37: [112]rest에서 graph ql과 relay로 갈아타기 이정우

React (2013) GraphQL (2015) Relay (2015)

Page 38: [112]rest에서 graph ql과 relay로 갈아타기 이정우
Page 39: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3.Relay

Page 40: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Relay

• Node• Connection• React Relay• Mutation Config

Relay 가 GraphQL 에서 확장하는 컨셉

Page 41: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Relay 소개Resource 에 대한 단일 InterfaceData management 면에서 유리함 .

Node

Page 42: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Relay 소개id 로 Resource 를 가져옴Node

Page 43: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Relay 소개하지만 String 만으로는 어떤 Resource 인지 알기 힘들어서type 과 id 가 합쳐진 GlobalId 를 사용

Node

Page 44: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Relay 소개다수의 Node 를 가져올때 사용pagination 에 특화되있음Connection

Page 45: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

데이터 의존성과 React 컴포넌트가 공존한다

Page 46: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

<EditorCard /><EditorInfo /><EditorStat />

Page 47: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

Page 48: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

<EditorCard />

<EditorInfo />

<EditorStat />

Page 49: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

Page 50: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. React Relay

Page 51: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. Mutation in Relay

Mutation 의 Side Effect 를적용시키는 방식을 Config 에 명시하면클라이언트에 적절하게 반영예제 ) 이미 불러온 Node 의 값을 업데이트기존에 불러온 Connection 에 추가 / 제거

Mutation Config

Page 52: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. REST 에서 GraphQL Relay 로 갈아타기GET, POST, PUT, DELETE 으로 모든 것을 해결해야 함→ 데이터 가져올땐 query (node, connections, 등 ) 사용 , 변경할땐 mutation 사용기본값으로 어떤걸 불러올지 정하기가 애매함→ 항상 데이터 의존성을 명시필드 타입이 정해져 있지 않아서 따로 문서화를 하지 않으면 협업이 힘듬→ GraphQL 은 타입이 정해져 있고 프로토콜 단에서 확인할 수 있음 (Introspection)

Summary

Page 53: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. REST 에서 GraphQL Relay 로 갈아타기데이터 의존성을 URI 에 명세하려면 복잡해진다 .→ 데이터 의존성을 명세한 query / mutation 를 보낸다데이터 변경사항을 클라이언트에서 처리하는 방식이 제각각→ Mutation Config 만 잘 써주면 알아서 데이터 변경사항을 처리한다

Summary

Page 54: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. REST 에서 GraphQL Relay 로 갈아타기Data management 를 React 와 묶어줘서 생산성과 개발 속도가 크게 향상Query build + Cache 로 인하여 성능 향상지금 존재하는 온라인 문서만으로는 Relay 의 진입장벽은 꽤 높은 편현재 Relay 는 실시간 지원이 미비…현재 GraphQL Relay 만으론 안정적인 서비스 구현이 가능… 하지만 아직 실험적인 생태계

Aftermath

Page 55: [112]rest에서 graph ql과 relay로 갈아타기 이정우

3. 관련 링크관련 링크http://graphql.org/ - GraphQL 영문 공식 홈페이지https://facebook.github.io/relay/ - GraphQL Relay 영문 공식 홈페이지https://facebook.github.io/graphql/ - GraphQL 영문 명세서https://learngraphql.com/ - GraphQL 영문 튜토리얼https://github.com/chentsulin/awesome-graphql - GraphQL 리소스 모음집https://github.com/kriasoft/react-starter-kit - 현재 최강의 boilerplatehttp://blog.sapzil.org/2015/09/01/graphql-rfc/ - 그나마 찾은 한글 기사

Page 56: [112]rest에서 graph ql과 relay로 갈아타기 이정우

Q&A

Page 57: [112]rest에서 graph ql과 relay로 갈아타기 이정우

Thank You

이정우 ( 연사자 ): [email protected]이철희 ( 기술 제공 ): [email protected]