서버 구축 등 기초적인 내용은 1편에서 다뤄봤고, 2편에선 서버를 커스터마이즈하는 과정에 대해 다뤄볼 것이다.
데이터베이스에 새로운 항목을 추가하고 싶으면, 아래와 같이 한다.
- 데이터베이스 생성
- 스키마에 데이터베이스 구조 명시
- 스키마에 API 요청 추가
- 리졸버에 API 요청 처리 함수 추가
여기선 사용자 데이터베이스를 추가해볼 것이다.
// src/database/users.js
const users = [];
export default users;
먼저 사용자 목록이 실제로 저장될 곳을 만든다. 위 코드는 서버가 실행됐을 때의 users
배열의 초기값이 비어있다는 것을 의미한다. 이 과정은 MySQL, MongoDB, MariaDB 등 외부 데이터베이스에서 작업해도 된다.
// src/graphql/typeDefs.js
import { gql } from 'apollo-server';
const typeDefs = gql`
type User {
id: Int!
ID: String!
password: String!
}
...
`;
export default typeDefs;
User 구조를 서버가 인식할 수 있도록 type User { ... }
를 스키마에 명시한다. type
의 하위 항목은 대소문자를 구분하기 때문에 id
와 ID
는 다른 항목으로 인식된다.
// src/graphql/typeDefs.js
import { gql } from 'apollo-server';
const typeDefs = gql`
type Query {
...
users: [User]!
}
type Mutation {
...
addUser(ID: String!, password: String!): User
}
...
`;
export default typeDefs;
users: [User]!
: 모든 사용자의 정보를 반환하는 users
API를 Query API에 추가한다. 요청 시 User 형태의 배열을 반드시(Not-Null) 반환한다.
addUser(ID: String!, password: String!): User
: user를 추가하는 addUser
API를 Mutation API에 추가한다. 파라미터로 아이디와 패스워드를 넘겨주고, User 형태의 데이터를 반환할 수도(Nullable) 있다.
// src/graphql/resolvers.js
...
import users from '../database/users';
const resolvers = {
Query: {
...
users: () => users
},
Mutation: {
...
addUser: (_, { ID, password }) => {
// 사용자 아이디 중복 검사
if (users.find(user => user.ID === ID)) return null;
// 데이터베이스에 추가
const newUser = {
id: users.length + 1,
ID,
password
};
users.push(newUser);
return newUser;
}
}
};
import users from '../database/users';
users.js
에서 사용자 초기 데이터를 불러온다. MySQL, MongoDB, MariaDB 등 외부 데이터베이스에서 작업했을 경우 거기서 데이터를 불러와도 된다.
users: () => users
파라미터가 없는 users API 요청이 들어오면 데이터베이스에 있는 users 배열을 그대로 반환한다.
addUser: (_, { ID, password }) => { ... }
아이디 중복 여부를 검사해서 중복이면 null
을 반환하고, 중복되지 않은 아이디일 경우에만 User 형태의 데이터를 반환한다.
리졸버 첫번째 파라미터는 사용하지 않기 때문에 _
로 설정하고, 2번째 파라미터에서 API 요청 시 전달된 파라미터(ID
, password
)를 가져올 수 있다.