interface와 union은 다양한 타입 간의 공통점을 다루는 데 사용됩니다.
// interface 예시
...
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
}
}
}
...
// union 예시
...
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
}
}
}
...
이는 객체 타입이 특정 필드를 가질 것임을 보장하는 방법으로 사용됩니다. 이를 통해 다양한 타입이 같은 인터페이스를 구현할 수 있으며, 이는 각 타입이 해당 인터페이스의 필드를 가지고 있음을 보장합니다. 예를 들어, 여기서 Tool 인터페이스는 id와 used_by 필드를 가지는데, 이는 Tool 인터페이스를 구현하는 모든 타입이 반드시 이 두 필드를 가지고 있어야 함을 의미합니다.
유니온 멤버 타입은 서로 관련이 없을 수 있으며, 공통 필드를 공유하지 않습니다. 이는 서로 다른 타입의 객체를 반환할 수 있는 필드를 생성하는 데 유용합니다. 예를 들어, 여기서 Given 유니온은 Equipment 또는 Supply 타입일 수 있습니다.
인터페이스와 유니온 모두 인라인 프래그먼트를 사용하여 쿼리에서 구체적인 타입에 대한 필드를 선택할 수 있게 해줍니다. __resolveType 리졸버를 통해 실제 객체의 타입을 결정하는 데도 사용됩니다.