# prisma-client-lib 문법 분석 가이드 입니다.
# prisma fragment 파트
# 단순히 공부한 내용을 열거합니다.
---------------------------------------------------------------------------------------------------------------------------
[prisma.user({id}).$fragment( [FRAGE_MENT] ) ;
---------------------------------------------------------------------------------------------------------------------------
# 1. 문제점: : prisma는 딥한 관계를 안준다.
예를들어 User는 posts라는 필드면들은 Post 객체들을 참조한다고 가정했을때.
prisma는 애초에 Post를 null로 준다.
즉) 내가 사용자인데 나의 Post 객체들을 못본다는 점. Post들을 null로 prisma가 준다.
만약에 Post들을 다 준다면, 보안성에 문제가 생긴다.
User 객체를 얻어왔을때 User가 가진 Post들도 정보를 준다면, Post에도 연결된 User의 id 정보가 있다.
그렇다면 user 쿼리에서 Post쿼리로 갔다가 다시 user쿼리로 갔다가 또 다시 Post 쿼리로 갔다가 이런 무한한 요청이 가능하기 때문에. 데이터 subselection의 깊이는 1로 준다는 점이다.
# 2. 해결방법1 : fragment 설정:
const SEE_USER = `
fragment Fucking on AssholeUser{
name
password
posts{
caption
}
}
`;
type Query {
seeUser(id: String): User!
}
Query: {
seeUser: async (_, { id }) => {
const res = await prisma.user({ id }).$fragment(SEE_USER);
return res;
},
}
# 3. 해결방법 2 : computed field 설정:
# 3.1 computed field 란?
---------------------------------------------------------------------------------------------------------------------------
[ computed filed ] : 리소버에서 특정 타입의 특정 필드를 리턴하는 개념.
---------------------------------------------------------------------------------------------------------------------------
```js
--------------------------------------------------------------------------------------------
1. User의 models.graphql(클라이언트 스키마)에는 fullName을 정의 했음. 이는 반드시 리소버에서 해결을 해주어야 한다.
type User {
...
firstName: String
lastName: String
fullName: String
}
--------------------------------------------------------------------------------------------
2. me.graphql에 User을 반환해주는 어떠한 쿼리 스키마 정의 ( 단지 User 티입의 fullName을 부르는 방법중 하나.)
type Query {
me: User!
}
--------------------------------------------------------------------------------------------
3. User의 fullName을 요청했는데, prisma에 분명해 없기 때문에, 리소버를 더 찾아본다. Query,Mutation이 아닌, 타입 User안에 fullName이 정의되어 있다.
import { prisma } from "../../../../generated/prisma-client";
export default {
Query: {
...
},
// 지금까지 리소버는 쿼리나 뮤테이션 이었어 - 하지만 리소버에 (커스텀 타입필드) 가 있는경우 : parent는 상위 user를 부른 모든 리소버가 될수 있다. - parent는 그 리소버를 부른다.
User: {
fullName: (parent, __, { request, isAuthenticated }) => {
//첫번째 인자:부모 , 두번쨰는 args, 세번쨰는 문맥
//parent는 꼭 위의 Query:me가 아니더라도 User.fullName을 요청했던 모든 리소버가 될 수 있다.
//console.log(parent);
return `${parent.firstName} ${parent.lastName}`;
}
}
};
# 3.2 다음 처럼 computed field를 만들어 주면, prisma 가 미쳐 주지 못한 정보들은 다시 graphql-yoga 서버에서 resolver를 통해 prisma에게 다시 요청하게 되고, 이로써 fragment 사용 없이 해결 가능하다.
import { prisma } from "../../../generated/prisma-client";
export default {
User: {
posts: ({ id }) => prisma.user({ id }).posts(),
following: ({ id }) => prisma.user({ id }).following(),
followers: ({ id }) => prisma.user({ id }).followers(),
likes: ({ id }) => prisma.user({ id }).likes(),
comments: ({ id }) => prisma.user({ id }).comments(),
rooms: ({ id }) => prisma.user({ id }).rooms(),
postsCount: ({ id }) =>
prisma
.postsConnection({ where: { user: { id: id } } })
.aggregate()
.count(),
followingCount: ({ id }) =>
prisma
.usersConnection({ where: { followers_some: { id } } })
.aggregate()
.count(),
followersCount: ({ id }) =>
prisma
.usersConnection({ where: { following_none: { id } } })
.aggregate()
.count(),
fullName: (parent, __, { request, isAuthenticated }) => {
return `${parent.firstName} ${parent.lastName}`;
},
isFollowing: async (parent, _, { request }) => {
const { user } = request;
const { id: parentId } = parent;
try {
return prisma.$exists.user({
AND: [
{
id: user.id
},
{
following_some: {
id: parentId
}
}
]
});
} catch {
return false;
}
},
isSelf: (parent, _, { request }) => {
const { user } = request;
const { id: parentId } = parent;
return user.id === parentId;
}
}
};
DOS IMPACT - WEB Developer
KIM DO YOUNG
WEB : REACT JS | REACT NATIVE | GraphQL PRISMA
'GraphQL BackEnd > Lecture' 카테고리의 다른 글
GraphQL + Prisma (6) Prisma 뮤데티어션 파트 (0) | 2020.02.07 |
---|---|
GraphQL + Prisma (5) Prisma Connection파트 (0) | 2020.02.07 |
GraphQL + Prisma (2) Prisma 쿼리파트 (0) | 2020.02.07 |
GraphQL + Prisma (1) 프리즈마 데이터 모델 분석 (0) | 2020.02.07 |
GraphQL + Prisma 환경설정 (0) | 2020.02.03 |