본문 바로가기
관리자

Programming-[Backend]/graphQL

5. 영화 API GraphQL : 구조, 원리 파악하기

728x90
반응형

참조

Nomad Coders의 무료 강의 'graphQL로 영화 API 만들기'를 참고하였다.

nomadcoders.co/graphql-for-beginners

 


 

원리. Resolver와 Schema에 맞게 query문을 날리면 원하는 데이터를 받는다!

 

아래 사진에서처럼, 왼쪽 client에서 query 문을 날리면 movies에 해당하는 "data"객체가 우측 결과화면에 표시되는 것을 볼 수 있다. 어떤 원리로 이것이 작동하는지 구조적으로 살펴보자.

 


 

1-1. resolver.js

resolver는 query 요청이 왔을 때 어떤 데이터를 넘겨줄 것인가를 정의해주는 파일이다.

 

resolver 내부에 Query와 Mutation이 있는데, 이는 REST API에서의 GET, POST와 유사하다고 보면 된다.

Query 안의 movies나 movie로 접근하면 getMovies()를 통해 모든 영화에 대한 정보를 get 할 수 있거나, getById()를 통해 파라미터로 넘겨준 id와 일치하는 영화값만 조회할 수 있도록 할 수 있다.

Mutation 하위에 있는 addMovie, deleteMovie는 movies라는 db 속 객체 안에 영화 정보를 추가하거나 삭제하는 post 기능을 한다고 보면 된다.

 

그럼 import로 받아오는 저 갖가지 함수들은 어디에 어떻게 작성된 것일까?

 

 


 

1-2. db.js

 

db.js 파일에서는 데이터 객체를 갖는 배열(movies)을 정의하고, resolver.js에서 쓰일 함수들을 정의하였다.

(아직 잘 모르지만... 아마 MYSQL과 같은 실제 DB에 연결 시에는 이러한 작업을 sequelize로 처리하거나 다른 파일에서 처리할 것 같다.)

 

그리고 함수들을 모두 export 처리하여 resolver.js에서 import 후 사용할 수 있도록 하였다. 꼭 db.js에 작성할 필요는 없지만 기능적으로 파일들을 구분해놓은 것 같다.

 

 


1-3. schema.graphql

schema 에서는 Query와 Mutation을 정의해줘야한다.

그리고 Query와 Mutation에 쓰일 Movie type을 지정해준다. 이는 마치 데이터가 들어갈 표를 만들어 놓는 것과 같다. id, name, score의 열 이름을 지정하고, 각 열에 들어갈 데이터의 형식(int, string), 필수 입력 여부(!)를 지정해준다.

 

하나 예를 들어서 이해해보자면, 7~8번줄의 query 문은

 

1
2
3
4
5
6
query {
  movies {
    id
    name
  }
}
cs

으로 날릴 수 있겠다. 그럼 resolver.js에서 Query : { movies : () => getMovies() } 가 실행되는 것이고 getMovies 함수의 정의에 따라 movies라는 DB에 있는 모든 정보를 불러온다.

 

다만 movies DB는 각 영화의 id, name, score를 포함하고 있는데, 위의 query 문에서는 id, name만 요청했으니까 각 영화에 대해 id, name 값들만 추출해서 가져오게 된다.

 

실제로 그렇게 되는 것인지 다음 글에서 살펴보자!

728x90
반응형