Skip to Content

Repository

Repository는 Sequelize의 findAllfindOne을 자동 페이지네이션 및 DTO 인식 쿼리 빌딩으로 감싸는 기본 클래스입니다.

이 페이지에서 찾을 수 있는 것

심볼타입설명
Repositoryclass제네릭 리포지토리 기본 클래스
IArgs<T>interfaceFindOptions<T> 확장 인터페이스
findAll()메서드전체/페이지네이션 조회
findOne()메서드단일 레코드 조회

임포트

import { Repository } from '@asapjs/sequelize';

클래스 정의

class Repository { public repository: { findAll<T extends Model>(model: ModelCtor<T>, args: IArgs<T>): Promise<FindAllResponse<T>>; findOne<T extends Model>(model: ModelCtor<T>, args: IArgs<T>): Promise<T | null>; }; }

Application 레이어 클래스에서 Repository를 상속하면 this.repository.findAllthis.repository.findOne에 접근할 수 있습니다.


IArgs<T>

IArgs<T>는 Sequelize의 FindOptions<T>를 세 가지 추가 필드로 확장합니다:

interface IArgs<T extends Model> extends FindOptions<T> { exportTo: typeof ExtendableDto; // 필수 user?: any; // 선택: DTO의 middleware()에 전달 paging?: { page: number; limit: number }; // 선택: 페이지네이션 활성화 }
필드타입필수 여부설명
exportTotypeof ExtendableDtodto.middleware(undefined, user)를 통해 필드 가시성 규칙을 적용하는 데 사용되는 DTO 클래스. 쿼리에 포함할 컬럼을 결정합니다.
userany아니오인증된 사용자 객체. DTO의 middleware() 메서드에 전달됩니다.
paging{ page: number; limit: number }아니오제공되면 findAndCountAll을 활성화하고 페이지네이션된 응답 엔벨로프를 반환합니다. page는 0 기반입니다.

표준 Sequelize FindOptions 필드(where, include, order, attributes 등)도 모두 허용되며 DTO에서 파생된 쿼리 옵션과 병합됩니다.


findAll()

repository.findAll<T>(model: ModelCtor<T>, args: IArgs<T>): Promise<T[] | PaginatedResponse<T>>
  • paging 없을 때: model.findAll(query)를 실행하고 일반 배열을 반환합니다.
  • paging 있을 때: paging.pagepaging.limit에서 계산된 limitoffset으로 model.findAndCountAll(query)를 실행하고 페이지네이션된 엔벨로프를 반환합니다.

페이지네이션 응답 형태

paging이 제공되면 findAll은 다음 형태의 객체를 반환합니다:

{ data: T[]; // 현재 페이지의 모델 인스턴스 배열 page: number; // 현재 페이지 (0 기반) page_size: number; // 페이지당 항목 수 (요청된 limit) max_page: number; // 마지막 페이지 인덱스: Math.ceil(total / limit) - 1 has_prev: boolean; // page > 0이면 true has_next: boolean; // max_page > page이면 true total_elements: number; // 전체 페이지에 걸친 총 레코드 수 }

findOne()

repository.findOne<T>(model: ModelCtor<T>, args: IArgs<T>): Promise<T | null>

model.findOne(query)를 실행하고 첫 번째 매칭 레코드를 반환하거나, 없으면 null을 반환합니다.


예제

// src/user/application/UserApplication.ts import { Repository } from '@asapjs/sequelize'; import UsersTable from '../domain/entity/UsersTable'; import UserInfoDto from '../dto/UserInfoDto'; export default class UserApplication extends Repository { async getUsers(paging: { page: number; limit: number }, user: any) { return await this.repository.findAll(UsersTable, { exportTo: UserInfoDto, user, paging, order: [['created_at', 'DESC']], }); } async getUserById(id: number, user: any) { return await this.repository.findOne(UsersTable, { exportTo: UserInfoDto, user, where: { id }, }); } }

컨트롤러에서 ExecuteArgspaging을 직접 전달합니다:

// src/user/controller/UserController.ts import { RouterController, Get, ExecuteArgs } from '@asapjs/router'; import { PaginationQueryDto, TypeIs } from '@asapjs/sequelize'; import UserApplication from '../application/UserApplication'; import UserInfoDto from '../dto/UserInfoDto'; export default class UserController extends RouterController { public tag = 'User'; public basePath = '/users'; private userService: UserApplication; constructor() { super(); this.registerRoutes(); this.userService = new UserApplication(); } @Get('/', { title: 'List users', query: PaginationQueryDto, response: TypeIs.ARRAY(UserInfoDto), auth: true, }) async getUsers({ paging, user }: ExecuteArgs) { return await this.userService.getUsers(paging, user); } }

관련 항목

Last updated on