Graphql_Apollo

Apollo - vue3์—์„œ apollo ์‚ฌ์šฉํ•˜๊ธฐ

eddie0329 2020. 12. 21. 00:11
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

  • Introduction
  • Installation
  • main.js
  • webpack gql file
  • apollo composable
  • Conclusion
  • Reference

๐Ÿ“Œ Introduction

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ apollo๋ฅผ vue3์— ํ•œ๋ฒˆ ์ ์šฉํ•ด๋ณด๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ Installation

npm install @apollo/client graphql react @vue/apollo-composable graphql-tag

์—ฌ๊ธฐ์„œ ์™œ ๊ฐ‘์ž๊ธฐ react๊ฐ€ ํŠ€์–ด๋‚˜์˜ค๋‚˜ ์‹ถ์œผ์‹œ๊ฒ ์ง€๋งŒ...๐Ÿ˜ญ ๋„ค react๋ฅผ ์„ค์น˜๋ฅผ ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. ํฌ์‘... apollo client์— ์•„๋งˆ.. react๊ฐ€ ์žˆ๊ณ .. ๋” ์ž์„ธํ•œ๊ฑด... ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ main.js

// main.js
import { createApp, provide, h } from 'vue'
import App from './App.vue'
import { ApolloClient, InMemoryCache } from '@apollo/client';
import { DefaultApolloClient } from '@vue/apollo-composable';
import store from './store'


const defaultClient = new ApolloClient({
  // ์„œ๋ฒ„์˜ uri๋ฅผ ์ง€์ •์„ ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  uri: 'https://rickandmortyapi.com/graphql/',
  cache: new InMemoryCache()
});

createApp({
  setup() {
    // provide๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ž์‹ component๋“ค๋„ Apollo์— ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    provide(DefaultApolloClient, defaultClient);
  },
  render() {
    return h(App);
  }
}).use(store).mount('#app')

๐Ÿ“Œ webpack gql file

graphql file์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” webpack ์„ค์ •์„ ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

module.exports = {
  chainWebpack: config => {
    config.module
      .rule('graphql')
      .test(/\.(graphql|gql)$/)
      .use('graphql-tag/loader')
      .loader('graphql-tag/loader')
      .end();
  }
}

๐Ÿ“Œ apollo composable

apollo-composable์„ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. useQuery์™€ useReuslt๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<script>
import { useQuery, useResult } from "@vue/apollo-composable";
import allCharacters from "./graphql/allCharacters.query.gql";

export default {
  name: "App",
  setup() {
    // result ๋ฟ ์•„๋‹ˆ๋ผ loading๊ณผ error๋„ ์žˆ์–ด์„œ ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•ด์š”. ๋” ๋งŽ์€ ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ ์ž์„ธํ•œ๊ฑด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ํ•ด์ฃผ์„ธ์š”.
    const { result, loading, error, refetch } = useQuery(
      allCharacters
    );
    // result๋ฅผ computed๋กœ ์น˜ํ™˜ ํ•ด์ฃผ๋Š” useResult ์ž…๋‹ˆ๋‹ค. ๋‘๋ฒˆ ์งธ ์ธ์ž๋กœ ๊ธฐ๋ณธ ๊ฐ’์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์–ด์š”.
    const characters = useResult(
      result,
      null,
      (data) => data.characters.results
    );

    return {
      result,
      loading,
      error,
      refetch,
      characters,
    };
  },
};
</script>

๐Ÿ“Œ Conclusion

์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ vue์—์„œ apollo๋ฅผ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์™œ ์ž๊พธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ž๊พธ gql์˜ ๋Œ€๋‹จํ•จ์„ ์ฐฌ์–‘ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ชฉ๋“ค์ด ์žˆ๋„ค์š”. ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•˜๊ณ  ์ข‹์€๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋Š” ๋ฌด์กฐ๊ฑด gql์„ ์‚ฌ์šฉํ• ๊ฑฐ ๊ฐ™์•„์š”. ์ข€๋” ์‚ฌ์šฉํ•ด๋ด์•ผ ํ•˜๊ฒ ์ง€๋งŒ rest๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”. ๊ทธ๋ฆฌ๊ณ  vuex๋ฅผ ์ด์ œ ๊ตณ์ด ์จ์•ผํ•˜๋Š”๊ฐ€? ๋ผ๋Š” ์˜๋ฌธ๋„ ๋งŽ์ด ๋“œ๋„ค์š”. ๋ฌผ๋ก  ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ๋Š” vuex๋ฅผ ๋ถ„๋ช… ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค์ด vuex๋ฅผ ๋Œ€์ฒด ํ• ์ˆ˜ ์žˆ์„๊ฑฐ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”. ๊ทธ๋Ÿผ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋‚˜์š” ์•ˆ๋…•~

๐Ÿ“Œ Reference

๋ฐ˜์‘ํ˜•