Allra Fintech
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],
  }),
])