μ΄μ½ νλ‘μ νΈμ κ΄μ¬ κ°μ Έμ£Όμ μ κ°μ¬ν©λλ€! μ΄ λ¬Έμλ νλ‘μ νΈ κ΅¬μ‘°μ κΈ°μ¬ λ°©λ²μ μλ΄ν©λλ€.
ecko/
βββ .vscode/ # vscodeλ₯Ό μν prettier μλ μ μ© μ€μ
βββ assets/
βββ entrypoints/ # νμ₯ νλ‘κ·Έλ¨ μμ€ μ½λ
β βββ background/ # λ°±κ·ΈλΌμ΄λ μ€ν¬λ¦½νΈ (μλΉμ€ μ컀)
β β βββ index.ts # μ§μ
μ (μμ‘΄μ± μ£Όμ
λ° λ©μμ§ λΌμ°ν
)
β β βββ types/ # νμ
μ μ
β β β βββ messages.ts # λ©μμ§ νμ
β β β βββ storage.ts # μ€ν λ¦¬μ§ λ°μ΄ν° νμ
β β β βββ services.ts # μλΉμ€ μΈν°νμ΄μ€
β β βββ utils/ # μ νΈλ¦¬ν°
β β β βββ constants.ts # μμ μ μ
β β β βββ promiseUtils.ts # Promise ν¬νΌ
β β βββ repositories/ # λ°μ΄ν° μ‘μΈμ€ λ μ΄μ΄
β β β βββ StorageRepository.ts # Chrome Storage μΆμν
β β β βββ CacheRepository.ts # μΊμ± λ‘μ§ μ λ΄
β β βββ managers/ # μΈνλΌ κ΄λ¦¬
β β β βββ ContentScriptManager.ts # μ½ν
μΈ μ€ν¬λ¦½νΈ μ½μ
κ΄λ¦¬
β β β βββ TabManager.ts # ν κ΄λ¦¬
β β β βββ MessageHandler.ts # λ©μμ§ λΌμ°ν
β β βββ services/ # λΉμ¦λμ€ λ‘μ§
β β βββ CourseService.ts # κ°μ λͺ©λ‘ κ΄λ¦¬
β β βββ VodService.ts # VOD λ°μ΄ν° μμ§/κ΄λ¦¬
β β βββ AssignmentService.ts # κ³Όμ λ°μ΄ν° μμ§/κ΄λ¦¬
β β βββ SidePanelService.ts # μ¬μ΄λν¨λ κ΄λ ¨
β βββ sidepanel/ # μ¬μ΄λ ν¨λ UI React μ½λ
β βββ {name}.content.ts # νμ΄μ§μ μ½μ
λ μ½ν
μΈ μ€ν¬λ¦½νΈλ€
βββ libs/ # μ νΈ ν¨μλ€ λͺ¨μ
βββ types/ # μ μ νμ
μ μ
βββ package.json
βββ wxt.config.ts # wxt + vite config νμΌ
βββ README.md
μ΄ νλ‘μ νΈλ wxt νλ μμν¬λ₯Ό κΈ°λ°μΌλ‘ λμν©λλ€.
λ μμΈν νλ‘μ νΈ κ΅¬μ‘°λ WXT 곡μ λ¬Έμλ₯Ό μ°Έκ³ νμΈμ.
Background μ€ν¬λ¦½νΈλ λ μ΄μ΄λ μν€ν μ²(Layered Architecture) ν¨ν΄μ λ°λ₯΄λ©°, κ° λ μ΄μ΄λ λͺ νν μ± μμ κ°μ§λλ€.
βββββββββββββββββββββββββββββββββββββββββββ
β index.ts (μ§μ
μ ) β β μμ‘΄μ± μ£Όμ
, λ©μμ§ λΌμ°ν
μ€μ
βββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββ
β Services (λΉμ¦λμ€ λ‘μ§) β β κ°μ/VOD/κ³Όμ λ°μ΄ν° μμ§ λ‘μ§
β CourseService, VodService, etc. β
βββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββ
β Managers (μΈνλΌ κ΄λ¦¬) β β μ½ν
μΈ μ€ν¬λ¦½νΈ, ν, λ©μμ§ κ΄λ¦¬
β ContentScriptManager, TabManager, etc. β
βββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββ
β Repositories (λ°μ΄ν° μ‘μΈμ€) β β Chrome Storage μΆμν, μΊμ±
β StorageRepository, CacheRepository β
βββββββββββββββββββββββββββββββββββββββββββ
- μ¬μ΄λν¨λμμ VOD/κ³Όμ λ°μ΄ν° μμ² λ©μμ§ μ μ‘
- MessageHandlerκ° λ©μμ§ νμ νμΈ ν μ μ ν Serviceλ‘ λΌμ°ν
- Serviceκ° CacheRepositoryμμ μΊμ νμΈ
- μΊμ μ ν¨: μ¦μ λ°ν
- μΊμ 무ν¨: μ½ν μΈ μ€ν¬λ¦½νΈ μ€ν
- ContentScriptManagerκ° μ΄ν΄λμ€ νμ΄μ§μ μ€ν¬λ¦½νΈ μ½μ
- μ½ν μΈ μ€ν¬λ¦½νΈκ° DOM νμ± ν λ°μ΄ν° μ μ‘
- Serviceκ° λ°μ΄ν°λ₯Ό CacheRepositoryμ μ μ₯
- μ 체 μμ§ μλ£ μ μ¬μ΄λν¨λμ μλ¦Ό
Services
- λΉμ¦λμ€ λ‘μ§ κ΅¬ν
- λ°μ΄ν° μμ§ λ° μ‘°ν νλ¦ μ μ΄
- μ§ν μν© μΆμ (completedCount / totalCount)
Managers
- μ½ν μΈ μ€ν¬λ¦½νΈ μ€λ³΅ μ½μ λ°©μ§ (λ§μ»€ νκ·Έ νμ©)
- ν λ©μμ§ μ μ‘/μμ κ΄λ¦¬
- λ©μμ§ νμ λ³ νΈλ€λ¬ λΌμ°ν
Repositories
- Chrome Storage API νμ μμ λν
- μΊμ λ§λ£ κ²μ¦ (κ°μID: 1μ£ΌμΌ, VOD/κ³Όμ : 4μκ°)
- μ€ν λ¦¬μ§ ν€ λ€μ΄λ° κ·μΉ κ΄λ¦¬
- Discriminated Union νμ μΌλ‘ λ©μμ§ κ΅¬λΆ
- Interface κΈ°λ° μμ‘΄μ± μ£Όμ μΌλ‘ ν μ€νΈ μ©μ΄μ± ν보
- Generic Repository PatternμΌλ‘ μ€ν λ¦¬μ§ νμ 보μ₯
- μΊμ μ°μ μ λ΅μΌλ‘ λΆνμν λ€νΈμν¬ μμ² μ΅μν
- λ³λ ¬ μ²λ¦¬(
Promise.all)λ‘ μ¬λ¬ κ°μ λμ μμ§ - μ½ν μΈ μ€ν¬λ¦½νΈ μ€λ³΅ μ½μ λ°©μ§λ‘ λ©λͺ¨λ¦¬ ν¨μ¨μ± ν보
git clone https://github.com/karpitony/dgu-ecko.git
cd dgu-eckoμ΄ νλ‘μ νΈλ pnpmμ μ¬μ©ν©λλ€.
npm install -g pnpm@10.5.2
pnpm installpnpm run devpnpm run dev μ€ν μ κΈ°λ³Έ ν¬λ‘¬ λΈλΌμ°μ κ° μ΄λ¦¬λ©° λΉ νμ΄μ§κ° νμλ©λλ€.
web-ext.config.ts νμΌμ μΆκ°νμ¬ λΈλΌμ°μ μ μμ URLμ μ§μ ν μ μμ΅λλ€:
import { defineWebExtConfig } from 'wxt';
export default defineWebExtConfig({
binaries: {},
startUrls: ['https://eclass.dongguk.edu/'],
});- μ΄μ νμΈ: λ¨Όμ Issuesμμ μμ νκ³ μΆμ μ΄μλ₯Ό μ°Ύμ보μΈμ.
- λΈλμΉ μμ±: μμ
ν κΈ°λ₯μ΄λ λ²κ·Έμ λ§λ λΈλμΉλ₯Ό μμ±νμΈμ.
git checkout -b feat/your-feature-name
- μ½λ μμ±: μνλ κΈ°λ₯μ ꡬννκ±°λ λ²κ·Έλ₯Ό μμ ν©λλ€.
- ν μ€νΈ: λ³κ²½μ¬νμ΄ μ λλ‘ λμνλμ§ νμΈν©λλ€.
- 컀λ°: μλ―Έ μλ λ¨μλ‘ μ»€λ°ν©λλ€.
- μ μ₯μλ₯Ό ν¬ν¬ν©λλ€.
- μλ‘μ΄ λΈλμΉλ₯Ό μμ±ν©λλ€.
- λ³κ²½μ¬νμ 컀λ°ν©λλ€.
- λ³ΈμΈμ ν¬ν¬ μ μ₯μμ νΈμν©λλ€.
- Pull Requestλ₯Ό μμ±ν©λλ€.
- λ²κ·Έλ₯Ό λ°κ²¬νμ ¨λμ? μ΄μλ₯Ό λ±λ‘ν΄ μ£ΌμΈμ.
- μλ‘μ΄ κΈ°λ₯μ μ μνκ³ μΆμΌμ κ°μ? μμ λ‘κ² μ΄μλ‘ μ μν΄ μ£ΌμΈμ.
- λ¬Έμ κ°μ λ νμν©λλ€!
μ»€λ° λ©μμ§λ λͺ ννκ³ κ°κ²°νκ² μμ±ν΄ μ£ΌμΈμ.
νμ: νμ
: λ©μμ§
νμ :
feat: μλ‘μ΄ κΈ°λ₯ μΆκ°fix: λ²κ·Έ μμ refactor: μ½λ 리ν©ν λ§style: μ½λ ν¬λ§·ν , μΈλ―Έμ½λ‘ λλ½ λ±chore: λΉλ μ 무, ν¨ν€μ§ λ§€λμ μμ λ±docs: λ¬Έμ μμ
μμ:
feat: κ³Όμ λ§κ°μΌ μλ¦Ό κΈ°λ₯ μΆκ°
fix: μ¬μ΄λν¨λ λ λλ§ μ€λ₯ μμ
refactor: background μ€ν¬λ¦½νΈ λͺ¨λν
λ³λμ body, footer λ±μ μ μ½μ μμ΅λλ€.
- μ΄ νλ‘μ νΈλ Prettierλ₯Ό μ¬μ©ν©λλ€.
.vscodeν΄λμ μ€μ μ ν΅ν΄ μλ ν¬λ§·ν μ΄ μ μ©λ©λλ€.- TypeScriptλ₯Ό μ¬μ©νλ©°, νμ μμ μ±μ μ€μμν©λλ€.
νλ‘μ νΈμ λν΄ κΆκΈν μ μ΄ μλ€λ©΄ μ΄μλ‘ μ§λ¬Έν΄ μ£ΌμΈμ. ν¨κ» μ΄μ½λ₯Ό λ°μ μμΌ λκ°μ! π