작성일 댓글 남기기

GraphQL의 데이터베이스 연동

데이터베이스와의 연동은 GraphQL의 리졸버에서 데이터베이스 요청을 처리하는 방식으로 이루어집니다. 이를 통해 클라이언트가 GraphQL 쿼리나 뮤테이션을 통해 데이터를 요청하거나 수정할 수 있습니다. 이번에는 Node.js 환경에서 MongoDBPostgreSQL 같은 데이터베이스와 GraphQL을 연동하는 방법을 예시로 설명할게요.

1. GraphQL 서버와 데이터베이스 연동 기본 개념

GraphQL 서버는 데이터 요청을 처리할 때 **리졸버(Resolver)**를 사용합니다. 리졸버는 클라이언트의 요청을 받아 데이터베이스에 질의(query)하거나, 데이터를 수정하는 역할을 합니다.

기본 흐름:

  1. 클라이언트는 GraphQL 쿼리나 뮤테이션을 서버에 보냅니다.
  2. GraphQL 서버의 리졸버는 해당 요청을 처리하고, 데이터베이스에 연결해 데이터를 조회하거나 변경합니다.
  3. 데이터베이스는 리졸버의 요청에 따라 데이터를 반환합니다.
  4. 서버는 클라이언트에 요청한 데이터를 반환합니다.

2. MongoDB와의 연동

MongoDB는 NoSQL 데이터베이스 중 하나로, JavaScript 객체처럼 데이터를 저장하는 유연한 구조를 가지고 있습니다. Mongoose라는 ORM(Object Relational Mapping)을 통해 Node.js와 쉽게 연동할 수 있습니다.

1) 환경 설정

  1. 패키지 설치:bash코드 복사npm install mongoose npm install graphql express express-graphql
  2. 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과의 연동

PostgreSQLSQL 기반의 관계형 데이터베이스입니다. Sequelize라는 ORM을 사용하여 Node.js와 PostgreSQL을 쉽게 연동할 수 있습니다.

1) 환경 설정

  1. 패키지 설치:
    npm install sequelize pg pg-hstore npm install graphql express express-graphql
  2. 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 테이블과 연동됩니다. 각 사용자는 nameemail 필드를 가지고 있습니다.
  • 리졸버: users 리졸버는 모든 사용자 목록을 반환하고, addUser 리졸버는 새로운 사용자를 추가합니다.
  • PostgreSQL 연동: 리졸버에서 Sequelize의 findAll(), findByPk() 메서드를 사용해 데이터를 조회하고, create()를 사용해 새 데이터를 생성합니다.

3) 실행 및 테스트

서버를 실행하고 브라우저에서 GraphiQL을 통해 데이터를 조회하거나 추가할 수 있습니다. 예시는 MongoDB와 동일하게 쿼리나 뮤테이션을 실행하면 됩니다.

4. 데이터베이스 선택 및 연동의 주요 포인트

1) 데이터베이스 선택

  • MongoDB: 데이터 구조가 자주 바뀌거나, 비정형 데이터를 다룰 때 NoSQL 데이터베이스인 MongoDB가 유리합니다.
  • PostgreSQL: 데이터 구조가 고정적이거나 관계형 데이터가 필요할 경우, SQL 기반의 PostgreSQL이 적합합니다.

2) GraphQL과의 연동

  • GraphQL은 데이터베이스에 독립적인 쿼리 언어입니다. 이를 통해 데이터를 가져오거나 수정할 때, GraphQL 자체는 데이터베이스의 종류에 상관없이 사용될 수 있습니다.
  • 각 데이터베이스와 연동할 때, 적절한 ORM이나 라이브러리를 사용하여 GraphQL의 리졸버와 데이터베이스 간의 연결을 처리하면 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다