728x90


저번 포스팅에서 간단한 graphql서버를 만들었다.

이번에는 저번에 대한 간략한 설명과 그리고 Type System에 대해서 설명을 해보겠다.


var schema = buildSchema(`
type Query {
hello: String
}
`);

graphql에서 스키마는 중요하다.

뭐 당연히 중요하겠지만.


위의 예제로 설명하자면 우리는 서버에 Query라는 것으로 요청을 할 것이다.

그런데 그 때 우리는 hello라는 것을 요청을 할것이다. 그리고 그 hello는 문자열이다.


이 Query는 서버와 클라이언트의 약속인 것이다.

저번에 클라이언트에 호출 예제를 보면  명확하게 알 수 있다.


우리는 server에서 정한 쿼리가 있고 client에서는 그 쿼리대로 요청해야한다.


여기서 말한 server에서 정한대로라는 이 규칙이 조금 애매하다.

그래서 예제로 설명하는게 제일 좋을 것 같다.


var schema = buildSchema(`
type Person {
name: String
age: Int
}

type Query {
hello: String
persons(name: String): [Person]
}
`);

저번의 쿼리를 조금 수정해보자.

내용이 복잡해 보이지만 사실 엄청 직관적인 예제이다.


type Person {
name: String
age: Int
}

Person이라는 Object를 만들었다.


Object란 graphql에서 struct나 class같은 것이라고 생각하면된다.


type <object name>{

syntax

}


이제 내부를 보자.


name: String
age: Int

Person안에 우리는 name과 age가 있다.

이렇게 더이상 쪼갤 수 없는 값을 우리는 Scalar라고 한다.


Scalar란 더 이상 쪼갤 수 없는 값을 의미한다.

Scalar의 종류는 아래와 같다.


Int - 32비트 정수

Float - 정수형 double

String - UTF8 문자열

Boolean - True, False

ID - 유니크한 ID


type Query {
hello: String
persons(name: String): [Person]
}

그리고 이 쿼리라는것은 object의 이름이 아니라 우리가 보내는 Query타입을 의미한다.

여기에 정해진 타입으로 우리는 서버와 클라이언트끼리 통신하게 된다.


Query란 서버와 클라이언트가 통신하기 위한 약속,

내부에서는 Scalar형과 Object형(이미 선언되어야함)을 선언할 수 있다.


[] - 배열을 의미한다.

() - 파라메터를 담을 수 있음을 의미한다. ex) name: String

! - 파라메터가 null이 될 수 없음을 의미한다. ex) name: String!


자 이제 준비는 끝났다.

이제 그럼 서버부분을 만들어 보자.


class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}

예제를 위해서 name과 age를 가지는 객체를 만들어보자.

var root = {
hello: () => {
return 'Hello world!';
},
persons: ({name}) => {
let list = [
{
name: 'kukaro',
age: 27
},
new Person('jiharu', 21),
];
if(!name) {
return list;
}
let result = [];
list.forEach((value) => {
if (value.name === name) {
result.push(value);
}
});
return result;
}
};

그 다음 rootValue에 사용될 예제를 만들어보자.


일단 hello는 무조건적으로 Hello World를 반환한다.

하지만 persons는 다르다.


let list = [
{
name: 'kukaro',
age: 27
},
new Person('jiharu', 21),
];

먼저 persons가 반환할 값은 두 객체를 반환한다.

하나는 object에 name과 age가 들어 있고 하나는 Person객체로 넣었다.

사실 둘 다사용할 수 있다는 것을 보여주기 위해서 위의 방법을 사용하였다.


if(!name) {
return list;
}

name이 undefiend, 즉 값이 없다면 그냥 list를 그대로 출력한다.


let result = [];
list.forEach((value) => {
if (value.name === name) {
result.push(value);
}
});
return result;

만약 name 파라메터가 들어온다면 그 녀석을 반환하는 코드를 짠 것이다.

이제 그대로 실행을 해보자.


graphql에서 hello만 요청하면 hello 값만 온다.


만약 persons를 요청하고 싶다면 안에 속성도 넣는다.


persons의 name만 출력하려면 위처럼 하면된다.


우리는 파라메터도 가능하게 하였다. name이 kukaro인것만 출력하려면 위처럼 사용하면 된다.


이렇게 graphql은 쉽고 직관적이게 사용할 수 있다.

+ Recent posts