Skip to content

Latest commit

Β 

History

History
504 lines (451 loc) Β· 20.9 KB

File metadata and controls

504 lines (451 loc) Β· 20.9 KB

Multi-scope FSD ꡬ쑰 κ°€μ΄λ“œ

πŸ“ src/app/ - Next.js App Router (λΌμš°νŒ… μ „μš©)

src/app/
β”œβ”€β”€ layout.tsx                    # μ „μ—­ λ ˆμ΄μ•„μ›ƒ (λͺ¨λ“  νŽ˜μ΄μ§€ 곡톡 헀더/ν‘Έν„°)
β”œβ”€β”€ page.tsx                      # λ©”μΈνŽ˜μ΄μ§€ (νžˆμ–΄λ‘œμ„Ήμ…˜ + 졜근 곡지사항)
β”œβ”€β”€ providers.tsx                 # μ „μ—­ Provider μ„€μ • (React Query, Theme λ“±)
β”œβ”€β”€ globals.css                   # μ „μ—­ μŠ€νƒ€μΌ (Tailwind, 리셋 CSS)
β”‚
β”œβ”€β”€ (support)/                    # 고객용 Route Group
β”‚   β”œβ”€β”€ layout.tsx                # Support μ „μš© λ ˆμ΄μ•„μ›ƒ (breadcrumb λ“±)
β”‚   β”œβ”€β”€ qa/page.tsx               # β†’ support/features/qa둜 μœ„μž„
β”‚   β”œβ”€β”€ faq/page.tsx              # β†’ support/features/faq둜 μœ„μž„
β”‚   └── notice/
β”‚       β”œβ”€β”€ page.tsx              # β†’ support/features/notice/list둜 μœ„μž„
β”‚       └── [id]/page.tsx         # β†’ support/features/notice/detail둜 μœ„μž„
β”‚
β”œβ”€β”€ (auth)/                       # 인증 μ „μš© Route Group
β”‚   β”œβ”€β”€ layout.tsx                # 인증 μ „μš© λ ˆμ΄μ•„μ›ƒ (헀더/ν‘Έν„° μ—†μŒ)
β”‚   └── admin-login/page.tsx      # β†’ admin/features/auth/login으둜 μœ„μž„
β”‚
└── (super-admin)/                # κ΄€λ¦¬μžμš© Route Group
    β”œβ”€β”€ layout.tsx                # Admin λ ˆμ΄μ•„μ›ƒ + κΆŒν•œ 체크
    β”œβ”€β”€ dashboard/page.tsx        # κ°„λ‹¨ν•œ ν™˜μ˜ λ©”μ‹œμ§€
    β”œβ”€β”€ users/
    β”‚   β”œβ”€β”€ page.tsx              # β†’ admin/features/user/list둜 μœ„μž„
    β”‚   └── [id]/page.tsx         # β†’ admin/features/user/detail둜 μœ„μž„
    β”œβ”€β”€ qa-manage/                # Q&A 관리 (경둜 좩돌 ν•΄κ²°)
    β”‚   β”œβ”€β”€ page.tsx              # β†’ admin/features/qa/list둜 μœ„μž„
    β”‚   └── [id]/page.tsx         # β†’ admin/features/qa/detail둜 μœ„μž„
    β”œβ”€β”€ faq-manage/               # FAQ 관리 (경둜 좩돌 ν•΄κ²°)
    β”‚   β”œβ”€β”€ page.tsx              # β†’ admin/features/faq/list둜 μœ„μž„
    β”‚   β”œβ”€β”€ create/page.tsx       # β†’ admin/features/faq/create둜 μœ„μž„
    β”‚   └── [id]/
    β”‚       β”œβ”€β”€ page.tsx          # β†’ admin/features/faq/detail둜 μœ„μž„
    β”‚       └── edit/page.tsx     # β†’ admin/features/faq/edit둜 μœ„μž„
    β”œβ”€β”€ notices/
    β”‚   β”œβ”€β”€ page.tsx              # β†’ admin/features/notice/list둜 μœ„μž„
    β”‚   β”œβ”€β”€ create/page.tsx       # β†’ admin/features/notice/create둜 μœ„μž„
    β”‚   └── [id]/
    β”‚       β”œβ”€β”€ page.tsx          # β†’ admin/features/notice/detail둜 μœ„μž„
    β”‚       └── edit/page.tsx     # β†’ admin/features/notice/edit둜 μœ„μž„
    └── settings/page.tsx         # β†’ admin/features/settings둜 μœ„μž„

