Convention
서버 액션 패턴
올라핀테크 프론트엔드 프로젝트 내에서 지켜야하는 서버 액션 패턴을 서술합니다.
서버 액션 패턴
Server Actions 구조
'use server'지시어 사용domain/{domain}/actions/{action-name}/구조
domain/auth/actions/sign-in/
├── index.ts # Server Action
├── schema.ts # Zod 스키마 및 타입
└── fixture.ts # Mock 데이터 (선택)Action 파일 예시
// domain/auth/actions/sign-in/index.ts
'use server'
import { API_SIGNATURE } from '@/shared/constants/api-signature'
import { handleAction } from '@/shared/lib/server-action/utils/handle-action'
import { type SignInRequest, signInResponseSchema } from './schema'
export const signIn = async (data: SignInRequest) => {
return handleAction({
signature: API_SIGNATURE.AUTH.SIGN_IN,
data,
schema: signInResponseSchema,
})
}Schema 파일 예시
// domain/auth/actions/sign-in/schema.ts
import { z } from 'zod'
import { createApiResponseSchema } from '@/shared/lib/server-action/schema'
import { idSchema } from '@/shared/schemas/id-schema'
import { passwordSchema } from '@/shared/schemas/password-schema'
export const signInRequestSchema = z.object({
id: idSchema,
password: passwordSchema,
})
export type SignInRequest = z.infer<typeof signInRequestSchema>
export const SIGN_IN_CODE = {
SUCCESS: 'SUCCESS',
NOT_FOUND_0001: 'NOT_FOUND_0001',
NOT_FOUND_0002: 'NOT_FOUND_0002',
INTERNAL_SERVER_ERROR_0001: 'INTERNAL_SERVER_ERROR_0001',
// ...
} as const
export const signInSuccessDataSchema = z.object({
accessToken: z.string(),
// ...
})
export type SignInSuccessData = z.infer<typeof signInSuccessDataSchema>
export const signInResponseSchema = z.union([
createApiResponseSchema({
dataSchema: signInSuccessDataSchema,
codeEnum: [SIGN_IN_CODE.SUCCESS],
}),
createApiResponseSchema({
dataSchema: z.null(),
codeEnum: [SIGN_IN_CODE.NOT_FOUND_0001],
}),
])