Initial commit

This commit is contained in:
2026-10-28 15:30:05 +09:00
commit 696e34f403
269 changed files with 33654 additions and 0 deletions
@@ -0,0 +1,19 @@
// backend/src/common/errors/error-codes.ts 에서 자동 생성된 파일입니다. 직접 수정하지 마세요.
export const ERROR_CODE_MESSAGES = {
SYS_001: '일시적인 시스템 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.',
REQ_001: '요청이 너무 많습니다. 잠시 후 다시 시도해 주세요.',
AUTH_001: '로그인이 필요한 서비스입니다. 로그인 후 이용해 주세요.',
AUTH_002: '안전을 위해 로그아웃 되었습니다. 다시 로그인해 주세요.',
AUTH_003: '해당 메뉴나 기능에 접근할 수 있는 권한이 없습니다.',
VAL_001: '입력하신 정보를 다시 확인해 주세요. (필수값 누락 또는 형식 오류)',
RES_001: '요청하신 정보나 페이지를 찾을 수 없습니다.',
BIZ_001: '요청하신 작업을 완료하지 못했습니다. 다시 시도해 주세요.',
FILE_001: '허용되지 않는 파일 형식입니다. 파일을 확인해 주세요.',
FILE_002: '파일 크기가 허용 범위를 초과했습니다.',
} as const
export type ErrorCode = keyof typeof ERROR_CODE_MESSAGES
/** 매핑 실패 시 사용하는 폴백 코드 */
export const FALLBACK_ERROR_CODE: ErrorCode = 'SYS_001'
+25
View File
@@ -0,0 +1,25 @@
// 목록 응답 공유 계약 — 백엔드 PaginatedResult 와 동일 구조
// (백엔드: backend/src/common/dto/pagination.dto.ts)
export interface PageInfo {
/** 다음 페이지 존재 여부 */
hasNext: boolean
/** 다음 요청에 넘길 커서. 마지막 페이지면 null */
nextCursor: string | null
/** 전체 개수. 계산 비용이 큰 경우 null 일 수 있다. */
total: number | null
}
export interface PaginatedResult<T> {
items: T[]
pageInfo: PageInfo
}
/** 커서 기반 목록 조회 쿼리 파라미터 */
export interface CursorPaginationQuery {
cursor?: string
limit?: number
}
/** 목록 API 기본 조회 개수 — 백엔드 PAGINATION_DEFAULT_LIMIT 와 동일 */
export const DEFAULT_PAGE_SIZE = 20
+20
View File
@@ -0,0 +1,20 @@
// 공통 포맷터 — 부수효과 없는 순수 함수만 작성
/**
* 숫자를 한국 통화 표기 (예: 12345 → "12,345원")
*/
export function formatCurrency(value: number): string {
return `${value.toLocaleString('ko-KR')}원`
}
/**
* Date 또는 ISO 문자열을 'YYYY-MM-DD' 형식으로 변환
*/
export function formatDate(input: Date | string): string {
const date = typeof input === 'string' ? new Date(input) : input
if (Number.isNaN(date.getTime())) return ''
const yyyy = date.getFullYear()
const mm = String(date.getMonth() + 1).padStart(2, '0')
const dd = String(date.getDate()).padStart(2, '0')
return `${yyyy}-${mm}-${dd}`
}