πŸ“ App Router κ·œμΉ™:

  • 였직 λΌμš°νŒ…λ§Œ λ‹΄λ‹Ή - λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κΈˆμ§€
  • λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλŠ” ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ features둜 μœ„μž„
  • Route Groups둜 μŠ€μ½”ν”„ 뢄리 (support, auth, super-admin)

πŸ“ src/support/ - Support μŠ€μ½”ν”„ (고객 지원)

🎯 Support Features (고객용 κΈ°λŠ₯)

src/support/features/
β”œβ”€β”€ qa/                           # Q&A κΈ°λŠ₯ (고객용 - μž‘μ„±/쑰회)
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   └── createQA.ts           # 고객 질문 μž‘μ„± API만
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”œβ”€β”€ useQAList.ts          # λ‚΄ Q&A λͺ©λ‘ 쑰회 ν›…
β”‚   β”‚   └── useQAForm.ts          # Q&A μž‘μ„± 폼 ν›…
β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”œβ”€β”€ QAPage.tsx            # νƒ­ ν˜•νƒœ 메인 νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ QAForm.tsx            # 질문 μž‘μ„± 폼
β”‚   β”‚   β”œβ”€β”€ QAAuthForm.tsx        # νœ΄λŒ€ν°+λΉ„λ°€λ²ˆν˜Έ 인증
β”‚   β”‚   β”œβ”€β”€ QAList.tsx            # λ‚΄ 질문 λͺ©λ‘
β”‚   β”‚   └── QAItem.tsx            # κ°œλ³„ Q&A μ•„μ΄ν…œ
β”‚   └── index.ts
β”‚
β”œβ”€β”€ faq/                          # FAQ κΈ°λŠ₯ (고객용 - 읽기 μ „μš©)
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   └── fetchFAQs.ts          # 곡개된 FAQ만 쑰회
β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   └── useFAQList.ts         # FAQ λͺ©λ‘ 쑰회 ν›…
β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”œβ”€β”€ FAQPage.tsx           # μ•„μ½”λ””μ–Έ ν˜•νƒœ 메인 νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ FAQAccordion.tsx      # FAQ μ•„μ½”λ””μ–Έ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ FAQItem.tsx           # κ°œλ³„ FAQ μ•„μ΄ν…œ
β”‚   β”‚   └── FAQSearch.tsx         # FAQ 검색 κΈ°λŠ₯
β”‚   └── index.ts
β”‚
└── notice/                       # 곡지사항 쑰회 (고객용 - 읽기 μ „μš©)
    β”œβ”€β”€ list/
    β”‚   β”œβ”€β”€ api/
    β”‚   β”‚   └── fetchPublicNotices.ts # 곡개 κ³΅μ§€μ‚¬ν•­λ§Œ 쑰회
    β”‚   β”œβ”€β”€ hooks/
    β”‚   β”‚   └── useNoticeList.ts   # support용 곡지사항 λͺ©λ‘ ν›…
    β”‚   β”œβ”€β”€ ui/
    β”‚   β”‚   β”œβ”€β”€ NoticeListPage.tsx # support용 곡지사항 λͺ©λ‘
    β”‚   β”‚   └── NoticeCard.tsx     # support용 곡지사항 μΉ΄λ“œ
    β”‚   └── index.ts
    └── detail/
        β”œβ”€β”€ ui/
        β”‚   └── NoticeDetailPage.tsx # support용 곡지사항 상세
        └── index.ts

πŸ”§ Support Shared (Support μŠ€μ½”ν”„ 곡톡)

