Apollo๋ Client, Sever ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์บ์ฑ ๋ฐ ์ฟผ๋ฆฌ ๋ถ์๋๊ตฌ๋ฅผ ์ ๊ณต
REST API๋ Redux๋ฅผ ๋์ฒดํ๋ GraphQL / Apollo
graphql์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ํ๊ด๋ฆฌ ํ๋ซํผ. ํด๋ผ์ด์ธํธ์์ graphql์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ UI๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
yarn install apollo-boost react-apollo graphql
apollo-boost
: Apollo Client๋ฅผ ์ค์ ํ๋๋ฐ ํ์ํ ๊ฒ์ด ๋ค์ด์๋ ํจํค์งreact-apollo
: React๋ฅผ ์ํ apollographql
: GraphQL ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.import { ApolloConsumer } from 'react-apollo';
- apollo-client์ cache state๋ฅผ ์ฌ์ฉ / client์ cache๋ฅผ ์ฝ์ด์ค๊ณ ์ ๋ฐ์ดํธ ํ ์ ์๋ค. apollo cache๋ ์ฑ์ด query, mutation์ผ๋ก ๋คํธ์ํนํ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ์บ์ฌ์ ๊ธฐ๋กํ๋ค.
- apollo client์์ ๋ก์ปฌ resolver๋ฅผ ์์ฑํ์ฌ mutation์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ๋ฅผ ๊ถ์ฅ
resolver : ๊ฐ ์ฟผ๋ฆฌ ํ๋์ ๋ํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋ด๊ณ ์๋ ํจ์
Redux์ Universal Router ์ฌ์ฉ์ SSR ํ๋ก์ธ์ค
Redux ๊ธฐ๋ฐ์ ์๋น์ค์์๋ Universal Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ผ์ฐํฐ๋ก ์ฌ์ฉํด SSR์ ์คํํ๋ ์ฌ๋ก๊ฐ ๋ง๋ค. ๋ค์์ Redux์ Universal Router๋ฅผ ์ฌ์ฉํ SSR์ ํ๋ก์ธ์ค๋ฅผ ๋ํ๋ธ ๋์
Redux์ Universal Router๋ฅผ ์ฌ์ฉํ SSR ์์
- Universal Router๊ฐ ๋ ๋๋ง๋ ๋ผ์ฐํ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๊ณ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ๊ฐ์ ธ์จ ๋ฆฌ์์ค๋ฅผ ์คํ ์ด์ ์ ์ฅํ๋ค.
- ๋ฆฌ์์ค๊ฐ ์ ์ฅ๋ ์คํ ์ด์ ํ์ํ ์ถ๊ฐ ๋ฆฌ์์ค๋ฅผ React ์ปดํฌ๋ํธ์ prop์ ์ ๋ฌํ๋ค.
- React ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๊ฒฐ๊ณผ๋ฅผ HTML ์ฝ๋๋ก ๋ฐํํ๋ค.
- ์๋ฒ์์ ๋ฐ์ HTML ์ฝ๋๋ก ํด๋ผ์ด์ธํธ ๋ ๋๋ง์ ์คํํ๋ค.
๋จ์
- ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง๊ณผ API๋ฅผ ๋ผ์ฐํ ๊ฒฝ๋ก๋ง๋ค ๊ตฌํํด์ผ ํ๋ค.
- Redux์ ์คํ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ก์ ๊ณผ ๋ฆฌ๋์๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ๋ ๋๋ง ์ ์ฐจ๊ฐ ๋ณต์กํ๋ค.
- ๋ ๋๋ง์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๋ฐ์ ๋๊น์ง ๋ ๋๋ง์ ์คํํ ์ ์๋ค.
Apollo์ React Router v4 ์ฌ์ฉ์ SSR ํ๋ก์ธ์ค
์์
- React Router v4์์ ๋ผ์ฐํ ๊ฒฝ๋ก์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
- ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ Apollo Client๋ฅผ ํตํด ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ฐ์ ํ HTML ์ฝ๋๋ก ๋ณํํ๋ค.
- ์๋ฒ์์ ๋ฐ์ HTML ์ฝ๋๋ก ํด๋ผ์ด์ธํธ ๋ ๋๋ง์ ์คํํ๋ค.
์ฅ์
- ๋ผ์ฐํ ๊ฒฝ๋ก์ ์๊ด์์ด ์ปดํฌ๋ํธ๋ณ๋ก ํ์ํ ๋ฆฌ์์ค๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ปดํฌ๋ํธ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ๋ ๋๋ง๋ง ์คํํ๊ณ , ํด๋ผ์ด์ธํธ ๋ ๋๋ง์ ์คํํ ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ ์ ์๋ค.
- ๋ผ์ฐํ ๊ฒฝ๋ก์ ์์กด์ฑ์ด ์ฌ๋ผ์ ธ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ์ ๊ฐ๋ฐ์ด ์ฉ์ดํด์ง๋ค.
- ๋ด๋ถ์ ๋ถ๊ธฐ๊ฐ ์๋ ํ๋์ ๋ผ์ฐํฐ ์ฝ๋๋ก ํด๋ผ์ด์ธํธ ๋ ๋๋ง๊ณผ ์๋ฒ ๋ ๋๋ง์ ์คํํ ์ ์๋ค.
- ๋ณ๋์ ์ก์ ๊ณผ ๋ฆฌ๋์๊ฐ ์์ด๋ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋ค.
: Apollo Client ์์ฒด์๋ ์ ์ฅ์(store)๊ฐ ์์ด์ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ ์ฅํ๊ณ Apollo Client์ readQuery ๋ฉ์๋๋ฅผ ํธ์ถํด ์บ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
GraphQL๊ณผ Apollo์ ๋จ์
Content-Type
์์ฒญ ํค๋์ MIME ํ์
์ application/graphql
๋ก ์ค์ ํด์ ์ฌ์ฉํด์ผ ํ๋ค. ์๋ฒ์์๋ GraphQL ํ์ฑ์ ์ง์ํ๋ body-parser-graphql๊ณผ ๊ฐ์ ํ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ application/json
์ผ๋ก ์ค์ ํด์ ์ฌ์ฉํ๋ฉด ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.dataIdFromObject
์ต์
์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ์ ๋์ํ ์ ์๋ค.[์ฐธ๊ณ ๋ฌธ์] : ๋ค์ด๋ฒD2
cache, pragment / client state / redux ๋์ฒด?