[NODEJS] Graphql-apollo

tmdwns1521·2022년 2월 28일
0
post-thumbnail

Graphql 이란?

데이터 베이스에 접근할때 용도나 특성에 따라 내 입맛대로 요청을 할수 있는 API

Rest API vs Graphql

Rest Api가 있는데 따로 Graphql을 쓸 필요가 있을까 라는 의문점이 있었는데 restapi에는 한계점이 존재한다고 보인다. 일단 가장 큰게 내가 원하는 데이터만 쏙 뽑아 올수 없다.
1. restapi는 해당 파라미터값에 들어있는 모든 데이터를 가져 오기때문에 불필요한 데이터를 처리해야 하는상황이 생김
2. 특정 데이터를 요청하기 위해서는 요청하는 파라미터를 추가적으로 넣어줘야한다
ex) localhost:3000/restapi/myteam/{id값} - (아이디값에 들어있는 데이터를 뽑아올때)

Graphql-apollo 사용

npm i graphql apollo-server

Graphql 스키마 지정

스키마는 개요, 구조, 형식 이라는 뜻을 가지고 있다.

const typeDefs = gql`
  // Team에 들어가는 데이터의 type들을 정의해준다.
  type Team {
    id: Int,
    manager: String,
    office: String,
    extension_number: String,
    mascot: String,
    cleaning_duty: String,
    project: String
  }
  // type Query에서 teams는 방금 지정한 Team타입을 배열로 지정해준다.
  type Query {
    teams: [Team]
  }
`;

데이터 정리

database.js

// convert-csv-to-json을 사용해서 csv데이터를 json형식으로 변환하고 database라는 Object에 값들을 넣어 주었다.


const csvToJson = require('convert-csv-to-json')

const database = {
  teams: [],
  people: [],
  roles: [],
  softwares: [],
  equipments: [],
  supplies: []
}
Object.keys(database).forEach((key) => {
  database[key] = [
    ...database[key], 
    ...csvToJson.fieldDelimiter(',')
      .getJsonFromCsv(`./data-in-csv/${key}.csv`)
  ]
  if (database[key].length > 0) {
    const firstItem = database[key][0];
    Object.keys(firstItem).forEach((itemKey) => {
      if (database[key].every((item) => {
        return /^-?\d+$/.test(item[itemKey])
      })) {
        database[key].forEach((item) => {
          item[itemKey] = Number(item[itemKey])
        })
      }
    })
  }
})

module.exports = database

resolvers 설정

// resolvers는 지정된 스키마를 호출해 주는 역할을 한다.
const resolvers = {
  Query: {
    teams: () => database.teams,
  }
}

apolloserver 설정

// apolloserver에 스키마와 resolvers를 받아서 실행을 해준다.
const server = new ApolloServer({ typeDefs, resolvers })
server.listen().then(({ url }) => {
console.log(`🚀  Server ready at ${url}`)

id: Int,
manager: String,
office: String,
extension_number: String,
mascot: String,
cleaning_duty: String,
project: String

이렇게 지정을 했지만 원하는 데이터만 골라서 요청을 하면 해당 데이터만 응답을 받아 오는것을 확인 할수가 있다.
profile
RECORD DEVELOPER

0개의 댓글