src/support/shared/
β”œβ”€β”€ ui/
β”‚   β”œβ”€β”€ SupportLayout.tsx         # Support μ „μš© λ ˆμ΄μ•„μ›ƒ
β”‚   β”œβ”€β”€ SupportHeader.tsx         # Support μ „μš© 헀더
β”‚   β”œβ”€β”€ SupportBreadcrumb.tsx     # Support μ „μš© breadcrumb
β”‚   └── SupportSidebar.tsx        # Support 도움말 μ‚¬μ΄λ“œλ°”
β”œβ”€β”€ constants/
β”‚   └── supportRoutes.ts          # Support 라우트 μƒμˆ˜
└── index.ts

πŸ“ Support μŠ€μ½”ν”„ κ·œμΉ™:

  • 고객용 κΈ°λŠ₯만 - 읽기 쀑심, μ œν•œλœ μ“°κΈ° (Q&A μž‘μ„±λ§Œ)
  • 인증 λΆˆν•„μš” - νœ΄λŒ€ν°+λΉ„λ°€λ²ˆν˜Έλ‘œ 간단 인증
  • 곡개 λ°μ΄ν„°λ§Œ - λΉ„κ³΅κ°œ/κ΄€λ¦¬μž 데이터 μ ‘κ·Ό κΈˆμ§€

πŸ“ src/admin/ - Admin μŠ€μ½”ν”„ (κ΄€λ¦¬μž)

🎯 Admin Features (κ΄€λ¦¬μžμš© κΈ°λŠ₯)

