const typeDefs = gql`
type Query { // 쿼리 루트 타입이라고 한다
teams: [Team]
}
type Team { // 여긴 그냥 타입
id: Int
manager: String
office: String
extension_number: String
mascot: String
cleaning_duty: String
project: String
}
`
const resolvers = {
Query: {
teams: () => database.teams
}
}
이 쿼리 루트 타입에서는 어떤 형식으로 들어오고 어떤 형식으로 반환될 지가 정의되어있다.
teams 이라는 쿼리가 오면은 Team 이라는 데이터가 여러개 복수로 반환된다는 의미이다.
그니까 teams 라는 쿼리를 날리면 Team 이라는 여러개가 반환된다는 뜻이다.
그렇다면 이 Team 은 어떤 형식으로 구성되어있냐는 아래처럼 id, manager... 과 같이 구성되어 있다.
쿼리 루트 타입
- 자료요청에 사용할 쿼리들을 정의하고
- 쿼리 명령문마다 반환될 데이터 형태를 지정
resolver 는 이 쿼리들을 바탕으로 실질적으로 진행하는 코드가 들어간다.
이 쿼리에 teams 항목은 화살표 함수를 통해 database 에 들어있는 모든 team 들을 반환한다.
그니까 database 의 teams 항목을 반환하는 함수이다.
const typeDefs = gql`
type Query { // 쿼리 루트 타입
teams: [Team]
equipments: [Equipment] // Equipment 를 반환하는 쿼리 루트 타입을 추가한다.
}
type Team {
id: Int
manager: String
office: String
extension_number: String
mascot: String
cleaning_duty: String
project: String
}
type Equipment {
id: String
used_by: String
count: Int
new_or_used: String
}
`
const resolvers = {
Query: {
teams: () => database.teams, // 쉼표 추가
equipments: () => database.equipments // equipments 를 반환한다.
}
}
그래서 실행결과를 아래와 같이 보면 왼쪽과 같이 적어줬을 때 오른쪽과 같은 결괏값이 나온다!
특정 team 만 받아오기
args 로 주어진 id 에 해당하는 team 만 필터링하여 반환
Query: {
//
team: (parent, args, context, info) => database.teams
.filter((team) => {
return team.id === args.id
})[0],
equipments: () => database.equipments // 신경x
}
filter 로 거른다.
args 의 id 와 team의 id 일치하는 것만 반환
filter 메서드니까 배열이 반환되고 [0] 만 반환(id 값만)
쿼리 루트 타입에 하나 더 추가한다.
type Query {
teams: [Team]
team(id: Int): Team
equipments: [Equipment]
}
팀의 id 가 정수라는 인자가 들어오고 하나의 Team 을 반환한다.
위의 teams: [Team] 과는 달리 단수임을 볼 수 있다.
왼쪽에서는 id 가 4인 team 만 받겠다 라는 뜻이다.
여기서의 id 가 4는 resolvers 에 args에 들어가는 인자라고 생각하면 된다.
다음은 데이터를 연결해서 받아오는 방법이다.
Team 목록을 반환 시 해당하는 supplies 를 supplies 항목에 추가하는 방법이다.
Query: {
// ...
teams: () => database.teams
.map((team) => {
team.supplies = database.supplies
.filter((supply) => {
return supply.team === team.id
})
return team
}),
}
위 코드를 풀어보면...
team 의 supplies 에 집어넣는데 이때 집어넣는 항목은 database 의 supplies 의 항목에서 supply 의 team 과 team 의 id 가 같은 것만 반환
그래서 최종적으로는 teams 전체 배열을 반환하는 것이다
그리고
team 의 쿼리 루트 타입에 supplies 항목을 추가적으로 작성해줘야 한다.
supplies: [ Supply ]
그래서 다음과 같이 사용할 수 있다.
Mutation
- Mutation - 뭔가를 변경하는 것
- Query - 요청하는 것
으로 생각하면 된다.
데이터에 수정을 가하는 것
물론 resolvers 에서 데이터에 수정을 가해도 되는 식으로 구성해도 되지만
Rest api 처럼 각 메서드마다 정해진 규칙이 있듯이
그러므로 어떤 데이터를 요청해서 받아올 땐 query로, 데이터에 수정을 가할 땐 Mutation 방식으로
짜야 한다.
Mutation 방식으로 짜는 방법은 쿼리 루트 타입이랑 같다.
const typeDefs = gql`
type Query { // 쿼리 루트 타입
teams: [Team]
}
type Mutation { // 쿼리 루트 타입을 만들듯이 mutation 도 따로 작성
deleteEquipment(id: String): Equipment
// 보통 삭제하는 것을 성공했다면 true, false 형태의 불린 값이라든지 작성
// 여기서는 String 인자 id 를 받는 deleteEquipment : 삭제된 Equipment 를 반환
}
`
Mutation 의 삭제 루트타입을 지정했고
삭제 resolver 도 작성해주어야 한다.
resolver 에 , 를 찍고 이어서 Mutation 을 작성해주면 된다.
// ...
,
Mutation: {
deleteEquipment: (parent, args, context, info)
}
}
'👩🏻💻 TIL' 카테고리의 다른 글
기업협업에서 배운 것 정리 (0) | 2022.01.17 |
---|---|
GraphQL (0) | 2022.01.04 |
ORM - prisma (0) | 2021.12.31 |
타입스크립트 자료유형 기초 (0) | 2021.12.28 |
2021_12_26_TIL (1) | 2021.12.26 |