Skip to content

Latest commit

Β 

History

History
118 lines (92 loc) Β· 3.77 KB

api-connect.md

File metadata and controls

118 lines (92 loc) Β· 3.77 KB

전체 λ ˆμ΄μ–΄ ꡬ쑰

src/
β”œβ”€β”€ api/
β”‚ β”œβ”€β”€ dto/ # [μ„œλ²„ 규격] Request/Response μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ν•¨
β”‚ β”‚ β”œβ”€β”€ auth.dto.ts # 인증 κ΄€λ ¨ DTO
β”‚ β”‚ β”œβ”€β”€ presentations.dto.ts # ν”„λ‘œμ νŠΈ κ΄€λ ¨ DTO
β”‚ β”‚ └── video.dto.ts # λΉ„λ””μ˜€ μ—…λ‘œλ“œ/쑰회 DTO
β”‚ β”‚
β”‚ └── endpoints/ # [톡신 둜직] μ‹€μ œ API 호좜 및 데이터 λ³€ν™˜(toModel)함
β”‚ β”œβ”€β”€ auth.ts
β”‚ β”œβ”€β”€ presentations.ts # Repository μ—­ν•  μˆ˜ν–‰ν•¨
β”‚ └── videos.ts
β”‚
β”œβ”€β”€ hooks/ # [λΉ„μ¦ˆλ‹ˆμŠ€ 둜직] UIμ—μ„œ ν˜ΈμΆœν•  UseCase μ„±κ²©μ˜ ν›…μž„
β”‚ β”œβ”€β”€ useAuth.ts
β”‚ β”œβ”€β”€ usePresentation.ts # 데이터 호좜, λ‘œλ”©/μ—λŸ¬ μƒνƒœ 관리함
β”‚ └── useVideo.ts
β”‚
└── types/ # [도메인 λͺ¨λΈ] μ•± λ‚΄λΆ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ“°λŠ” 순수 데이터 νƒ€μž…μž„
└── presentation.ts # camelCase둜 μ •μ œλœ ν”„λ‘œμ νŠΈ λͺ¨λΈμž„

1. λ ˆμ΄μ–΄ ꡬ쑰 및 μ—­ν• 

  • DTO (Data Transfer Object): μ„œλ²„ ν†΅μ‹ μš© 데이터 κ·œκ²©μž„. μ„œλ²„ μŠ€νŽ™(JSON ν•„λ“œλͺ… λ“±)을 κ·ΈλŒ€λ‘œ λ°˜μ˜ν•¨.
  • Model (Domain Model): μ•± λ‚΄λΆ€μš© μ •μ œ λ°μ΄ν„°μž„. UIμ—μ„œ μ“°κΈ° μ’‹κ²Œ ν•„λ“œλͺ…을 λ°”κΎΈκ±°λ‚˜(camelCase) κ°€κ³΅ν•œ ν˜•νƒœμž„.
  • Service (Endpoints): μ‹€μ œ 톡신을 μˆ˜ν–‰ν•˜λŠ” λ‘œμ§μž„. DTOλ₯Ό λ°›μ•„ μ„œλ²„μ— 쏘고, 받은 데이터λ₯Ό Model둜 λ³€ν™˜(toModel)ν•΄μ€Œ.

2. 데이터 관리 μ „λž΅: DTO와 Model 뢄리

μ„œλ²„μ˜ 변경이 UI에 직접적인 영ν–₯을 μ£Όμ§€ μ•Šλ„λ‘ DTO와 Model 뢄리

  • DTO (Data Transfer Object): μ„œλ²„ 응닡 규격과 1:1 λ§€μΉ­ (snake_case λ“± μ„œλ²„ μŠ€νŽ™ μœ μ§€).
  • Model (Domain Model): μ•± λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μ •μ œλœ 데이터 (camelCase둜 λ³€ν™˜ 및 UI μΉœν™”μ  ꡬ쑰).

3. κ΅¬ν˜„ κ°€μ΄λ“œ

1. DTO μ •μ˜ (src/api/dto/)

  • μ„œλ²„ 응닡 규격과 1:1 맀칭함.
  • μ„œλ²„ ν•„λ“œλͺ…이 snake_caseλ©΄ κ·ΈλŒ€λ‘œ μœ μ§€ν•΄μ„œ ν˜Όμ„ μ„ 방지함.
/** λŒ€λ³Έ 볡원 μš”μ²­ DTO */
export interface RestoreScriptRequestDto {
  version: number;
}

/** λŒ€λ³Έ 볡원 응닡 DTO */
export interface RestoreScriptResponseDto {
  script_id: string; // μ„œλ²„ 고유 μŠ€νŽ™
  content: string;
  updated_at: string;
}

2. Service μž‘μ„± (src/api/endpoints/)

  • μ‹€μ œ fetchλ‚˜ axios ν˜ΈμΆœμ„ 담당함.
  • DTOλ₯Ό λ°›μ•„μ„œ UIμ—μ„œ μ“°κΈ° νŽΈν•œ Model둜 λ³€ν™˜ν•΄μ„œ 리턴함.
import { RestoreScriptRequestDto, RestoreScriptResponseDto } from '../dto/scripts.dto';

export const scriptService = {
  restoreScript: async (projectId: string, dto: RestoreScriptRequestDto) => {
    const response = await fetch(`/projects/${projectId}/scripts/restore`, {
      method: 'POST',
      body: JSON.stringify(dto),
    });
    const data: RestoreScriptResponseDto = await response.json();

    // Model둜 λ³€ν™˜ν•΄μ„œ λ°˜ν™˜ (UI 보호)
    return {
      id: data.script_id,
      content: data.content,
      updatedAt: data.updated_at,
    };
  }
};

3. Hook μž‘μ„± (src/hooks/)

UseCase의 역할을 μˆ˜ν–‰ν•˜λ©°, μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•  μƒνƒœμ™€ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

export const useRestoreScript = (projectId: string) => {
  const [isLoading, setIsLoading] = useState(false);

  const execute = async (version: number) => {
    setIsLoading(true);
    try {
      return await scriptService.restoreScript(projectId, { version });
    } finally {
      setIsLoading(false);
    }
  };

  return { execute, isLoading };
};

4. Hook λ ˆμ΄μ–΄ (UseCase μ—­ν• )

  • μ—­ν• : λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 및 μƒνƒœ 관리 담당함.
  • νŠΉμ§•: isLoading, isError 같은 톡신 μƒνƒœλ₯Ό μ»΄ν¬λ„ŒνŠΈμ— μ „λ‹¬ν•˜κ³ , ν•„μš” μ‹œ 데이터λ₯Ό Model둜 μ΅œμ’… 가곡함.
  • μž₯점: UI μ»΄ν¬λ„ŒνŠΈλŠ” 훅이 μ£ΌλŠ” λ°μ΄ν„°λž‘ ν•¨μˆ˜λ§Œ μ“°λ©΄ 됨.