src/admin/features/
β”œβ”€β”€ auth/                         # κ΄€λ¦¬μž 인증 κΈ°λŠ₯
β”‚   └── login/
β”‚       β”œβ”€β”€ api/
β”‚       β”‚   β”œβ”€β”€ adminLogin.ts     # κ΄€λ¦¬μž 둜그인 API
β”‚       β”‚   └── loginSchema.ts    # 둜그인 폼 μœ νš¨μ„± 검사
β”‚       β”œβ”€β”€ hooks/
β”‚       β”‚   └── useAdminLogin.ts  # κ΄€λ¦¬μž 둜그인 ν›…
β”‚       β”œβ”€β”€ ui/
β”‚       β”‚   β”œβ”€β”€ AdminLoginPage.tsx # κ΄€λ¦¬μž 둜그인 νŽ˜μ΄μ§€
β”‚       β”‚   └── LoginForm.tsx     # 둜그인 폼 μ»΄ν¬λ„ŒνŠΈ
β”‚       └── index.ts
β”‚
β”œβ”€β”€ user/                         # μ‚¬μš©μž 관리 κΈ°λŠ₯
β”‚   β”œβ”€β”€ list/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   └── fetchAllUsers.ts  # λͺ¨λ“  μ‚¬μš©μž 쑰회 API
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useUserManagement.ts # μ‚¬μš©μž 관리 ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ UserListPage.tsx  # μ‚¬μš©μž λͺ©λ‘ νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ UserTable.tsx     # μ‚¬μš©μž ν…Œμ΄λΈ”
β”‚   β”‚   β”‚   └── UserFilter.tsx    # μ‚¬μš©μž ν•„ν„°
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ detail/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── UserDetailPage.tsx # μ‚¬μš©μž 상세 νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   └── shared/
β”‚       β”œβ”€β”€ ui/
β”‚       β”‚   β”œβ”€β”€ UserForm.tsx      # μ‚¬μš©μž 생성/μˆ˜μ • 곡톡 폼
β”‚       β”‚   └── UserActions.tsx   # μ‚¬μš©μž μ•‘μ…˜ λ²„νŠΌλ“€
β”‚       └── index.ts
β”‚
β”œβ”€β”€ qa/                           # Q&A 관리 κΈ°λŠ₯
β”‚   β”œβ”€β”€ list/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   └── fetchAllQAs.ts    # λͺ¨λ“  Q&A 쑰회 API
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useQAManagement.ts # Q&A 관리 ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ QAManagePage.tsx  # Q&A 관리 메인 νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ QAManageTable.tsx # Q&A 관리 ν…Œμ΄λΈ”
β”‚   β”‚   β”‚   └── QAStatusFilter.tsx # Q&A μƒνƒœ ν•„ν„°
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ detail/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   β”œβ”€β”€ answerQA.ts       # Q&A λ‹΅λ³€ API
β”‚   β”‚   β”‚   └── assignQA.ts       # Q&A λ‹΄λ‹Ήμž λ°°μ • API
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useQAAnswer.ts    # Q&A λ‹΅λ³€ ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ QADetailPage.tsx  # Q&A 상세 관리 νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ QAAnswerForm.tsx  # λ‹΅λ³€ μž‘μ„± 폼
β”‚   β”‚   β”‚   └── QAHistory.tsx     # Q&A νžˆμŠ€ν† λ¦¬
β”‚   β”‚   └── index.ts
β”‚   └── shared/
β”‚       β”œβ”€β”€ ui/
β”‚       β”‚   β”œβ”€β”€ QAAdminItem.tsx   # κ΄€λ¦¬μžμš© Q&A μ•„μ΄ν…œ
β”‚       β”‚   └── QAAssignModal.tsx # λ‹΄λ‹Ήμž λ°°μ • λͺ¨λ‹¬
β”‚       └── index.ts
β”‚
β”œβ”€β”€ faq/                          # FAQ 관리 κΈ°λŠ₯
β”‚   β”œβ”€β”€ list/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   └── fetchAllFAQs.ts   # λͺ¨λ“  FAQ 쑰회 (κ΄€λ¦¬μžμš©)
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useFAQManagement.ts # FAQ 관리 ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ FAQManagePage.tsx # FAQ 관리 메인 νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ FAQManageTable.tsx # FAQ 관리 ν…Œμ΄λΈ”
β”‚   β”‚   β”‚   └── FAQStatusFilter.tsx # FAQ μƒνƒœ ν•„ν„°
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ create/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   └── createFAQ.ts      # FAQ 생성 API
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useFAQCreate.ts   # FAQ 생성 ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── FAQCreatePage.tsx # FAQ 생성 νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ edit/
β”‚   β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”‚   └── updateFAQ.ts      # FAQ μˆ˜μ • API
β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   └── useFAQEdit.ts     # FAQ μˆ˜μ • ν›…
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── FAQEditPage.tsx   # FAQ μˆ˜μ • νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ detail/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── FAQDetailPage.tsx # FAQ 상세 관리 νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   └── shared/
β”‚       β”œβ”€β”€ ui/
β”‚       β”‚   β”œβ”€β”€ FAQForm.tsx       # FAQ 생성/μˆ˜μ • 곡톡 폼
β”‚       β”‚   β”œβ”€β”€ FAQEditor.tsx     # FAQ 에디터 (λ§ˆν¬λ‹€μš΄)
β”‚       β”‚   └── FAQPreview.tsx    # FAQ 미리보기
β”‚       └── index.ts
β”‚
β”œβ”€β”€ notice/                       # 곡지사항 관리 κΈ°λŠ₯
β”‚   β”œβ”€β”€ list/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   β”œβ”€β”€ AdminNoticeListPage.tsx # κ΄€λ¦¬μžμš© 곡지사항 λͺ©λ‘
β”‚   β”‚   β”‚   └── NoticeManageTable.tsx # 곡지사항 관리 ν…Œμ΄λΈ”
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ create/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── NoticeCreatePage.tsx # 곡지사항 생성 νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ edit/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── NoticeEditPage.tsx # 곡지사항 μˆ˜μ • νŽ˜μ΄μ§€
β”‚   β”‚   └── index.ts
β”‚   β”œβ”€β”€ detail/
β”‚   β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”‚   └── AdminNoticeDetailPage.tsx # κ΄€λ¦¬μžμš© 곡지사항 상세
β”‚   β”‚   └── index.ts
β”‚   └── shared/
β”‚       β”œβ”€β”€ ui/
β”‚       β”‚   β”œβ”€β”€ NoticeForm.tsx    # 곡지사항 생성/μˆ˜μ • 곡톡 폼
β”‚       β”‚   └── NoticeEditor.tsx  # κ΄€λ¦¬μžμš© 에디터
β”‚       └── index.ts
β”‚
└── settings/                     # μ‹œμŠ€ν…œ μ„€μ • κΈ°λŠ₯
    β”œβ”€β”€ api/
    β”‚   └── updateSettings.ts     # μ‹œμŠ€ν…œ μ„€μ • API
    β”œβ”€β”€ hooks/
    β”‚   └── useSettings.ts        # μ„€μ • 관리 ν›…
    β”œβ”€β”€ ui/
    β”‚   β”œβ”€β”€ SettingsPage.tsx      # μ„€μ • νŽ˜μ΄μ§€
    β”‚   β”œβ”€β”€ GeneralSettings.tsx   # 일반 μ„€μ •
    β”‚   └── SecuritySettings.tsx  # λ³΄μ•ˆ μ„€μ •
    └── index.ts

