Repository
Repository는 Sequelize의 findAll과 findOne을 자동 페이지네이션 및 DTO 인식 쿼리 빌딩으로 감싸는 기본 클래스입니다.
이 페이지에서 찾을 수 있는 것
| 심볼 | 타입 | 설명 |
|---|---|---|
Repository | class | 제네릭 리포지토리 기본 클래스 |
IArgs<T> | interface | FindOptions<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.findAll과 this.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 }; // 선택: 페이지네이션 활성화
}| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
exportTo | typeof ExtendableDto | 예 | dto.middleware(undefined, user)를 통해 필드 가시성 규칙을 적용하는 데 사용되는 DTO 클래스. 쿼리에 포함할 컬럼을 결정합니다. |
user | any | 아니오 | 인증된 사용자 객체. 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.page와paging.limit에서 계산된limit과offset으로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 },
});
}
}컨트롤러에서 ExecuteArgs의 paging을 직접 전달합니다:
// 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);
}
}관련 항목
- ExtendableDto —
middleware()가 쿼리 옵션을 생성하는 방법 - @Dto 데코레이터 —
PaginationQueryDto와PaginationQueryType - TypeIs 복합 타입 —
TypeIs.ARRAY로 응답 문서화 - 데이터베이스 라이프사이클 — DB 초기화
Last updated on