데이터 베이스에 접근할때 용도나 특성에 따라 내 입맛대로 요청을 할수 있는 API
Rest Api가 있는데 따로 Graphql을 쓸 필요가 있을까 라는 의문점이 있었는데 restapi에는 한계점이 존재한다고 보인다. 일단 가장 큰게 내가 원하는 데이터만 쏙 뽑아 올수 없다.
1. restapi는 해당 파라미터값에 들어있는 모든 데이터를 가져 오기때문에 불필요한 데이터를 처리해야 하는상황이 생김
2. 특정 데이터를 요청하기 위해서는 요청하는 파라미터를 추가적으로 넣어줘야한다
ex) localhost:3000/restapi/myteam/{id값} - (아이디값에 들어있는 데이터를 뽑아올때)
npm i graphql apollo-server
스키마는 개요, 구조, 형식 이라는 뜻을 가지고 있다.
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는 지정된 스키마를 호출해 주는 역할을 한다.
const resolvers = {
Query: {
teams: () => database.teams,
}
}
// 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
이렇게 지정을 했지만 원하는 데이터만 골라서 요청을 하면 해당 데이터만 응답을 받아 오는것을 확인 할수가 있다.