Node.js × Express로 시작하는 GraphQL 입문
개요
GraphQL을 처음으로 구현해 보았을 때의 순서와 샘플 소스 코드를 기재하고 있습니다.
환경
샘플 소스 코드
hayatoiwashita/express-graphql
절차
1. 프로젝트의 병아리 만들기
express-generator를 사용했다.--git
옵션은 .gitignore
를 추가하기 위한 옵션.
$ express --view=pug --git express-graphql
참고 : Express 애플리케이션 생성 프로그램
2. 라이브러리 설치
GraphQL 관련 라이브러리는 최소한 아래가 있으면 OK.
$ yarn add graphql
$ yarn add express-graphql
샘플 그럼 하기도 추가하고 있다(본제로부터 벗어날 수 있으므로 할애)
# ホットリロード
$ yarn add --dev nodemon
# コード整形
$ yarn add prettier --dev --exact
$ yarn add eslint --dev
$ yarn add --dev eslint-config-prettier
$ yarn add --dev eslint-plugin-prettier
# commit時にコード整形を実行
$ yarn add --dev lint-staged
$ yarn add --dev husky
3. 샘플 데이터 준비
/data/users.js
를 추가하여 DB 대신 사용했습니다.
(내용은 샘플 소스 코드 users.js 참조)
4. schema 정의
/schema/schema.graphql
를 작성해 schema를 정의.
이번에는 참조계 쿼리만 구현했다.
데이터 구조는 사용자와 그것에 연결하는 게시물 같은 형태.
schema.graphqlconst { buildSchema } = require("graphql");
const schema = buildSchema(`
type Query {
users: [User!]!,
user(id: Int!): User!
}
type User {
id: ID!
name: String!
email: String
posts: [Post!]
}
type Post {
id: ID!
title: String!
published: Boolean!
link: String
author: User!
}
`);
module.exports = schema;
5. 해석자 만들기
데이터 조작을 실시하는 /src/resolvers.js
를 작성.
위에서 언급했듯이 이번에는 참조 시스템 만.
resolvers.jsconst { Users } = require('../data/users');
const resolvers = {
users: async (_) => {
console.log('come here');
return Users;
},
user: async ({ id }, context) => {
return Users.find((user) => user.id == id);
},
};
module.exports = resolvers;
6. app.js 수정
엔드포인트 /graphql
정의.
app.js// var createError = require('http-errors');
var express = require('express');
var { graphqlHTTP } = require('express-graphql');
var resolvers = require('./src/resolvers');
var schema = require('./schema/schema.graphql');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(
'/graphql',
graphqlHTTP({
schema,
rootValue: resolvers,
graphiql: true,
})
);
module.exports = app;
7. [참고] 컨테이너화
Dockerfile
및 docker-compose.yml
추가.
FROM node:14.15.4-slim
WORKDIR /usr/local/src/express-graphql
ADD . .
RUN yarn install
CMD [ "yarn", "start" ]
docker-compose.ymlversion: '3'
services:
graphql:
build: .
container_name: graphql-container
ports:
- "3000:3000"
8. Express 시작
시작 명령을 실행합니다.
# コンテナで実行
$ docker-compose up
# コンテナを使用せず実行
$ yarn start
9. 쿼리 실행
http://localhost:3000/graphql 을(를) 브라우저에서 엽니다.
【샘플 쿼리】
내용으로서는, 유저 ID=1의 유저의 이름과, 그 유저의 투고(posts)의 ID와 타이틀을 취득한다고 하는 것.
{
user(id:1) {
name
posts {
id
title
}
}
}
실행 결과
{
"data": {
"user": {
"name": "Fikayo Adepoju",
"posts": [
{
"id": "1",
"title": "Debugging an Ionic Android App Using Chrome Dev Tools"
},
{
"id": "2",
"title": "Hosting a Laravel Application on Azure Web App"
}
]
}
}
}
참고
1. 프로젝트의 병아리 만들기
express-generator를 사용했다.
--git
옵션은 .gitignore
를 추가하기 위한 옵션.$ express --view=pug --git express-graphql
참고 : Express 애플리케이션 생성 프로그램
2. 라이브러리 설치
GraphQL 관련 라이브러리는 최소한 아래가 있으면 OK.
$ yarn add graphql
$ yarn add express-graphql
샘플 그럼 하기도 추가하고 있다(본제로부터 벗어날 수 있으므로 할애)
# ホットリロード
$ yarn add --dev nodemon
# コード整形
$ yarn add prettier --dev --exact
$ yarn add eslint --dev
$ yarn add --dev eslint-config-prettier
$ yarn add --dev eslint-plugin-prettier
# commit時にコード整形を実行
$ yarn add --dev lint-staged
$ yarn add --dev husky
3. 샘플 데이터 준비
/data/users.js
를 추가하여 DB 대신 사용했습니다.(내용은 샘플 소스 코드 users.js 참조)
4. schema 정의
/schema/schema.graphql
를 작성해 schema를 정의.이번에는 참조계 쿼리만 구현했다.
데이터 구조는 사용자와 그것에 연결하는 게시물 같은 형태.
schema.graphql
const { buildSchema } = require("graphql");
const schema = buildSchema(`
type Query {
users: [User!]!,
user(id: Int!): User!
}
type User {
id: ID!
name: String!
email: String
posts: [Post!]
}
type Post {
id: ID!
title: String!
published: Boolean!
link: String
author: User!
}
`);
module.exports = schema;
5. 해석자 만들기
데이터 조작을 실시하는
/src/resolvers.js
를 작성.위에서 언급했듯이 이번에는 참조 시스템 만.
resolvers.js
const { Users } = require('../data/users');
const resolvers = {
users: async (_) => {
console.log('come here');
return Users;
},
user: async ({ id }, context) => {
return Users.find((user) => user.id == id);
},
};
module.exports = resolvers;
6. app.js 수정
엔드포인트
/graphql
정의.app.js
// var createError = require('http-errors');
var express = require('express');
var { graphqlHTTP } = require('express-graphql');
var resolvers = require('./src/resolvers');
var schema = require('./schema/schema.graphql');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(
'/graphql',
graphqlHTTP({
schema,
rootValue: resolvers,
graphiql: true,
})
);
module.exports = app;
7. [참고] 컨테이너화
Dockerfile
및 docker-compose.yml
추가.FROM node:14.15.4-slim
WORKDIR /usr/local/src/express-graphql
ADD . .
RUN yarn install
CMD [ "yarn", "start" ]
docker-compose.yml
version: '3'
services:
graphql:
build: .
container_name: graphql-container
ports:
- "3000:3000"
8. Express 시작
시작 명령을 실행합니다.
# コンテナで実行
$ docker-compose up
# コンテナを使用せず実行
$ yarn start
9. 쿼리 실행
http://localhost:3000/graphql 을(를) 브라우저에서 엽니다.
【샘플 쿼리】
내용으로서는, 유저 ID=1의 유저의 이름과, 그 유저의 투고(posts)의 ID와 타이틀을 취득한다고 하는 것.
{
user(id:1) {
name
posts {
id
title
}
}
}
실행 결과
{
"data": {
"user": {
"name": "Fikayo Adepoju",
"posts": [
{
"id": "1",
"title": "Debugging an Ionic Android App Using Chrome Dev Tools"
},
{
"id": "2",
"title": "Hosting a Laravel Application on Azure Web App"
}
]
}
}
}
참고
Reference
이 문제에 관하여(Node.js × Express로 시작하는 GraphQL 입문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hayatoiwashita/items/821c438c453310acdd3c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)