π° μκΈμ΄μ
λ΄ μκΈ, λ΄ κ·Όλ¬΄ κΈ°λ‘, λ΄ μμ μ νλμ!
μκΈμ΄μλ μ¬λ¬ μλ₯΄λ°μ΄νΈμ κΈμ¬λ₯Ό κ°μ₯ νΈλ¦¬νκ² κ³μ°νκ³ κ΄λ¦¬ν μ μλλ‘ λλ μΉ μ ν리μΌμ΄μ μ λλ€. 볡μ‘ν μμ μνΈλ μκΈ° κ³μ° μμ΄, μ§κ΄μ μΈ UIλ‘ λΉμ μ μμ€ν μκ°μ μ껴보μΈμ.
π λ°λ‘κ°κΈ°
β¨ μ£Όμ νΉμ§
-
π’ μ¬λ¬ κ°μ μλ₯΄λ°μ΄νΈλ₯Ό ν λ²μ!
- μ¬λ¬ μ§μ μ μμ½κ² μΆκ°νκ³ , κ°κΈ° λ€λ₯Έ μκΈκ³Ό 근무 κΈ°λ‘μ 체κ³μ μΌλ‘ κ΄λ¦¬ν μ μμ΅λλ€.
-
π§ κ³Όκ±° μκΈκΉμ§ λλνκ² κ³μ°
- μκΈμ΄ λ³κ²½λμ΄λ κ±±μ λ§μΈμ. βμ μ© μμμΌβ κΈ°μ€μ μ νν μκΈμ μ°Ύμ κΈμ¬λ₯Ό μλμΌλ‘ κ³μ°ν΄μ£Όλ μ€λ§νΈν¨μ κ°μ·μ΅λλ€.
-
π λ¬λ ₯μΌλ‘ νλμ 보λ 근무 κΈ°λ‘
- λ¬λ ₯ κΈ°λ°μ μ§κ΄μ μΈ μΈν°νμ΄μ€λ‘ μΈμ , μΌλ§λ μΌνλμ§ μ½κ² νμ νκ³ , ν΄λ¦ ν λ²μΌλ‘ 근무λ₯Ό κΈ°λ‘ν μ μμ΅λλ€.
-
π μλ³ λ¦¬ν¬νΈλ‘ μλ μ μ°
- λ§€μ μ΄ κ·Όλ¬΄ μκ°, μμ μμ λ±μ ν¬ν¨ν μμΈ λ¦¬ν¬νΈλ₯Ό μ 곡νμ¬ μ¬μ κ΄λ¦¬λ₯Ό λμ΅λλ€.
-
π± μ±μ²λΌ μ€μΉν΄μ μ¬μ©
- PWA(Progressive Web App)λ₯Ό μ§μνμ¬, μ±μ²λΌ ν νλ©΄μ μΆκ°νκ³ μ€νλΌμΈμμλ μ¬μ©ν μ μμ΅λλ€.
π¨βπ» κ°λ° μ΄μΌκΈ°
μ΄ νλ‘μ νΈλ μμ¦λ₯Ό μν΄ λ§λ€μμ΅λλ€. μ λ©λͺ¨λ‘ λ§€λ² λ€λ₯Έ μκΈκ³Ό 근무 μκ°μ μμ λ‘ μ 리νκ³ κ³μ°νλ κ³Όμ μ λ²κ±°λ‘μ λ€κ³ ν©λλ€. βμ’ λ μ½κ³ νΈνκ² κΈμ¬λ₯Ό κ΄λ¦¬νλλ‘ λμμ€ μ μ μμκΉ?βλΌλ μκ°μΌλ‘ μμλμμ΅λλ€.
μκΈμ΄μ
λ μ¬μ©μκ° μ΅μνμ λ
Έλ ₯μΌλ‘ μ΅λμ νΈμλ₯Ό λ릴 μ μλλ‘ μ§κ΄μ μΈ μ¬μ©μ κ²½ν(UX)μ μ΄μ μ λ§μΆ° κ°λ°λμμ΅λλ€. 볡μ‘ν κΈ°λ₯ λμ , μλ₯΄λ°μ΄νΈμμκ² κΌ νμν ν΅μ¬ κΈ°λ₯(μ§μ
κ΄λ¦¬, μκΈ μ΄λ ₯, 근무 κΈ°λ‘, μλ³ μ μ°)μ λ΄μλμ΅λλ€.
Reactμ Supabaseλ₯Ό κΈ°λ°μΌλ‘ λΉ λ₯΄κ² νλ‘ν νμ μ ꡬννμΌλ©°, μ¬μ©μμ νΌλλ°±μ λ°μνμ¬ μ§μμ μΌλ‘ κ°μ νκ³ μμ΅λλ€. μ΄ μμ λκ΅¬κ° λΉμ μ μμ€ν λμ κ²°μ€μ κ΄λ¦¬νλ λ° μ μ©ν λΉμκ° λκΈ°λ₯Ό λ°λλλ€.
π μ¬μ©λ²
- Google κ³μ μΌλ‘ λ‘κ·ΈμΈ: λ³λμ νμκ°μ μμ΄ Google κ³μ μΌλ‘ κ°νΈνκ² μμνμΈμ.
- μ§μ μΆκ°: βμ§μ κ΄λ¦¬β λ©λ΄μμ 첫 μλ₯΄λ°μ΄νΈ μ 보λ₯Ό λ±λ‘ν©λλ€. (μ: μΉ΄ν μλ°)
- μκΈ μ€μ : μΆκ°ν μ§μ μ μ ννκ³ , βμΈμ λΆν° μ μ©λλμ§βμ ν¨κ» μκΈμ μ λ ₯ν©λλ€. μκΈμ΄ λ³κ²½λλ©΄ μλ‘ μΆκ°νλ©΄ λ©λλ€.
- 근무 κΈ°λ‘: λ¬λ ₯μμ 근무ν λ μ§λ₯Ό μ ννκ³ , μΆκ·Ό λ° ν΄κ·Ό μκ°, μλ, κ°λ¨ν λ©λͺ¨λ₯Ό λ¨κΈ°κ³ μ μ₯νμΈμ.
- 리ν¬νΈ νμΈ: βμλ³ λ¦¬ν¬νΈβ λ©λ΄μμ ν΄λΉ μμ μ΄ μμ κ³Ό 근무 λ΄μμ νλμ νμΈνμΈμ.
π± ν΄λν°μμ ν νλ©΄μ μΆκ°νλ λ°©λ²
μκΈμ΄μλ PWA(Progressive Web App)λ₯Ό μ§μνμ¬ μ±μ²λΌ μ¬μ©ν μ μμ΅λλ€. μλ μλ΄μ λ°λΌ ν΄λν° ν νλ©΄μ μΆκ°ν΄λ³΄μΈμ.
Android (Chrome κΈ°μ€)
- https://hrwage.run.place/μ μ μν©λλ€.
- λΈλΌμ°μ μ°μΈ‘ μλ¨μ λ©λ΄(οΈ)λ₯Ό λλ¦ λλ€.
- βν νλ©΄μ μΆκ°β λλ βμ± μ€μΉβλ₯Ό μ νν©λλ€.
- μλ΄μ λ°λΌ μΆκ°νλ©΄ ν νλ©΄μ μμ΄μ½μ΄ μμ±λ©λλ€.
iPhone (Safari κΈ°μ€)
- https://hrwage.run.place/μ μ μν©λλ€.
- νλ¨μ 곡μ λ²νΌ( )μ λλ¦ λλ€.
- βν νλ©΄μ μΆκ°βλ₯Ό μ νν©λλ€.
- μ΄λ¦μ νμΈν λ€ βμΆκ°βλ₯Ό λλ₯΄λ©΄ ν νλ©΄μ μμ΄μ½μ΄ μμ±λ©λλ€.
μ΄μ μ±μ²λΌ λΉ λ₯΄κ² μ€νν μ μμ΅λλ€!
π οΈ κΈ°μ μ€ν
- νλ‘ νΈμλ: React, Tailwind CSS
- λ°±μλ: Supabase
- λ°°ν¬: GitHub Pages
π¨βπ§ κ°λ°μ κ°μ΄λ
μ΄ νλ‘μ νΈλ React κΈ°λ°μ μΉ μ ν리μΌμ΄μ μ λλ€. κ°λ° νκ²½ μ€μ λ° λ°°ν¬μ λν κ°μ΄λλ λ€μκ³Ό κ°μ΅λλ€.
1. νλ‘μ νΈ μ€μ
νλ‘μ νΈλ₯Ό λ‘컬 νκ²½μμ μ€ννκΈ° μν΄ λ€μ λ¨κ³λ₯Ό λ°λ₯΄μΈμ.
-
μ μ₯μ ν΄λ‘ :
git clone https://github.com/your-username/szwagecalc.git cd szwagecalc
-
μμ‘΄μ± μ€μΉ:
npm install
-
νκ²½ λ³μ μ€μ : νλ‘μ νΈ λ£¨νΈμ
.env.local
νμΌμ μμ±νκ³ Supabase κ΄λ ¨ νκ²½ λ³μλ₯Ό μ€μ ν©λλ€. μ΄ λ³μλ€μ Supabase νλ‘μ νΈ μ€μ μμ νμΈν μ μμ΅λλ€.REACT_APP_SUPABASE_URL=YOUR_SUPABASE_URL REACT_APP_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY
2. κ°λ° μλ² μ€ν
κ°λ° λͺ¨λλ‘ μ ν리μΌμ΄μ μ μ€νν©λλ€. λ³κ²½ μ¬νμ΄ μμ λλ§λ€ μλμΌλ‘ μλ‘κ³ μΉ¨λ©λλ€.
npm start
μ ν리μΌμ΄μ
μ μΌλ°μ μΌλ‘ http://localhost:3000
μμ μ€νλ©λλ€.
3. νλ‘λμ λΉλ
λ°°ν¬λ₯Ό μν νλ‘λμ
λΉλλ₯Ό μμ±ν©λλ€. λΉλλ νμΌλ€μ build/
λλ ν 리μ μμ±λ©λλ€.
npm run build
4. λ°°ν¬
npm run deploy
μ€ν¬λ¦½νΈλ₯Ό μ€ννμ¬ GitHub Pagesμ λ°°ν¬ν μ μμ΅λλ€.
npm run deploy
5. λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ (Supabase)
μ ν리μΌμ΄μ μμ μ¬μ©νλ μ£Όμ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ μ€ν€λ§λ λ€μκ³Ό κ°μ΅λλ€.
jobs
id
:uuid
(PK)user_id
:uuid
(FK,auth.users.id
)job_name
:text
description
:text
(nullable)created_at
:timestamptz
is_deleted
:boolean
(default:FALSE
)
hourly_rate_history
id
:bigint
(PK)user_id
:uuid
(FK,auth.users.id
)job_id
:uuid
(FK,jobs.id
)hourly_rate
:numeric
effective_date
:date
end_date
:date
(nullable)
work_records
id
:bigint
(PK)user_id
:uuid
(FK,auth.users.id
)job_id
:uuid
(FK,jobs.id
)date
:date
start_time
:time
end_time
:time
meal_allowance
:numeric
notes
:text
(nullable)daily_wage
:numeric
profiles
user_id
:uuid
(PK, FK,auth.users.id
)username
:text
6. μ£Όμ ν΄κ²° κ³Όμ
κ°λ° κ³Όμ μμ ν΄κ²°ν μ£Όμ κΈ°μ μ κ³Όμ λ° λ²κ·Έ μμ λͺ©λ‘μ λλ€.
-
μ§μ κ΄λ¦¬ (
JobManagementModal
)- μ§μ
μμ μ 근무 κΈ°λ‘ μ μ§ (μννΈ μμ ): μ§μ
μ μμ νλλΌλ ν΄λΉ μ§μ
κ³Ό κ΄λ ¨λ 근무 κΈ°λ‘μ 보쑴λλλ‘ μννΈ μμ λ°©μμ λμ
νμ΅λλ€.
jobs
ν μ΄λΈμis_deleted
컬λΌμ μΆκ°νκ³ , μ§μ μμ μ μ΄ κ°μTRUE
λ‘ μ λ°μ΄νΈνλ©°, UIμμλis_deleted
κ°FALSE
μΈ μ§μ λ§ νμνλλ‘ λ³κ²½νμ΅λλ€. - μ§μ
μ€λͺ
μ μ₯ μ€λ₯ ν΄κ²°:
description
νλκ° μ μμ μΌλ‘ μ μ₯ λ° λ‘λλλλ‘ μμ νμ΅λλ€. - λͺ¨λ¬ μ μ§ κΈ°λ₯ μΆκ°: μ§μ μΆκ°/λ³κ²½/μμ ν λͺ¨λ¬μ΄ λ«νμ§ μκ³ λ³κ²½ μ¬νμ΄ λ°μλ μνλ‘ μ μ§λλλ‘ κ°μ νμ΅λλ€.
- μ§μ
μμ μ 근무 κΈ°λ‘ μ μ§ (μννΈ μμ ): μ§μ
μ μμ νλλΌλ ν΄λΉ μ§μ
κ³Ό κ΄λ ¨λ 근무 κΈ°λ‘μ 보쑴λλλ‘ μννΈ μμ λ°©μμ λμ
νμ΅λλ€.
-
근무 μΆκ° (
DailyRecordModal
)- μ μ© μκΈ λ―Ένμ λ¬Έμ ν΄κ²°: λ μ§μ μ§μ μ λ§λ μκΈμ΄ UIμ μ νν νμλλλ‘ μ‘°ν λ‘μ§μ κ°μ νμ΅λλ€.
- μκ° λ―Έμ λ ₯ μ UX κ°μ : μκ° λ―Έμ λ ₯ μνλ‘ μ μ₯ μλ μ μ¬μ©μμκ² λͺ νν μλ¦Όμ μ 곡νλλ‘ μμ νμ΅λλ€.
-
λ°μ΄ν° λκΈ°ν
- 근무 λͺ©λ‘ λ°μ΄ν° λΉλκΈ°ν λ¬Έμ ν΄κ²°: μκΈ λ³κ²½ μ
DailyRecordListModal
μ μΌκΈ μ λ³΄κ° μ¦μ μ¬κ³μ° λ° λ°μλλλ‘ μν κ΄λ¦¬ λ‘μ§μ μμ νμ΅λλ€.
- 근무 λͺ©λ‘ λ°μ΄ν° λΉλκΈ°ν λ¬Έμ ν΄κ²°: μκΈ λ³κ²½ μ
-
μλΉμ€ μ컀 λ° PWA
- μλΉμ€ μ컀 λ±λ‘ μ€λ₯ ν΄κ²°:
precache
κ΄λ ¨t is not iterable
μ€λ₯ λ° 404 μ€λ₯λ₯Ό ν΄κ²°νμ¬ PWAκ° μμ μ μΌλ‘ μλνλλ‘ μλΉμ€ μ컀 μ€μ μ μμ νμ΅λλ€.
- μλΉμ€ μ컀 λ±λ‘ μ€λ₯ ν΄κ²°:
-
UI/UX κ°μ
- λͺ¨λ¬ λ©μμ§ κ°μν: ν μ€(Toss) μ€νμΌμ μ°Έκ³ νμ¬ λͺ¨λ μ¬μ©μ μλ΄ λ©μμ§λ₯Ό κ°κ²°νκ³ μ§κ΄μ μΌλ‘ κ°μ νμ΅λλ€.
- 컨ν
μ€νΈ API μ€λ₯ ν΄κ²°:
useToast must be used within a ToastProvider
λ°νμ μ€λ₯λ₯Ό ν΄κ²°νκΈ° μν΄App.js
μ μ»΄ν¬λνΈ κ΅¬μ‘°λ₯Ό 리ν©ν λ§νμ΅λλ€. - 근무 κΈ°λ‘ λͺ©λ‘ UI κ°μ : 근무 κΈ°λ‘ νΈμ§/μμ λ²νΌμ μ°μΈ‘μΌλ‘ μ λ ¬νμ¬ κ°λ μ± λ° μ¬μ©μ±μ ν₯μνμ΅λλ€.
- μκΈ νμΈ λͺ¨λ¬ μΌλ³ μμΈ λ΄μ UI κ°μ : ν μ€ μ€νμΌμ μ μ©νμ¬ μΌλ³ μμΈ λ΄μμ μΉ΄λ ννλ‘ νμνκ³ , μΌκΈμ κ°μ‘°νλ©°, λ μ§ λ° κΈ°ν μ 보μ κ°λ μ±μ λμμ΅λλ€.
- μκΈ νμΈ λͺ¨λ¬ μμ½ μ 보 μΉ΄λν: μ΄ κ·Όλ¬΄ μκ°, μ΄ μλ, μ΄ μμ μμ½ μ 보λ₯Ό μΉ΄λ ννλ‘ λ³κ²½νμ¬ μκ°μ ꡬλΆμ λͺ νν νμ΅λλ€.
- 근무 μκ° νμ νμ ν΅μΌ: μ΄ κ·Όλ¬΄ μκ° λ° μΌλ³ 근무 μκ° νμλ₯Ό βμκ° λΆβ νμμΌλ‘ ν΅μΌνμ¬ κ°λ μ±μ λμμ΅λλ€.
- μ§μ κ΄λ¦¬ λͺ¨λ¬ λ²νΌ μμ΄μ½ν: μ§μ κ΄λ¦¬ λͺ¨λ¬μ μμ /μμ λ²νΌμ μμ΄μ½μΌλ‘ λ³κ²½νκ³ μν λ°°μΉνμ¬ κ³΅κ° ν¨μ¨μ±μ λμμ΅λλ€.
π§ νΌλλ°±
μκΈμ΄μ μ±μ λν μμ€ν μ견μ 보λ΄μ£ΌμΈμ. μ¬λ¬λΆμ νΌλλ°±μ μ± κ°μ μ ν° λμμ΄ λ©λλ€.
κΈ°μ¬
μ΄ νλ‘μ νΈμ κΈ°μ¬νκ³ μΆμΌμλ€λ©΄, μΈμ λ μ§ Pull Requestλ₯Ό 보λ΄μ£ΌμΈμ. λ²κ·Έ 리ν¬νΈλ κΈ°λ₯ μ μλ νμν©λλ€.
λΌμ΄μ μ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€μ λ°λΌ λ°°ν¬λ©λλ€.