이번에 새로운 업무를 인수인계 받게 되었다.
인수인계 받은 서비스는 '운영관리자' 서비스였다. 운영관리자는 각 서비스에 해당하는 유통사 정보나 영업담당자 등 전반적인 데이터 관리를 하는 관리자 사이트이다.
운영관리자는 nestjs로 만들어져 있어서 조금은 이해하기 편하겠다 싶었는데... 이전에 나는 rest api만을 사용했는데 운영관리자에서는 graphql을 사용하고 있었다.
특히 이번에 코드를 보면서 @ResolveField 라는 데코레이터를 보게 되었다.
해당 데코레이터를 처음보는지라 어떤 역할인지 감이 안왔다.
희안하게도 메인 query가 있는데 해당 쿼리는 분명히 return 값으로 {hi:20} 에 대해서만 리턴하는데 query 리턴값으로 {hi, answer,wow} 등 여러가지 값들이 더 추가되어서 나오는게 아닌가?
그래서 확인해보니 이 resolveField의 반환값이었던 것이었다.
그래서 resolveField가 무엇인고~ 하니 다음과 같다.
@ResolveField 데코레이터는 특정필드를 반환할 때 추가적인 로직을 실행하게 해주는 역할을 하는데, 이는 데이터가 다른 객체와의 관계를 통해 얻어지는 경우나, 복잡한 계산을 필요로 하는 필드의 경우에 유용하게 사용된다.
코드를 잠시 보자면
import { Resolver, ResolveField, Parent } from '@nestjs/graphql';
import { User } from './user.entity';
import { Post } from '../posts/post.entity';
import { PostsService } from '../posts/posts.service';
@Resolver(of => User)
export class UserResolver {
constructor(
private postsService: PostsService,
) {}
@ResolveField(of => [Post])
async posts(@Parent() user: User) {
const { id } = user;
return this.postsService.findAll({ userId: id });
}
}
위의 예시에서, User 객체의 posts 필드는 @ResolveField 데코레이터를 사용하여 해결됩니다. 이 함수는 User 객체를 인수로 받고, 그 사용자의 모든 게시물을 반환한다.
@Parent 데코레이터는 부모 객체, 즉 현재 필드를 포함하는 객체를 가져오는 데 사용된다.
이러한 방식은 데이터를 필요에 따라 효율적으로 가져올 수 있기에 모든 사용자와 기타 게시물들을 한번에 가져오는 대신, 사용자가 요청될 때에만 데이터를 가져온다.
이렇게 하면 데이터베이스의 부하를 줄일 수 있기 때문에 한 쿼리에 모두 때려박는게 아닌 리졸브필드를 이용해서 쿼리를 만든다고 한다.
'백엔드 > NestJs' 카테고리의 다른 글
[typeorm] getRawMany(), getMany() (1) | 2023.12.12 |
---|---|
[nestjs] PickType,OmitType, PartialType (0) | 2023.09.25 |
권한설정 (0) | 2023.07.18 |
[nestjs] new DataLoader (0) | 2023.07.02 |
[nestjs] nx 모노레포?? (0) | 2023.06.25 |