Instagram-clone#4-Computed Field

Seo·2020년 5월 29일
0

InastagramClone

목록 보기
4/15

prisma db에 정의된 필드가 아닌 서버 내부적으로 사용하기 위한 필드
(조합하거나, 다른 필드에 의해 도출되거나)

Create Computed field(custom field)

# 🗂models.graphql
type User{
  ...
  firstName: String
  lastName: String
  fullName: String <- Computed field
  ...
}
  • firstName과 lastName은 create시 관리되는 항목이지만 fullName은 firstName과 lastName을 조합해서 만드는 글자로 사용될 것이다.

resolver 'Parent argument'

resolver 만들 시에 parameter중에 첫번째 parameter에 해당하는 항목이 parent에 해당한다.
resolver에서 parent는 무엇을 지칭하는가?
해당 resolver를 호출한 resolver를 가리킨다.

query {
  me {
    user {
      fullName
    }
  }
}
  • user의 parent는 me resolver를 가리킨다.
  • me의 parent는 undefined로 나타난다.(최상위 resolver이기 때문)

refactoring(see profile)

query {
  seeUser(id:"...") {
    user {
      fullName
    }
  }
}
Query: {
  seeUser: async (_, args) => {
    const { id } = args;
    const user = await prisma.user({ id });
    const posts = await prisma.user({ id }).posts();
    return {
      user,
      posts,
    };
  },
},
// ✅ add User resolver
User: {
  fullName: (parent) => {
    return `${parent.firstName} ${parent.lastName}`;
  },
},
  • seeUser resolver에 User resolver를 추가했다. fullName 항목은 prisma 필드로 등록되어 있지 않기 때문에 prisma에서는 가져올 수 없다.(computed field)
  • prisma에서 가져오지 못한 뒤에 내부서버에서 찾아본다.
  • model에 이미 User가 type 등록되어있고 fullName resolver를 통해 User resolver에 fullName 필드를 반환하기 때문에 여기서 값을 가져오게 된다.
  • seeUser query를 호출 했을 때는 당연히 fullName을 가져올 수 있는게 맞다. 그런데 me로 했을 시에도 잘 나온다?
    👉 이유는 typeDefs와 resolvers를 schema.js에 하나로 합쳐서 export하기 때문에 바라볼 수 있는 구조가 된다.

remind

  • computed field는 prisma에 필드로 등록하지 않고 내부적으로 사용하기 위해서 쓴다.
  • computed field에 값을 정의하는 방법은 해당 model과 computed field이름을 가진 resolver를 만듦으로써 내부적으로 사용할 수 있다.
profile
개발관심자

0개의 댓글