home강의 홈으로
Section 3. GraphQL 서버 깊이 파보기
Lesson 3. 유니언과 인터페이스

3. 유니언과 인터페이스

  • 3-3-union-interface 새로 열기

Union

  • 타입 여럿을 한 배열에 반환하고자 할 때 사용

EquipmentSupply를 함께 반환하기

givens.js

const { gql } = require('apollo-server') const dbWorks = require('../dbWorks.js') const typeDefs = gql` union Given = Equipment | Supply ` const resolvers = { Query: { givens: (parent, args) => { return [ ...dbWorks.getEquipments(args), ...dbWorks.getSupplies(args) ] } }, Given: { __resolveType(given, context, info) { if (given.used_by) { return 'Equipment' } if (given.team) { return 'Supply' } return null } } } module.exports = { typeDefs: typeDefs, resolvers: resolvers }

_queries.js

const typeDefs = gql` type Query { // ... givens: [Given] } `

index.js

// ... const givens = require('./typedefs-resolvers/givens') // ... const typeDefs = [ // ... givens.typeDefs ] // ... const resolvers = [ // ... givens.resolvers ] // ...
query { givens { __typename ... on Equipment { id used_by count new_or_used } ... on Supply { id team } } }


Interface

  • 유사한 객체 타입을 만들기 위한 공통 필드 타입
  • 추상 타입 - 다른 타입에 implement 되기 위한 타입

type Equipment { id: ID! used_by: Role! count: Int new_or_used: NewOrUsed! } ... type Software { id: ID! used_by: Role! developed_by: String! description: String }
  • 공통적으로 가진 필드: id, used_by

tools.js

const { gql } = require('apollo-server') const typeDefs = gql` interface Tool { id: ID! used_by: Role! } ` const resolvers = { Tool: { __resolveType(tool, context, info) { if (tool.developed_by) { return 'Software' } if (tool.new_or_used) { return 'Equipment' } return null } } } module.exports = { typeDefs: typeDefs, resolvers: resolvers }

equipments.js

type Equipment implements Tool { id: ID! used_by: Role! count: Int new_or_used: NewOrUsed! }

equipments.js

type Software implements Tool { id: ID! used_by: Role! developed_by: String! description: String }

index.js

// ... const tools = require('./typedefs-resolvers/tools') // ... const typeDefs = [ // ... tools.typeDefs ] // ... const resolvers = [ // ... tools.resolvers ] // ...
query { equipments { id used_by count new_or_used } softwares { id used_by description developed_by } }

People 쿼리에 적용

people.js

const { gql } = require('apollo-server') const dbWorks = require('../dbWorks.js') const typeDefs = gql` type People { id: ID! first_name: String! last_name: String! sex: Sex! blood_type: BloodType! serve_years: Int! role: Role! team: ID! from: String! tools: [Tool] givens: [Given] } ` const resolvers = { Query: { people: (parent, args) => dbWorks.getPeople(args), person: (parent, args) => dbWorks.getPeople(args)[0] } } module.exports = { typeDefs: typeDefs, resolvers: resolvers }

_queries.js

const typeDefs = gql` type Query { people: [People], // ... } `

index.js

// ... const people = require('./typedefs-resolvers/people') // ... const typeDefs = [ // ... people.typeDefs ] // ... const resolvers = [ // ... people.resolvers ] // ...
query { people { id first_name last_name givens { __typename ... on Equipment { id used_by count new_or_used } ... on Supply { id team } } tools { __typename ... on Equipment { id used_by count new_or_used } ... on Software { id used_by description developed_by } } } }

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] GraphQL과 Apollo 3-3

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?