[prisma] connection, $fragment

Review/백엔드 - 인스타그램 클론

[prisma] connection, $fragment

조커린 2020. 2. 13. 01:03

 

 

특정 Post 에 대한 Like이란 항목의 수를 세어 LikeCount 라는 데이터를 만들어야 하는 상황

 

데이터 모델은 이러하다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Post {
  id: ID! @id
  locationString
  caption: String!
  user: User!
  files: [File!]!
  likes: [Like!]!
  comments: [Comment!]!
}
 
type Like {
  id: ID! @id
  user: User!
  post: Post!
}
cs

 

prisma.like을 불러와서 열어보면 전부가 있을 거라고 생각했지만

prisma client는 생각보다 자세히 제공하지 않는다.

(이론적으로는 전부를 불러오면 데이터 트리를 타고 찾는 게 가능하지만)

떄문에 모든 데이터를 보고 싶을 때는 fragment라던지 원하는 모든 쿼리를 볼 수 있는 관계를 정의해줘야 한다. 

 

예시로 만든 seeFullPost (포스트에 대한 전체 내용 보기) 파일을 갖고 와보자~

 

seeFullPost.graphql

1
2
3
4
5
6
7
8
9
type FullPost{
  post:Post!
  comments: [Comment!]!
  likeCount: Int!
}
 
type Query{
    seeFullPost(id:String!):FullPost!
}
cs

 

seeFullPost.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import { prisma } from "../../../../generated/prisma-client";
import {COMMENT_FRAGMENT} from "../../../fragments";
 
export default {
    Query:{
        seeFullPost:async(_,args) => {
            const { id } = args;
            const post = await prisma.post({id});
            // const comments = await prisma.post({ id }).comments();
            const comments = await prisma.post({ id })
            .comments()
            .$fragment(COMMENT_FRAGMENT);
            ;
            const likeCount = await prisma.likesConnection({
                where: {post: { id }}
           }) //like 내부에 있는 post id 를 기준으로 like을 가져오고
           .aggregate() //그 데이터를 묶어서
           .count(); //수를 센다
 
            return {
                post ,
                comments,
                likeCount
            }
        }
    }
}
cs

 

관련 문서는 여기.

https://www.prisma.io/docs/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/#aggregations

 

Reading Data (TypeScript) with TypeScript - Prisma Docs

Overview The Prisma client is generated from your datamodel. Its API exposes CRUD and other operations for the models defined in the datamodel. For this page, we'll assume...

www.prisma.io

 

 

또한 관련된 모든 쿼리를 정의하는 대신 prisma 내부의 $fragment API 를 이용 가능하다.

불필요한 관계를 가져오지 않을 수 있고, 확실하게 가져올 수 잇으며 

데이터가 없을 때 에러가 안 뜨게 (...?) 가져올 수 있음 (임의의 관계를 만들어 줌)

 

fragment.js 를 만들어 모듈화 해서 사용했다.

 

fragment.js

1
2
3
4
5
6
7
8
9
export const COMMENT_FRAGMENT = `
    fragment CommentParts on Comment {
        id
        text 
        user{
            username
        }
    }
`;
cs

 

역따옴표 하고 fragment 로 선언하고 뫄뫄 on 뭐뭐 요렇게  만드는가 봄.

 

 

관련 공식 문서

https://www.prisma.io/docs/prisma-client/basic-data-access/reading-data-TYPESCRIPT-rsc3/#selecting-fields