[Node.js]GraphQL - #2 DB 조회

Yeon Jeffrey Seo·2022년 5월 15일

GraphQL

목록 보기
1/4

1. 폴더 구조

+-- src
  +-- graphql
    +-- index.js
  +--- models
    +-- index.js
    +-- Users.js
  +-- services
    +-- users.js
  +-- app.js

2. Query API 구현

GraphQL 질의는 크게 두가지로 분류한다.

  • Query : 질의 내용이 DB를 수정하는 등의 Side Effect를 발생시키지 않음 (READ)

  • Mutation: 질의 내용이 DB를 수정하는 등의 Side Effect를 발생시킴 (CREATE, UPDATE, DELETE)

우선 CRUD 중에서 가장 만만한 READ를 구현했다.

GraphQL entry-point는 당연 app.js에서 해주었다.
graphqlHTTP 옵션 중 graphiql은 playground를 사용할 것인지에 대한 옵션이다. GraphQL이 제공하는 web UI

app.js

app.use(
  "/graphql",
  graphqlHTTP({ schema: schema, rootValue: resolver, graphiql: true })
);

이번에는 schema와 resolver 코드를 분리해서 사용했다. graphql/index.js 에서 schema와 resolver를 모두 만들었다.
사실 GraphQLSchema를 써보고 싶었지만.... 참고자료가 너무 부족했다. 어쩔 수 없이 buildSchema를 사용했다.

type Query 에서 user(account: String!) 은 user라는 쿼리는 account라는 문자열을 쿼리 인자로 받고, 이 인자는 반드시 포함되어야 한다 라는 뜻이다. !(exclamation mark)는 공식문서를 찾아보면 그 의미를 알 수 있다.
이 user 쿼리의 결과는 User라는 타입을 반환한다. User 타입은 그 아래에 다시 정의되어 있다.

resolver에는 실제 서비스 로직이 들어가면 될 듯 하다. query에 넣는 인자는 resolver의 첫번째 인자르 받을 수 있다.
위에서 정의한 쿼리 타입에서 user(account: String!): User 로 작성했으므로, resolver에서 그 값을 받아 SQL 혹은 ORM 사용에 쓸 수 있다.

graphql/index.js

import Graphql from "graphql";
import { readOneUser } from "../services/user.js";

const { buildSchema } = Graphql;

/**
 * exclamation mark : non null
 */
const schema = buildSchema(`
  type Query {
    user(account: String!): User
  }

  type User {
    account: String
    name: String
  }
`);

const resolver = {
  user: async (args, context, info) => {
    const { account } = args;
    const user = await readOneUser(account);
    return user;
  },
};

export { schema, resolver };

3. DB 구성

DB는 MySQL, ORM으로 sequelize를 사용했다.
models/index.js

import { Sequelize, QueryTypes } from "sequelize";
import config from "../config/config.js";
const { NODE_ENV, dbConfig } = config;
import Users from "./Users.js";

const db = {};
const sequelize = new Sequelize(dbConfig[NODE_ENV]);

db.Op = Sequelize.Op;
db.QueryTypes = QueryTypes;
db.sequelize = sequelize;
db.Users = Users(sequelize, Sequelize);

export default db;

models/Users.js

export default (sequelize, DataTypes) => {
  return sequelize.define(
    "Users",
    {
      id: {
        type: DataTypes.INTEGER,
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
      },
      account: {
        type: DataTypes.STRING(255),
        allowNull: false,
      },
      name: {
        type: DataTypes.STRING(255),
        allowNull: false,
      },
    },
    {
      sequelize,
      tableName: "Users",
      timestamps: true,
      charset: "utf8",
      collation: "utf8_general_ci",
    }
  );
};

4. 쿼리 결과

우선 GraphQL playground에서 호출
쿼리 결과

Postman에서 호출
포스트맨 호출 결과

profile
The best time to plant a tree was twenty years ago. The second best time is now.

0개의 댓글