데이터베이스와의 연동은 GraphQL의 리졸버에서 데이터베이스 요청을 처리하는 방식으로 이루어집니다. 이를 통해 클라이언트가 GraphQL 쿼리나 뮤테이션을 통해 데이터를 요청하거나 수정할 수 있습니다. 이번에는 Node.js 환경에서 MongoDB나 PostgreSQL 같은 데이터베이스와 GraphQL을 연동하는 방법을 예시로 설명할게요.
1. GraphQL 서버와 데이터베이스 연동 기본 개념
GraphQL 서버는 데이터 요청을 처리할 때 **리졸버(Resolver)**를 사용합니다. 리졸버는 클라이언트의 요청을 받아 데이터베이스에 질의(query)하거나, 데이터를 수정하는 역할을 합니다.
기본 흐름:
- 클라이언트는 GraphQL 쿼리나 뮤테이션을 서버에 보냅니다.
- GraphQL 서버의 리졸버는 해당 요청을 처리하고, 데이터베이스에 연결해 데이터를 조회하거나 변경합니다.
- 데이터베이스는 리졸버의 요청에 따라 데이터를 반환합니다.
- 서버는 클라이언트에 요청한 데이터를 반환합니다.
2. MongoDB와의 연동
MongoDB는 NoSQL 데이터베이스 중 하나로, JavaScript 객체처럼 데이터를 저장하는 유연한 구조를 가지고 있습니다. Mongoose라는 ORM(Object Relational Mapping)을 통해 Node.js와 쉽게 연동할 수 있습니다.
1) 환경 설정
- 패키지 설치:bash코드 복사
npm install mongoose npm install graphql express express-graphql
- MongoDB와 연결 설정: 먼저 MongoDB에 연결하고, Mongoose를 이용해 데이터를 처리하는 간단한 예제를 작성해보겠습니다.
const mongoose = require('mongoose');
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
// MongoDB 연결
mongoose.connect('mongodb://localhost:27017/mydatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Mongoose 스키마 정의
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
// GraphQL 스키마 정의
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
addUser(name: String!, email: String!): User
}
`);
// GraphQL 리졸버 정의
const root = {
users: async () => {
return await User.find();
},
user: async ({ id }) => {
return await User.findById(id);
},
addUser: async ({ name, email }) => {
const newUser = new User({ name, email });
await newUser.save();
return newUser;
}
};
// Express 설정
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true
}));
app.listen(4000, () => {
console.log('Server is running on http://localhost:4000/graphql');
});
2) 설명
- Mongoose 스키마:
userSchema
는 MongoDB에 저장될 사용자의 구조를 정의합니다. 이름과 이메일을 필드로 가지는 사용자 데이터를 정의하였습니다. - 리졸버:
users
리졸버는 모든 사용자 목록을 반환하고,addUser
는 새로운 사용자를 추가한 후 해당 데이터를 반환합니다. - MongoDB와 연동: 리졸버에서 Mongoose의
find()
나findById()
와 같은 메서드를 사용해 데이터를 데이터베이스에서 조회하고,save()
로 새 데이터를 저장합니다.
3) 실행 및 테스트
서버를 실행하고 브라우저에서 http://localhost:4000/graphql
에 접속하면 GraphiQL을 통해 데이터를 조회하거나 추가할 수 있습니다.
예를 들어, 사용자 목록을 가져오는 쿼리:
query {
users {
id
name
email
}
}
새로운 사용자를 추가하는 뮤테이션:
mutation {
addUser(name: "Alice", email: "[email protected]") {
id
name
email
}
}
이렇게 하면 MongoDB에 데이터가 저장되고, 조회할 수 있습니다.
3. PostgreSQL과의 연동
PostgreSQL은 SQL 기반의 관계형 데이터베이스입니다. Sequelize라는 ORM을 사용하여 Node.js와 PostgreSQL을 쉽게 연동할 수 있습니다.
1) 환경 설정
- 패키지 설치:
npm install sequelize pg pg-hstore npm install graphql express express-graphql
- PostgreSQL과 연결 설정: PostgreSQL에 연결한 후, Sequelize를 이용해 테이블과 모델을 정의합니다.
const { Sequelize, DataTypes } = require('sequelize');
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
// PostgreSQL 연결
const sequelize = new Sequelize('postgres://username:password@localhost:5432/mydatabase');
// Sequelize 모델 정의
const User = sequelize.define('User', {
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false
}
}, {});
// 데이터베이스 초기화
sequelize.sync();
// GraphQL 스키마 정의
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User]
user(id: ID!): User
}
type Mutation {
addUser(name: String!, email: String!): User
}
`);
// GraphQL 리졸버 정의
const root = {
users: async () => {
return await User.findAll();
},
user: async ({ id }) => {
return await User.findByPk(id);
},
addUser: async ({ name, email }) => {
return await User.create({ name, email });
}
};
// Express 설정
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true
}));
app.listen(4000, () => {
console.log('Server is running on http://localhost:4000/graphql');
});
2) 설명
- Sequelize 모델:
User
모델은 PostgreSQL의users
테이블과 연동됩니다. 각 사용자는name
과email
필드를 가지고 있습니다. - 리졸버:
users
리졸버는 모든 사용자 목록을 반환하고,addUser
리졸버는 새로운 사용자를 추가합니다. - PostgreSQL 연동: 리졸버에서 Sequelize의
findAll()
,findByPk()
메서드를 사용해 데이터를 조회하고,create()
를 사용해 새 데이터를 생성합니다.
3) 실행 및 테스트
서버를 실행하고 브라우저에서 GraphiQL을 통해 데이터를 조회하거나 추가할 수 있습니다. 예시는 MongoDB와 동일하게 쿼리나 뮤테이션을 실행하면 됩니다.
4. 데이터베이스 선택 및 연동의 주요 포인트
1) 데이터베이스 선택
- MongoDB: 데이터 구조가 자주 바뀌거나, 비정형 데이터를 다룰 때 NoSQL 데이터베이스인 MongoDB가 유리합니다.
- PostgreSQL: 데이터 구조가 고정적이거나 관계형 데이터가 필요할 경우, SQL 기반의 PostgreSQL이 적합합니다.
2) GraphQL과의 연동
- GraphQL은 데이터베이스에 독립적인 쿼리 언어입니다. 이를 통해 데이터를 가져오거나 수정할 때, GraphQL 자체는 데이터베이스의 종류에 상관없이 사용될 수 있습니다.
- 각 데이터베이스와 연동할 때, 적절한 ORM이나 라이브러리를 사용하여 GraphQL의 리졸버와 데이터베이스 간의 연결을 처리하면 됩니다.