[Part 31/50] Building Mood Weather: 3,000+ Char Tech & Behavioral Architecture Breakdown
π Dual-Language Article: This post contains full sections in both English and Korean (3,000+ chars) for global developers and readers.
πΊπΈ [ENGLISH VERSION]
1. Introduction & Project Motivation
In today's fast-paced digital world, developers, knowledge workers, and freelancers face burnout, information overload, and workplace friction. Heavy monolithic SaaS platforms demand complex logins and harvest sensitive data.
To solve this, we created Mood Weather β a lightweight, zero-dependency micro web app built on the KISS principle, delivering 0.3s instant in-browser diagnostic evaluations.
- Live Application: https://mood-weather1024.pomyjo.com
- Central Hub: https://pomyjo.com
2. Architectural Framework & Diagnostic Metrics
Mood Weather evaluates 5 core dimensions:
- Proactivity & Engagement: Measures intrinsic drive vs. reactive friction.
- Stress Resilience: Evaluates emotional recovery elasticity.
- Decision-Making Bias: Highlights cognitive biases (loss aversion, overconfidence).
- Interpersonal Dynamics: Maps communication patterns across work and personal relationships.
- Growth Roadmap: Delivers tailored, actionable behavioral guidance.
3. Pure Web Standards & Client-Side Execution
Instead of shipping a 50MB framework bundle, this app uses pure Vanilla HTML5, CSS3, and ES6+ JS. 100% of calculations execute locally inside the user's browser, guaranteeing total data privacy and zero latency.
π°π· [νκ΅μ΄ μ¬μΈ΅ ν΄μ€ (Korean Version β 3,000μ μ΄μ)]
1. π― νλ‘μ νΈ κ°λ° λ°°κ²½ λ° λ¬Έμ μμ (Introduction & Background)
νλ λμ§νΈ μ¬νμμ μ§μ λ Έλμ, μ§μ₯μΈ, ν리λμ, κ°λ°μλ€μ λ§€μΌκ°μ΄ μλ§μ μ 보μ μ 무 μ€νΈλ μ€, μ μμ κ³ κ° μμμ μ΄μκ°κ³ μμ΅λλ€. λ¨μν κΈ°λ₯μ± μΉ μλΉμ€λ κ±°λν λ¨μΌ(Monolithic) SaaS μμ€ν μ μ μ μκ² λ³΅μ‘ν νμκ°μ κ³Ό κ³Όλν κ°μΈμ 보 μ λ ₯, λ¬΄κ±°μ΄ μ€ν¬λ¦½νΈ λ‘λ© μκ°μ μꡬνκ³€ ν©λλ€.
μ΄λ¬ν λ¬Έμ μμ μμμ Mood Weather νλ‘μ νΈκ° νμνμ΅λλ€. μ΄ νλ‘μ νΈλ "λ¨μν¨(KISS μμΉ)κ³Ό κ°μΈμ 보 보νΈ, 0.3μ΄ μ΄κ³ μ λΈλΌμ°μ μ°μ°"μ μ§ν₯νλ©°, μ¬μ©μκ° λ‘κ·ΈμΈμ΄λ μ€μΉ μμ΄ μ¦μ μμ μ μ±ν₯κ³Ό μνλ₯Ό λ€κ°λλ‘ μ§λ¨ν μ μλλ‘ μ€κ³λ λ§μ΄ν¬λ‘ μΉ μ ν리μΌμ΄μ μ λλ€.
λΌμ΄λΈ μλΉμ€ λ°λ‘κ°κΈ°: https://mood-weather1024.pomyjo.com
2. π§ ν΅μ¬ μ¬λ¦¬ν / νλμ¬λ¬΄ν / κΈ°μ μ΄λ‘ νλ μμν¬ (Core Theoretical Framework)
Mood Weatherμ λ¨μν μΌνμ± ν΄μ¦λ κ°λ²Όμ΄ μ¬λ¦¬ ν μ€νΈμ 머무λ₯΄μ§ μκ³ , κ²μ¦λ νμ λͺ¨λΈκ³Ό νλ νλκ³Όν λ° μμ μ¬λ¦¬ν λ°μ΄ν°λ₯Ό μ κΈ°μ μΌλ‘ μ‘°ν©νμ¬ μ€κ³λμμ΅λλ€.
π μ£Όμ μ§λ¨ 5λ μΆ λ° μ λ° μ€μ½μ΄λ§ λͺ¨λΈ
- μ μμ μ£Όλμ± λ° λͺ°μ λ μ§μ (Proactivity & Engagement): μ 무λ μΌμ κ³Όμ μ μν λ μμ μ΄ μ€μ€λ‘ μ£ΌλκΆμ μ₯λμ§, μΈλΆ μκ·Ήμ λ°μνλμ§ μΈ‘μ ν©λλ€.
- μ€νΈλ μ€ λμ² λ° ν볡 νλ ₯μ± (Stress Resilience): κ³Όλν μ 무 λ° λμΈκ΄κ³ κ°λ± μν©μμ μ μμ κ³ κ°μ μ΅μννκ³ λ³Έλ μνλ‘ λ³΅μλλ λ₯λ ₯μ νκ°ν©λλ€.
- μμ¬κ²°μ λ° κ°μ νΈν₯ μ‘°μ¨ (Decision-Making Bias): κ³Όλν νμ , μμ€ ννΌ, μΆ©λμ νλ¨ λ± λ¬΄μμμ νλ μ€λ₯λ₯Ό μκ°νν©λλ€.
- λμΈκ΄κ³ μν΅ λ° κ°μ μνΈμμ© (Interpersonal Dynamics): μμ¬, λλ£, μ°μΈ, μλ λ± νμΈκ³Όμ λν ν¨ν΄ λ° μ μ°© μ νμ λ€μ°¨μμΌλ‘ ν¬μν©λλ€.
- μ₯κΈ°μ μ±μ₯ λ° λΌμ΄ν λ£¨ν΄ μ΅μ ν (Long-Term Growth Roadmap): κ°μ μ κ·Ήλννκ³ μ½μ μ 보μν μ μλ μ€μ©μ νλ μ§μΉ¨μ μ μν©λλ€.
3. π» νλ‘ νΈμλ μκ³ λ¦¬μ¦ & μ½λ μν€ν μ² μ¬μΈ΅ ν΄μ€ (Technical Implementation)
λ³Έ νλ‘μ νΈλ λ¬΄κ±°μ΄ 3rd-party νλ μμν¬(React/Vue/Angular λ±)μ 50MB λ²λ€ νμΌ λμ , μμ μΉ νμ€(Vanilla HTML5, CSS3, ES6+ JavaScript)λ§μ μ¬μ©νμ¬ κ΅¬μΆλμμ΅λλ€.
β‘ μμ μλ°μ€ν¬λ¦½νΈ λ€μ°¨μ μ€μ½μ΄λ§ λ° λ Έλ©λΌμ΄μ μ΄μ μκ³ λ¦¬μ¦
function calculateNormalizedScores(userAnswers, weightMatrix) {
const dimensions = { dimensionA: 0, dimensionB: 0, dimensionC: 0, dimensionD: 0, dimensionE: 0 };
userAnswers.forEach((answerValue, index) => {
const weights = weightMatrix[index];
if (weights) {
Object.keys(weights).forEach(dimKey => {
dimensions[dimKey] += answerValue * weights[dimKey];
});
}
});
const normalizedResults = {};
Object.keys(dimensions).forEach(key => {
const rawVal = dimensions[key];
normalizedResults[key] = Math.min(100, Math.max(0, Math.round(rawVal)));
});
return normalizedResults;
}
μ΄ μκ³ λ¦¬μ¦μ μλ²λ‘ μ¬μ©μμ μλ΅ λ°μ΄ν°λ₯Ό λ¨ 1λ°μ΄νΈλ μ‘μ νμ§ μκ³ , 100% μ¬μ©μμ μΉ λΈλΌμ°μ λ©λͺ¨λ¦¬μμμ μ€μκ° κ³μ°λ©λλ€. λ°λΌμ κ°μΈμ 보 μ μΆ μνμ΄ μμ² μ°¨λ¨λλ©°, λ€νΈμν¬ μ§μ°(Latency)μ΄ μ ν μλ μ΄κ³ μ λ°μμ±μ 보μ₯ν©λλ€.
4. π¨ κΈλμ€λͺ¨νΌμ¦(Glassmorphism) UI μμ€ν & HTML5 Canvas μκ°ν (Design & UX)
μ¬μ©μμ μκ°μ λͺ°μ κ°μ κ·ΉλννκΈ° μν΄ modern μΉ λμμΈ νλ μμν¬μΈ Glassmorphism λμμΈ μμ€ν μ CSS λ³μ κΈ°λ°μΌλ‘ μ§μ ꡬννμμ΅λλ€.
π μ£Όμ UI/UX μ€κ³ κΈ°μ μ§ν
- Ambient Mesh Glow Orbs: CSS radial-gradientμ filter: blur(140px)λ₯Ό κ²°ν©νμ¬ μμνκ² μΌλ μ΄λ κ°μ λ°°κ²½ κ΄μ ꡬν
- Backdrop Filter & Frosted Glass: backdrop-filter: blur(24px) λ° λ°ν¬λͺ ν λ리λ₯Ό κ²°ν©νμ¬ λͺ½νμ μ΄κ³ μΈλ ¨λ μ 리 μ§κ° μ°μΆ
- HTML5 Canvas Pure Geometry Radar: Chart.js κ°μ μΈμ° λΌμ΄λΈλ¬λ¦¬ μμ΄ μΌκ°ν¨μ(Math.sin, Math.cos)λ₯Ό νμ©νμ¬ λ€κ°ν λ μ΄λ μ°¨νΈλ₯Ό μμ μΊλ²μ€ μ’νκ³μ λ€μ΄λ΄λ―Ή λ λλ§
5. π 1μΈ κ°λ° λΌμ΄νμ¬μ΄ν΄ νκ³ λ° λ°°ν¬ μ΄μ μ±κ³Ό (Lessons & Conclusion)
13κ° μ΄μμ λ§μ΄ν¬λ‘ μ§λ¨ μ±μ Vercel Edge Network μμ λ©ν° μλΈλλ©μΈ(.pomyjo.com) κ΅¬μ‘°λ‘ κ΅¬μΆνκ³ μ΄μνλ©΄μ μ»μ κ°μ₯ ν° μ±κ³Όλ *"κ³Όλν ν΄μ λ°°μ (YAGNI μ μ )κ° μ½λμ μλͺ μ κ·Ήλννλ€"**λ μ¬μ€μ΄μμ΅λλ€.
- μ΄κ³ μ μΉ μ±λ₯: Lighthouse μ±λ₯ μ μ 99~100μ λ¬μ±
- μ μ§λ³΄μ μ λ‘(Zero Debt): νλ μμν¬ λ²μ μ κ·Έλ μ΄λλ‘ μΈν μ½λ νμ μν μ λ‘
- ν΅ν© κ΄μ ν μλμ§: λ©μΈ νλΈμΈ pomyjo.comκ³Όμ μ κΈ°μ μ°κ²°λ‘ μνΈ λλ©μΈ νμ μ¦κ°
λΌμ΄λΈ κ΄μ νμ μ μνμ
μ 17κ° μ κ°λ μλΉμ€λ₯Ό μ§μ κ²½νν΄ λ³΄μΈμ:
π POMYJO ν΅ν© κ΄μ ν λ°λ‘κ°κΈ° (https://pomyjo.com)
Top comments (0)