이전 글에서는 간단하게 요청/응답을 받는 서버를 만들어보았다면, 이번에는 graphQL에서 변수를 이용해
특정 데이터를 조회하고 응답하는 방법을 알아보도록 할것입니다!
먼저 지난 게시글의 코드에 조회기능을 입혀볼 것입니다.
순서는 다음과 같습니다.
const schema = buildSchema(`
type Product{
id:ID!
name:String
price:Int
description:String
}
type Query{
getProduct(id:ID!):Product //id라는 이름의 ID를 받는다는 의미입니다.
}`);
id, name, price, description이라는 값을 가진 Product를 만들어주고,
id를 변수로 가진 getProduct라는 요청이 들어오면 Product를 내보내주는 쿼리를 생성해줍니다.
! 는 필수라는 의미를 가지고 있습니다.
응답에 사용할 임시데이터를 생성해줍니다.
const products = [
{
id: 1,
name: "첫번째 제품",
price: 2000,
description: "첫번째 제품입니다...",
},
{
id: 2,
name: "두번째 제품",
price: 4000,
description: "두번째 제품입니다...",
},
];
getProduct쿼리 요청이 들어오면, product데이터중에 상품id와 들어온 id가 같은 제품정보를 반환해주는 함수를 만들어주세요.
const root = {
getProduct: ({id}) => products.find((product) => product.id === parseInt(id)),
};
이제 요청을 한번 보내볼까요?
서버를 재시작한뒤 GUI로 돌아가서 아래의 id가 1인 제품의 id와 가격을 요청하는 쿼리를 보내보세요.
{
getProduct(id:1) {
id,
price
}
}
결과가 잘 출력이 되었습니다.
데이터는 type이 아닌 input을 통해 받을 데이터들의 타입을 정의해 줄 수 있으며,
Query가 아닌 Mutation으로 등록을 해줄 수 있습니다.
수정, 삭제, 등록과 같은 작업은 Mutation을 통해 작업해줍니다.
const schema = buildSchema(`
input ProductInput {
name:String
price:Int
description:String
}
type Product{
id:ID!
name:String
price:Int
description:String
}
type Query{
getProduct(id:ID!):Product
}
type Mutation{
addProduct(input:ProductInput):Product
}
`);
resolver에서 데이터를 추가하는 로직을 만들면 되겠죠?
const root = {
getProduct: ({id}) => products.find((product) => product.id === parseInt(id)),
addProduct: ({input}) => {
input.id = parseInt(products.length + 1);
products.push(input);
return root.getProduct({id: input.id});
},
};
input으로 전달받은 데이터에는 id가 정의되어 있지 않기 때문에, 따로 id를 만들어주고 products배열에 input을 추가해주었습니다.
그리고 getProduct를 재사용해서 결과를 응답해주었습니다.
이제 요청을 보낼 쿼리문을 작성해 볼 것입니다.
포스트맨에서 다음과 같은 형식의 호출을 지정해준뒤
POST Content-Type application/json
쿼리문은 다음과 같습니다.
{
"query": "mutation addProduct($input: ProductInput) {
addProduct(input: $input) { id }
}",
"variables": {
"input" : {
"name" : "세번째상품" ,
"price" : 3000 ,
"description" : "후후후"
}
}
}
mutation addProduct호출로 ProductInput타입의 $input을 보내주는데,
$input은 variables의 input을 가리킵니다.
그리고 addProduct쿼리로 id를 전달받겠다! 이런 의미를 가지게 되겠죠?
생성이 완료된 후 id:3 이 돌아온것을 확인할 수 있습니다.