Skip to content

Latest commit

Β 

History

History
226 lines (170 loc) Β· 8.7 KB

File metadata and controls

226 lines (170 loc) Β· 8.7 KB

κΈ°μ—¬ κ°€μ΄λ“œ

이코 ν”„λ‘œμ νŠΈμ— 관심 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! 이 λ¬Έμ„œλŠ” ν”„λ‘œμ νŠΈ ꡬ쑰와 κΈ°μ—¬ 방법을 μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

πŸ“‹ λͺ©μ°¨

ν”„λ‘œμ νŠΈ ꡬ쑰

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 폴더 ꡬ쑰 및 λ™μž‘ 원리

Background μŠ€ν¬λ¦½νŠΈλŠ” λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜(Layered Architecture) νŒ¨ν„΄μ„ λ”°λ₯΄λ©°, 각 λ ˆμ΄μ–΄λŠ” λͺ…ν™•ν•œ μ±…μž„μ„ κ°€μ§‘λ‹ˆλ‹€.

πŸ“ μ•„ν‚€ν…μ²˜ λ ˆμ΄μ–΄

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         index.ts (μ§„μž…μ )                β”‚  ← μ˜μ‘΄μ„± μ£Όμž…, λ©”μ‹œμ§€ λΌμš°νŒ… μ„€μ •
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      Services (λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)             β”‚  ← κ°•μ˜/VOD/과제 데이터 μˆ˜μ§‘ 둜직
β”‚  CourseService, VodService, etc.        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      Managers (인프라 관리)               β”‚  ← μ½˜ν…μΈ  슀크립트, νƒ­, λ©”μ‹œμ§€ 관리
β”‚  ContentScriptManager, TabManager, etc. β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Repositories (데이터 μ•‘μ„ΈμŠ€)            β”‚  ← Chrome Storage 좔상화, 캐싱
β”‚  StorageRepository, CacheRepository     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”„ 데이터 흐름

  1. μ‚¬μ΄λ“œνŒ¨λ„μ—μ„œ VOD/과제 데이터 μš”μ²­ λ©”μ‹œμ§€ 전솑
  2. MessageHandlerκ°€ λ©”μ‹œμ§€ νƒ€μž… 확인 ν›„ μ μ ˆν•œ Service둜 λΌμš°νŒ…
  3. Serviceκ°€ CacheRepositoryμ—μ„œ μΊμ‹œ 확인
    • μΊμ‹œ 유효: μ¦‰μ‹œ λ°˜ν™˜
    • μΊμ‹œ 무효: μ½˜ν…μΈ  슀크립트 μ‹€ν–‰
  4. ContentScriptManagerκ°€ 이클래슀 νŽ˜μ΄μ§€μ— 슀크립트 μ‚½μž…
  5. μ½˜ν…μΈ  μŠ€ν¬λ¦½νŠΈκ°€ DOM νŒŒμ‹± ν›„ 데이터 전솑
  6. Serviceκ°€ 데이터λ₯Ό CacheRepository에 μ €μž₯
  7. 전체 μˆ˜μ§‘ μ™„λ£Œ μ‹œ μ‚¬μ΄λ“œνŒ¨λ„μ— μ•Œλ¦Ό

🎯 각 λ ˆμ΄μ–΄μ˜ μ—­ν• 

Services

  • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„
  • 데이터 μˆ˜μ§‘ 및 쑰회 흐름 μ œμ–΄
  • μ§„ν–‰ 상황 좔적 (completedCount / totalCount)

Managers

  • μ½˜ν…μΈ  슀크립트 쀑볡 μ‚½μž… λ°©μ§€ (마컀 νƒœκ·Έ ν™œμš©)
  • νƒ­ λ©”μ‹œμ§€ 전솑/μˆ˜μ‹  관리
  • λ©”μ‹œμ§€ νƒ€μž…λ³„ ν•Έλ“€λŸ¬ λΌμš°νŒ…

Repositories

  • Chrome Storage API νƒ€μž… μ•ˆμ „ λž˜ν•‘
  • μΊμ‹œ 만료 검증 (κ°•μ˜ID: 1주일, VOD/과제: 4μ‹œκ°„)
  • μŠ€ν† λ¦¬μ§€ ν‚€ 넀이밍 κ·œμΉ™ 관리

πŸ’‘ νƒ€μž… μ•ˆμ •μ„±

  • Discriminated Union νƒ€μž…μœΌλ‘œ λ©”μ‹œμ§€ ꡬ뢄
  • Interface 기반 μ˜μ‘΄μ„± μ£Όμž…μœΌλ‘œ ν…ŒμŠ€νŠΈ μš©μ΄μ„± 확보
  • Generic Repository Pattern으둜 μŠ€ν† λ¦¬μ§€ νƒ€μž… 보μž₯

⚑ μ΅œμ ν™” μ „λž΅

  • μΊμ‹œ μš°μ„  μ „λž΅μœΌλ‘œ λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ μš”μ²­ μ΅œμ†Œν™”
  • 병렬 처리(Promise.all)둜 μ—¬λŸ¬ κ°•μ˜ λ™μ‹œ μˆ˜μ§‘
  • μ½˜ν…μΈ  슀크립트 쀑볡 μ‚½μž… λ°©μ§€λ‘œ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„± 확보

개발 ν™˜κ²½ μ„ΈνŒ…

1. μ €μž₯μ†Œ 클둠

