우리가 express 프레임워크를 사용할때 기본적인 directroy를 정해져있는 형태를 준수하면서 구성해야하듯, graphQL도 기본적인 골격(structure)을 먼저 구성할 필요가 있다.
db.js / resolvers.js / schema.graphql
기본 directory는 위 3가지와 같고, 각각의 기능은 아래와 같다.
database, graphql에서 활용할 함수의 작동(logic)을 정의한다.
database를 하드코딩할 경우, 아래와 같은 기본적인 db.js 구성을 해줄 수 있다.
let userDB = [
{
index: 1,
ID: "hyokyun",
PW: "HI"
},
{
index: 2,
ID: "chulsoo",
PW: "HELLO"
},
{
index: 3,
ID: "minsoo",
PW: "NICE"
}
]
module.exports = {
userDB,
getAllUserInfor: () => {
return userDB;
},
getUserInfor: (ID) => {
const filteredDB = userDB.filter((list) => ID === list.ID);
console.log(filteredDB);
return filteredDB[0];
}
}
GraphQL에서 활용할 함수와 이를 호출하기 위한 Query문을 정의한다.
위 db.js에서 함수의 동작을 구성하고,
에 대해 정의해준다.
const {getAllUserInfor, getUserInfor} = require('./db.js');
const resolvers = {
Query: {
//named by resolvers => named by declared
getAllUserInfor: () => getAllUserInfor(),
getUserInfor: (_, {ID}) => getUserInfor(ID)
}
}
module.exports = resolvers;
resolvers에서 정의한 query문의 type(인자, 전체적인 구조 등)을 정의한다.
resolvers에서 정의한대로 함수를 호출하고자 할 경우엔, schema에서 호출/반환자에 대한 모델링을 반드시 해주어야 한다.
type userInfor {
index: Int!
ID: String!
PW: String!
}
#
filtered한 형태는 iterable(객체)형태이므로 이를 type Query에 반영한다.
#
type Query {
getAllUserInfor: [userInfor]!
getUserInfor(ID: String!): userInfor!
}
※ ! : 필수항목, 공백을 허용하지 않는 값을 나타낸다.
getUserInfor
의 반환 형태는 객체형태로, 이에 부합하도록 반환 형태를 객체로 작성한다.graphql이 동작하는 localhost의 PORT는 4000이다.
위에서 정의한 resolvers, schema 등을 활용하면 graphql server를 생성할 수 있다.
//graphQL modules
const {GraphQLServer} = require('graphql-yoga');
const resolvers = require('./graphql/resolvers.js');
const server = new GraphQLServer({
typeDefs: "graphql/schema.graphql",
resolvers
})
server.start(()=>console.log("GRAPHQL SERVER RUNNING ON 4000"));
그 후, localhost:4000/에서 정의한 Query가 잘 동작하는지 확인한다.
※※ commonJS, ES6 문법에 맞게 module export/import 등이 작성되었는지 확인한다.
object key / value
https://www.codegrepper.com/code-examples/javascript/javascript+add++key+value+to+object+array
commonJS에서의 module export / require
https://discuss.codecademy.com/t/can-i-export-more-than-one-object-using-module-exports/382396
graphql 주석
https://velog.io/@hwang-eunji/GraphQL-2-%EB%AC%B8%EB%B2%95
Iterable - 객체
https://wikidocs.net/16068