🏒 Admin Entities (κ΄€λ¦¬μž μ „μš© 도메인)

src/admin/entities/
└── user/                        # μ‚¬μš©μž 도메인 (admin μ „μš©)
    β”œβ”€β”€ types/
    β”‚   β”œβ”€β”€ User.ts               # κ΄€λ¦¬μžμš© μ‚¬μš©μž νƒ€μž… (κΆŒν•œ 정보 포함)
    β”‚   └── AdminUser.ts          # κ΄€λ¦¬μž νƒ€μž…
    β”œβ”€β”€ api/
    β”‚   β”œβ”€β”€ fetchUsers.ts         # μ‚¬μš©μž 쑰회 API
    β”‚   β”œβ”€β”€ createUser.ts         # μ‚¬μš©μž 생성 API
    β”‚   └── userApi.ts            # μ‚¬μš©μž κ΄€λ ¨ API λͺ¨μŒ
    β”œβ”€β”€ ui/
    β”‚   β”œβ”€β”€ UserRoleBadge.tsx     # μ‚¬μš©μž μ—­ν•  뱃지
    β”‚   └── UserStatusBadge.tsx   # μ‚¬μš©μž μƒνƒœ 뱃지
    └── index.ts

πŸ”§ Admin Shared (Admin μŠ€μ½”ν”„ 곡톡)

src/admin/shared/
β”œβ”€β”€ ui/
β”‚   β”œβ”€β”€ AdminLayout.tsx           # Admin λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ AdminSidebar.tsx          # Admin μ‚¬μ΄λ“œλ°”
β”‚   β”œβ”€β”€ AdminHeader.tsx           # Admin 헀더
β”‚   └── AdminBreadcrumb.tsx       # Admin breadcrumb
β”œβ”€β”€ constants/
β”‚   β”œβ”€β”€ adminRoutes.ts            # Admin 라우트 μƒμˆ˜
β”‚   └── permissions.ts            # κΆŒν•œ μƒμˆ˜
β”œβ”€β”€ hooks/
β”‚   β”œβ”€β”€ useAdminAuth.ts           # κ΄€λ¦¬μž 인증 μƒνƒœ (μ „μ—­)
β”‚   └── usePermissions.ts         # κΆŒν•œ 체크 ν›…
β”œβ”€β”€ guards/
β”‚   └── AuthGuard.tsx             # 인증 κ°€λ“œ μ»΄ν¬λ„ŒνŠΈ
└── index.ts

πŸ“ Admin μŠ€μ½”ν”„ κ·œμΉ™:

  • κ΄€λ¦¬μž μ „μš© κΈ°λŠ₯ - λͺ¨λ“  데이터 CRUD κ°€λŠ₯
  • 인증 ν•„μˆ˜ - JWT 토큰 기반 인증
  • κΆŒν•œ 체크 - λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ κ΄€λ¦¬μž κΆŒν•œ 확인

πŸ“ src/shared/ - μ „μ—­ 곡톡

🎨 Shared UI (μ „μ—­ UI μ»΄ν¬λ„ŒνŠΈ)

