Apollo Server로 GraphQL API 서버 개발하기 (2)

곽태욱·2020년 2월 6일
3

깃허브 : https://github.com/rmfpdlxmtidl/movie-server

서버 구축 등 기초적인 내용은 1편에서 다뤄봤고, 2편에선 서버를 커스터마이즈하는 과정에 대해 다뤄볼 것이다.

1. 새로운 데이터베이스 추가

데이터베이스에 새로운 항목을 추가하고 싶으면, 아래와 같이 한다.

  1. 데이터베이스 생성
  2. 스키마에 데이터베이스 구조 명시
  3. 스키마에 API 요청 추가
  4. 리졸버에 API 요청 처리 함수 추가

여기선 사용자 데이터베이스를 추가해볼 것이다.

User 데이터베이스 생성

// src/database/users.js
const users = [];

export default users;

먼저 사용자 목록이 실제로 저장될 곳을 만든다. 위 코드는 서버가 실행됐을 때의 users 배열의 초기값이 비어있다는 것을 의미한다. 이 과정은 MySQL, MongoDB, MariaDB 등 외부 데이터베이스에서 작업해도 된다.

스키마에 User 구조 명시

// 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의 하위 항목은 대소문자를 구분하기 때문에 idID는 다른 항목으로 인식된다.

스키마에 API 요청 추가

// 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) 있다.

리졸버에 API 요청 처리 함수 추가

// 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)를 가져올 수 있다.

2. 데이터베이스 검색

profile
이유와 방법을 알려주는 메모장 겸 블로그. 블로그 내용에 대한 토의나 질문은 언제나 환영합니다.

0개의 댓글