git clone https://github.com/karpitony/dgu-ecko.git
cd dgu-ecko

2. μ˜μ‘΄μ„± μ„€μΉ˜

이 ν”„λ‘œμ νŠΈλŠ” pnpm을 μ‚¬μš©ν•©λ‹ˆλ‹€.

npm install -g pnpm@10.5.2
pnpm install

3. 개발 μ„œλ²„ μ‹€ν–‰

pnpm run dev

pnpm run dev μ‹€ν–‰ μ‹œ κΈ°λ³Έ 크둬 λΈŒλΌμš°μ €κ°€ 열리며 빈 νŽ˜μ΄μ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

4. (선택) 개발 ν™˜κ²½ μ»€μŠ€ν„°λ§ˆμ΄μ§•

web-ext.config.ts νŒŒμΌμ„ μΆ”κ°€ν•˜μ—¬ λΈŒλΌμš°μ €μ™€ μ‹œμž‘ URL을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

import { defineWebExtConfig } from 'wxt';

export default defineWebExtConfig({
  binaries: {},
  startUrls: ['https://eclass.dongguk.edu/'],
});

개발 μ‹œμž‘ν•˜κΈ°

  1. 이슈 확인: λ¨Όμ € Issuesμ—μ„œ μž‘μ—…ν•˜κ³  싢은 이슈λ₯Ό μ°Ύμ•„λ³΄μ„Έμš”.
  2. 브랜치 생성: μž‘μ—…ν•  κΈ°λŠ₯μ΄λ‚˜ 버그에 λ§žλŠ” 브랜치λ₯Ό μƒμ„±ν•˜μ„Έμš”.
    git checkout -b feat/your-feature-name
  3. μ½”λ“œ μž‘μ„±: μ›ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ±°λ‚˜ 버그λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€.
  4. ν…ŒμŠ€νŠΈ: 변경사항이 μ œλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
  5. 컀밋: 의미 μžˆλŠ” λ‹¨μœ„λ‘œ μ»€λ°‹ν•©λ‹ˆλ‹€.

κΈ°μ—¬ 방법

Pull Request ν”„λ‘œμ„ΈμŠ€

  1. μ €μž₯μ†Œλ₯Ό ν¬ν¬ν•©λ‹ˆλ‹€.
  2. μƒˆλ‘œμš΄ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  3. 변경사항을 μ»€λ°‹ν•©λ‹ˆλ‹€.
  4. 본인의 포크 μ €μž₯μ†Œμ— ν‘Έμ‹œν•©λ‹ˆλ‹€.
  5. Pull Requestλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

이슈 μ œμ•ˆ

  • 버그λ₯Ό λ°œκ²¬ν•˜μ…¨λ‚˜μš”? 이슈λ₯Ό 등둝해 μ£Όμ„Έμš”.
  • μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ œμ•ˆν•˜κ³  μ‹ΆμœΌμ‹ κ°€μš”? 자유둭게 이슈둜 μ œμ•ˆν•΄ μ£Όμ„Έμš”.
  • λ¬Έμ„œ κ°œμ„ λ„ ν™˜μ˜ν•©λ‹ˆλ‹€!

μ½”λ”© μ»¨λ²€μ…˜

컀밋 λ©”μ‹œμ§€

컀밋 λ©”μ‹œμ§€λŠ” λͺ…ν™•ν•˜κ³  κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•΄ μ£Όμ„Έμš”.

ν˜•μ‹: νƒ€μž…: λ©”μ‹œμ§€

νƒ€μž…:

  • feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
  • fix: 버그 μˆ˜μ •
  • refactor: μ½”λ“œ λ¦¬νŒ©ν† λ§
  • style: μ½”λ“œ ν¬λ§·νŒ…, μ„Έλ―Έμ½œλ‘  λˆ„λ½ λ“±
  • chore: λΉŒλ“œ 업무, νŒ¨ν‚€μ§€ λ§€λ‹ˆμ € μˆ˜μ • λ“±
  • docs: λ¬Έμ„œ μˆ˜μ •

μ˜ˆμ‹œ:

feat: 과제 마감일 μ•Œλ¦Ό κΈ°λŠ₯ μΆ”κ°€
fix: μ‚¬μ΄λ“œνŒ¨λ„ λ Œλ”λ§ 였λ₯˜ μˆ˜μ •
refactor: background 슀크립트 λͺ¨λ“ˆν™”

λ³„λ„μ˜ body, footer λ“±μ˜ μ œμ•½μ€ μ—†μŠ΅λ‹ˆλ‹€.

μ½”λ“œ μŠ€νƒ€μΌ

  • 이 ν”„λ‘œμ νŠΈλŠ” Prettierλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • .vscode ν΄λ”μ˜ 섀정을 톡해 μžλ™ ν¬λ§·νŒ…μ΄ μ μš©λ©λ‹ˆλ‹€.
  • TypeScriptλ₯Ό μ‚¬μš©ν•˜λ©°, νƒ€μž… μ•ˆμ •μ„±μ„ μ€‘μš”μ‹œν•©λ‹ˆλ‹€.

질문이 μžˆμœΌμ‹ κ°€μš”?

ν”„λ‘œμ νŠΈμ— λŒ€ν•΄ κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ 이슈둜 μ§ˆλ¬Έν•΄ μ£Όμ„Έμš”. ν•¨κ»˜ 이코λ₯Ό λ°œμ „μ‹œμΌœ λ‚˜κ°€μš”! 🐘