src/shared/ui/
β”œβ”€β”€ Button/
β”‚   β”œβ”€β”€ Button.tsx                # λͺ¨λ“  κ³³μ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ λ²„νŠΌ
β”‚   β”œβ”€β”€ Button.stories.tsx        # Storybook μŠ€ν† λ¦¬
β”‚   └── index.ts
β”œβ”€β”€ Modal/
β”‚   β”œβ”€β”€ Modal.tsx                 # λͺ¨λ“  κ³³μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ‹¬
β”‚   β”œβ”€β”€ ConfirmModal.tsx          # 확인 λͺ¨λ‹¬
β”‚   └── index.ts
β”œβ”€β”€ Form/
β”‚   β”œβ”€β”€ Input.tsx                 # κΈ°λ³Έ μž…λ ₯ ν•„λ“œ
β”‚   β”œβ”€β”€ Textarea.tsx              # ν…μŠ€νŠΈ μ˜μ—­
β”‚   β”œβ”€β”€ Select.tsx                # μ…€λ ‰νŠΈ λ°•μŠ€
β”‚   └── index.ts
β”œβ”€β”€ Pagination/
β”‚   β”œβ”€β”€ Pagination.tsx            # λͺ¨λ“  λͺ©λ‘μ—μ„œ μ‚¬μš©ν•˜λŠ” νŽ˜μ΄μ§€λ„€μ΄μ…˜
β”‚   └── index.ts
β”œβ”€β”€ DataList/
β”‚   β”œβ”€β”€ DataList.tsx              # λ²”μš© λͺ©λ‘ μ»΄ν¬λ„ŒνŠΈ
β”‚   └── index.ts
β”œβ”€β”€ BoardFilter/
β”‚   β”œβ”€β”€ BoardFilter.tsx           # μΉ΄ν…Œκ³ λ¦¬ ν•„ν„° (곡톡)
β”‚   └── index.ts
β”œβ”€β”€ LoadingSpinner/
β”‚   └── LoadingSpinner.tsx        # λ‘œλ”© μŠ€ν”Όλ„ˆ (μ „μ—­)
β”œβ”€β”€ Toast/
β”‚   β”œβ”€β”€ Toast.tsx                 # ν† μŠ€νŠΈ μ•Œλ¦Ό
β”‚   └── index.ts
β”œβ”€β”€ ImageUpload/
β”‚   β”œβ”€β”€ ImageUpload.tsx           # 이미지 μ—…λ‘œλ“œ (Q&A, 곡지사항 곡톡)
β”‚   └── index.ts
└── index.ts                      # λͺ¨λ“  UI μ»΄ν¬λ„ŒνŠΈ export

πŸ—οΈ Shared Layout (μ „μ—­ λ ˆμ΄μ•„μ›ƒ)

src/shared/layout/
β”œβ”€β”€ Header/
β”‚   β”œβ”€β”€ Header.tsx                # μ „μ—­ 헀더 (둜고, λ„€λΉ„κ²Œμ΄μ…˜)
β”‚   └── Navigation.tsx            # 메인 λ„€λΉ„κ²Œμ΄μ…˜
β”œβ”€β”€ Footer/
β”‚   └── Footer.tsx                # μ „μ—­ ν‘Έν„° (νšŒμ‚¬ 정보, μ—°λ½μ²˜)
└── index.ts

🎯 Shared Features (μ „μ—­ 곡톡 κΈ°λŠ₯)

src/shared/features/
└── home/                         # λ©”μΈνŽ˜μ΄μ§€ μ „μš© κΈ°λŠ₯
    β”œβ”€β”€ ui/
    β”‚   β”œβ”€β”€ HeroSection.tsx       # λ©”μΈνŽ˜μ΄μ§€ νžˆμ–΄λ‘œ μ„Ήμ…˜
    β”‚   β”œβ”€β”€ FeatureSection.tsx    # κΈ°λŠ₯ μ†Œκ°œ μ„Ήμ…˜
    β”‚   β”œβ”€β”€ CTASection.tsx        # Call-to-Action μ„Ήμ…˜
    β”‚   β”œβ”€β”€ TestimonialSection.tsx # 고객 ν›„κΈ° μ„Ήμ…˜
    β”‚   └── RecentNotices.tsx     # 졜근 곡지사항 3개 ν‘œμ‹œ
    └── index.ts

🏒 Shared Entities (μ „μ—­ 곡톡 도메인)

src/shared/entities/
β”œβ”€β”€ qa/                           # Q&A 도메인 (Support + Admin 곡톡)
β”‚   β”œβ”€β”€ types/
β”‚   β”‚   └── QA.ts                 # Q&A νƒ€μž… μ •μ˜
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ fetchQAs.ts           # Q&A 쑰회 API (곡톡)
β”‚   β”‚   └── qaApi.ts              # Q&A κ΄€λ ¨ API λͺ¨μŒ
β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”œβ”€β”€ QAStatusBadge.tsx     # Q&A μƒνƒœ 뱃지 (곡톡)
β”‚   β”‚   └── QAPriorityBadge.tsx   # Q&A μš°μ„ μˆœμœ„ 뱃지 (곡톡)
β”‚   └── index.ts
β”‚
β”œβ”€β”€ faq/                          # FAQ 도메인 (Support + Admin 곡톡)
β”‚   β”œβ”€β”€ types/
β”‚   β”‚   └── FAQ.ts                # FAQ νƒ€μž… μ •μ˜
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ fetchFAQs.ts          # FAQ 쑰회 API (곡톡)
β”‚   β”‚   └── faqApi.ts             # FAQ κ΄€λ ¨ API λͺ¨μŒ
β”‚   β”œβ”€β”€ ui/
β”‚   β”‚   β”œβ”€β”€ FAQStatusBadge.tsx    # FAQ μƒνƒœ 뱃지 (곡톡)
β”‚   β”‚   └── FAQCategoryBadge.tsx  # FAQ μΉ΄ν…Œκ³ λ¦¬ 뱃지 (곡톡)
β”‚   └── index.ts
β”‚
└── notice/                       # 곡지사항 도메인 (Support + Admin 곡톡)
    β”œβ”€β”€ types/
    β”‚   └── Notice.ts             # 곡지사항 νƒ€μž… μ •μ˜
    β”œβ”€β”€ api/
    β”‚   β”œβ”€β”€ fetchNotices.ts       # 곡지사항 쑰회 API (곡톡)
    β”‚   └── noticeApi.ts          # 곡지사항 κ΄€λ ¨ API λͺ¨μŒ
    β”œβ”€β”€ ui/
    β”‚   β”œβ”€β”€ NoticeItem.tsx        # 곡지사항 μ•„μ΄ν…œ κΈ°λ³Έ μ»΄ν¬λ„ŒνŠΈ
    β”‚   └── NoticeStatusBadge.tsx # 곡지사항 μƒνƒœ 뱃지
    └── index.ts

πŸ”§ 기타 Shared 폴더듀

src/shared/
β”œβ”€β”€ api/                          # μ „μ—­ API μ„€μ •
β”‚   β”œβ”€β”€ client.ts                 # Axios ν΄λΌμ΄μ–ΈνŠΈ μ„€μ •
β”‚   β”œβ”€β”€ types.ts                  # API 곡톡 νƒ€μž…
β”‚   └── interceptors.ts           # API 인터셉터 (인증 토큰 λ“±)
β”‚
β”œβ”€β”€ utils/                        # μ „μ—­ μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ formatDate.ts             # λ‚ μ§œ ν¬λ§·νŒ…
β”‚   β”œβ”€β”€ validation.ts             # 곡톡 μœ νš¨μ„± 검사
β”‚   └── storage.ts                # 둜컬 μŠ€ν† λ¦¬μ§€ μœ ν‹Έ
β”‚
β”œβ”€β”€ constants/                    # μ „μ—­ μƒμˆ˜
β”‚   β”œβ”€β”€ routes.ts                 # 라우트 μƒμˆ˜
β”‚   β”œβ”€β”€ apiEndpoints.ts           # API μ—”λ“œν¬μΈνŠΈ
β”‚   └── config.ts                 # μ•± μ„€μ •
β”‚
β”œβ”€β”€ types/                        # μ „μ—­ νƒ€μž…
β”‚   β”œβ”€β”€ api.ts                    # API 응닡 νƒ€μž…
β”‚   └── common.ts                 # 곡톡 νƒ€μž…
β”‚
β”œβ”€β”€ hooks/                        # μ „μ—­ ν›…
β”‚   β”œβ”€β”€ useLocalStorage.ts        # 둜컬 μŠ€ν† λ¦¬μ§€ ν›…
β”‚   └── useDebounce.ts            # λ””λ°”μš΄μŠ€ ν›…
β”‚
β”œβ”€β”€ providers/                    # μ „μ—­ Provider
β”‚   β”œβ”€β”€ QueryProvider.tsx         # React Query Provider
β”‚   β”œβ”€β”€ ThemeProvider.tsx         # ν…Œλ§ˆ Provider
β”‚   └── index.ts
β”‚
└── assets/                       # μ „μ—­ 에셋
    β”œβ”€β”€ icons/                    # μ•„μ΄μ½˜
    └── images/                   # 이미지

🎯 파일 배치 κ·œμΉ™ μš”μ•½

πŸ“ 어디에 무엇을 넣을지 νŒλ‹¨ κΈ°μ€€

1. App Router (src/app/)

  • βœ… λ„£λŠ” 것: λΌμš°νŒ… μ„€μ •, λ ˆμ΄μ•„μ›ƒ μ„€μ •, νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ (μœ„μž„λ§Œ)
  • ❌ λ„£μ§€ μ•ŠλŠ” 것: λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, μƒνƒœ 관리, API 호좜

2. Support μŠ€μ½”ν”„ (src/support/)

  • βœ… λ„£λŠ” 것: 고객용 κΈ°λŠ₯, 읽기 쀑심 κΈ°λŠ₯, μ œν•œλœ μ“°κΈ° κΈ°λŠ₯
  • ❌ λ„£μ§€ μ•ŠλŠ” 것: κ΄€λ¦¬μž κΈ°λŠ₯, λ―Όκ°ν•œ 데이터 처리, κΆŒν•œ 관리

3. Admin μŠ€μ½”ν”„ (src/admin/)

  • βœ… λ„£λŠ” 것: κ΄€λ¦¬μž μ „μš© κΈ°λŠ₯, λͺ¨λ“  CRUD κΈ°λŠ₯, κΆŒν•œ 관리
  • ❌ λ„£μ§€ μ•ŠλŠ” 것: 고객용 κΈ°λŠ₯, 곡개 λ°μ΄ν„°λ§Œ λ‹€λ£¨λŠ” κΈ°λŠ₯

4. Shared (src/shared/)

  • βœ… λ„£λŠ” 것:
    • UI: λͺ¨λ“  μŠ€μ½”ν”„μ—μ„œ μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ
    • Entities: Support + Admin λͺ¨λ‘ μ‚¬μš©ν•˜λŠ” 도메인
    • Utils: μ „μ—­ μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
    • Types: μ „μ—­ 곡톡 νƒ€μž…
  • ❌ λ„£μ§€ μ•ŠλŠ” 것: νŠΉμ • μŠ€μ½”ν”„μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯

πŸ” ꡬ체적 μ˜ˆμ‹œ

Q&A κ΄€λ ¨ νŒŒμΌλ“€

  • shared/entities/qa/types/QA.ts - Q&A νƒ€μž… (Support + Admin 곡톡)
  • shared/entities/qa/ui/QAStatusBadge.tsx - μƒνƒœ 뱃지 (Support + Admin 곡톡)
  • support/features/qa/ui/QAForm.tsx - 고객용 질문 μž‘μ„± 폼
  • admin/features/qa/ui/QAAnswerForm.tsx - κ΄€λ¦¬μžμš© λ‹΅λ³€ μž‘μ„± 폼

λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈλ“€

  • shared/ui/Button/Button.tsx - κΈ°λ³Έ λ²„νŠΌ (λͺ¨λ“  κ³³μ—μ„œ μ‚¬μš©)
  • support/shared/ui/SupportButton.tsx - Support μ „μš© λ²„νŠΌ
  • admin/shared/ui/AdminButton.tsx - Admin μ „μš© λ²„νŠΌ

API ν•¨μˆ˜λ“€

  • shared/entities/qa/api/qaApi.ts - 곡톡 Q&A API
  • support/features/qa/api/createQA.ts - 고객용 질문 μž‘μ„± API
  • admin/features/qa/api/answerQA.ts - κ΄€λ¦¬μžμš© λ‹΅λ³€ μž‘μ„± API

이 κ°€μ΄λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ μƒˆλ‘œμš΄ νŒŒμΌμ„ λ§Œλ“€ λ•Œ μ μ ˆν•œ μœ„μΉ˜λ₯Ό μ„ νƒν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€!