κ°μ κΈ°λ‘μΌλ‘ λλ₯Ό μ΄ν΄νκ³ , 건κ°ν λ§μμΌλ‘ μ±μ₯νλ μ¬μ
π λ°°ν¬ URL
www.mindmood.co.kr
π κ°λ° URL
http://127.0.0.1:3000
- κ°μ ν΄μ : μ€νΈλ μ€ μν λ° κ°μ νν
- μκΈ° μ±μ°° : κ°μ κΈ°λ‘μ ν΅ν μκΈ° μ΄ν΄
- κ°μ μΆμ : κ°μ λ³νμ κ°νΈν νμ
- μμ μ μ²΄μ± : μ°μ μμλ₯Ό ν΅ν΄ λλ₯Ό λ°κ²¬
- λ°μ΄ν°λ² μ΄μ€ μ’ λ₯ : PostgreSQL
- μ°κ²° λΌμ΄λΈλ¬λ¦¬ :
Prismaλ₯Ό μ¬μ©νμ¬ PostgreSQLκ³Ό μ°κ²°
- PostgreSQL λ°μ΄ν°λ² μ΄μ€ λ° μ¬μ©μ μμ±
# PostgreSQL 'postgres' μ¬μ©μ μ μ
psql -U postgres
# mindmood λ°μ΄ν°λ² μ΄μ€ μ°κ²°
\c mindmood
# public μ€ν€λ§ μμ μ νμΈ
SELECT nspname AS schema_name, pg_roles.rolname AS owner
FROM pg_catalog.pg_namespace
JOIN pg_catalog.pg_roles ON pg_roles.oid = pg_namespace.nspowner
WHERE nspname = 'public';
# public μ€ν€λ§μ μμ μ mindmood λ³κ²½
ALTER SCHEMA public OWNER TO postgres;
ALTER SCHEMA public OWNER TO mindmood;
# mindmood μ¬μ©μμκ² κΆν λΆμ¬
GRANT USAGE ON SCHEMA public TO mindmood;
GRANT CREATE ON SCHEMA public TO mindmood;
# λ³κ²½μ¬ν νμΈ
\dn+ public
# λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ’
λ£
\q- π¦.env νμΌ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€μ
DATABASE_URL="postgresql://mindmood:0116@localhost:5432/mindmood"
- νλ‘μ νΈ μ€μ
## μμ‘΄μ± μ€μΉ : 25.12.14 κΈ°μ€ node version(20.19.6), prisma(7.1.0)
npm install
## prisma directory λ° schema μμ±, λ§μ½ prisma λλ ν λ¦¬κ° μλ€λ©΄ μ¬μ©ν΄μΌν¨.
##ποΈschema.prisma νμΌ ν
μ΄λΈ μ μ** (ν
μ΄λΈλͺ
λ° μ»¬λΌ μ μ) <br/><br/>
## 맨 μ²μ λΉνλ‘μ νΈμΌ λ μ¬μ© => μ¬μ€μ μ¬μ© νμ μμ
# npx prisma init
# λ‘μ»¬μ© : λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈ μμ± λ° κ΅¬μ‘° μμ λͺ
λ Ήμ΄
# create + apply + generate
npx prisma migrate dev
# μ΄μμ© : λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈ μμ± λ° κ΅¬μ‘° μμ λͺ
λ Ήμ΄
# λ§μ§λ§μ λ³κ²½μ λ§ μ μ©νκΈ° μν΄μ, migration νμΌ μμ± μν¨. μ΅μ’
μ μ©λ§ ν¨
# apply
npx prisma migrate deployAuthUser: μ¬μ©μ μ 보Diary: μ¬μ©μ μΌκΈ° λ°μ΄ν°SelectCategory: μ ν κ°λ₯ν μΉ΄ν κ³ λ¦¬ λͺ©λ‘
pages/api ν΄λ λ΄μ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©νλ API μλν¬μΈνΈ ꡬν
session: μ¬μ©μ μΈμ κ΄λ¦¬ APIcreateUser: μ¬μ©μ μμ± APIloginUser: μ¬μ©μ λ‘κ·ΈμΈ APIgetDiaries: μ 체 μΌκΈ° λ°μ΄ν° μ‘°ν APIgetExistingDates: μ 체 μΌκΈ° μμ±μΌ λ°μ΄ν° μ‘°ν APIcreateDiary: μΌκΈ° λ°μ΄ν° μ μ₯ APIupdateDiary: νΉμ μΌκΈ° λ°μ΄ν° μμ APIdeleteDiary: νΉμ μΌκΈ° λ°μ΄ν° μμ API
- Runtime Environment :
Node.js (v20.15.1) - Framework :
Next.js - Frontend Library :
React - Type Checking :
TypeScript - Database :
PostgreSQL - IDE :
Visual Studio Code
npm i # νμ λΌμ΄λΈλ¬λ¦¬ μ€μΉ
npm run dev # κ°λ° μλ² μ€ν
npm run build # μλ² λΉλ μν
npm start # μλ² μ€ν- νμκ°μ κΈ°λ₯
- λ‘κ·ΈμΈ κΈ°λ₯
- κ°μ μ΄λͺ¨μ§ νν (μ΅κ³ , μ’μ, 보ν΅, μμ’μ, λ§μ΄ λμ¨)
- GNB ν€λ : κ°μ μ°¨νΈ | μΌκΈ° λͺ©λ‘ | μΌκΈ° μμ±
-
κ΅¬μ± μμ : μ¬κ±΄, κ°μ , νλ, κ²°κ³Ό, μ μ
-
μ€λμ κΈ°λΆ μ κ²
- κ°μ κ°λ : 1-10μ μ ν
- κ°μ μ΄λͺ¨μ§ : κΈ°μ¨, ν볡, μ€λ , μ€λ¦½, λΆμ, μ§μ¦, μ°μΈ, μ¬ν, νν, λΆλ Έ μ ν
-
μ¬κ±΄ κΈ°λ‘
- μ£Όμ μ¬κ±΄ : μκ°, μ₯μ, λ΄μ© μμ±
- ν¨κ»ν μ¬λ : κ°μ‘±, μΉκ΅¬, μ°μΈ, λλ£, μμ¬, λΆν, μ§μΈ, μΉμ², νΌμ, μ§μ μ λ ₯
-
κ°μ νꡬ
- μ£Όμ κ°μ : κ°μ μ ν
- κ°μ μ΄μ : κ°μ μ μ΄μ μ μν© μμ±
-
νλ/λ°μ λΆμ
- νλ κΈ°λ‘ : κ°μ νν λ°©μ μμ±
- νλ μν₯ : κ°μ μ λ―ΈμΉ μν₯ μμ±
- λ―Ένν μ΄μ : κ°μ μ νννμ§ μμ μ΄μ μμ±
-
κ²°κ³Ό νκ°
- κ²°κ³Ό : μ¬κ±΄ κ²°κ³Ό μμ±
- μνλ νλ : λ―Έλ νλ κ³ν μμ±
-
μκΈ° μ μ
- λλ μ κ³Ό λ€μ§ : κΈμ μ μΈ λ©μμ§λ λ€μ§ μμ±
-
- 리μ€νΈ νμ νμ
- μμ λ° μμ κΈ°λ₯
- μκ° κ°μ λΆμ (μκ·Έλν, μ κ·Έλν)
π MindMood
β
βββ π§© components
β βββ π layout # λ μ΄μμ μ»΄ν¬λνΈ
β β βββ Header.tsx # ν€λ
β β βββ Footer.tsx # νΈν°
β β βββ Sidebar.tsx # μ¬μ΄λλ°
β βββ π common # κ³΅ν΅ μ¬μ© μ»΄ν¬λνΈ
β β βββ TopButton.tsx # ν λ²νΌ
β β βββ ButtonStyle.tsx # λ²νΌ μ€νμΌ
β βββ π auth # μ¬μ©μ μΈμ¦ μ»΄ν¬λνΈ
β β βββ UserSignupForm.tsx # νμκ°μ
β β βββ UserLoginForm.tsx # λ‘κ·ΈμΈ
β βββ π calendar
β β βββ Calendar.tsx # [λ©μΈ] κ°μ λ¬λ ₯ μ»΄ν¬λνΈ
β βββ π diary # [μλΈ 2,3,4] κ°μ μΌκΈ° κ΄λ ¨ μ»΄ν¬λνΈ (μμ±, λͺ©λ‘, μμΈ, μμ , μμ )
β β βββ π form # [μλΈ 2-1] μΌκΈ° μμ±
β β β βββ DiaryEntryForm.tsx # [μλΈ 2-1] μΌκΈ° μμ μ»΄ν¬λνΈ
β β β βββ MoodCheck.tsx # [μλΈ 2-1] 1) μ€λμ κΈ°λΆ μ κ²
β β β βββ EventRecord.tsx # [μλΈ 2-1] 2) μ¬κ±΄ κΈ°λ‘
β β β βββ EmotionAnalysis.tsx # [μλΈ 2-1] 3) κ°μ νꡬ
β β β βββ BehaviorAnalysis.tsx # [μλΈ 2-1] 4) νλ/λ°μ λΆμ
β β β βββ ResultEvaluation.tsx # [μλΈ 2-1] 5) κ²°κ³Ό νκ°
β β β βββ SelfSuggestion.tsx # [μλΈ 2-1] 6) μκΈ° μ μ
β β βββ π list # [μλΈ 3,4] κ°μ μΌκΈ° λͺ©λ‘ λ° μμΈ
β β β βββ DiaryList.tsx # [μλΈ 3] μΌκΈ° λͺ©λ‘
β β β βββ DiaryDetail.tsx # [μλΈ 4-1] μΌκΈ° μμΈ(μμ , μμ )
β β β βββ DiaryEdit.tsx # [μλΈ 4-2] μΌκΈ° μμ
β βββ π chart # [μλΈ 5] μκ° κ°μ μ°¨νΈ
β βββ DiaryEntryChart.tsx # [μλΈ 5-1] μ°¨νΈ μμ μ»΄ν¬λνΈ
β βββ PieChart.tsx # [μλΈ 5-1] μ κ·Έλν
β βββ LineChart.tsx # [μλΈ 5-1] μ κ·Έλν
β
βββ π pages
β βββ π api # λ°μ΄ν°λ² μ΄μ€ API
β β βββ session.ts # μ¬μ©μ μΈμ
κ΄λ¦¬
β β βββ createUser.ts # μ¬μ©μ λ°μ΄ν° μμ±
β β βββ loginUser.ts # μ¬μ©μ λ‘κ·ΈμΈ
β β βββ getDiaries.ts # μ 체 μΌκΈ° λ°μ΄ν° μ‘°ν
β β βββ getExistingDates.ts # μ 체 μΌκΈ° μμ±μΌ λ°μ΄ν° μ‘°ν
β β βββ createDiary.ts # μΌκΈ° λ°μ΄ν° μ μ₯
β β βββ π updateDiary # νΉμ ID μΌκΈ° λ°μ΄ν° μμ
β β β βββ [id].ts
β β βββ π deleteDiary # νΉμ ID μΌκΈ° λ°μ΄ν° μμ
β β βββ [id].ts
β βββ _app.tsx # κ³΅ν΅ μ»΄ν¬λνΈ μ μ
β βββ index.tsx # λ©μΈ νμ΄μ§(κ°μ λ¬λ ₯)
β βββ signup.tsx # νμκ°μ
νμ΄μ§
β βββ login.tsx # λ‘κ·ΈμΈ νμ΄μ§
β βββ π diary # μΌκΈ° κ΄λ ¨ νμ΄μ§
β β βββ NewDiary.tsx # μΌκΈ° μμ± νμ΄μ§
β β βββ ListDiary.tsx # μΌκΈ° λͺ©λ‘ νμ΄μ§
β β βββ [id].tsx # μΌκΈ° μμΈ νμ΄μ§(μμ , μμ )
β βββ chart.tsx # κ°μ μ°¨νΈ νμ΄μ§
β βββ 404.tsx # μλ¬ νμ΄μ§
β
βββ πΌοΈ public
β βββ icon.ico # νλΉμ½ νμΌ
β
βββ π¨ styles
β βββ globals.css # κΈλ‘λ² μ€νμΌ CSS νμΌ
β
βββ πΎ prisma
β βββ schema.prisma # Prisma λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ μ μ
β
βββ π§ lib
β βββ prisma.ts # Prisma ν΄λΌμ΄μΈνΈ μ€μ
β βββ session.js # Express μΈμ
λ―Έλ€μ¨μ΄ μ€μ
β
βββ ποΈ context # κ³΅ν΅ μΈμ
κ΄λ¦¬ ν΄λ
β βββ SessionContext.js # μ¬μ©μ μΈμ
μν κ΄λ¦¬
β
βββ ποΈ stores # MobX μ€ν μ΄ ν΄λ
β βββ index.tsx # μ€ν μ΄ λͺ¨μ λ° λ΄λ³΄λ΄κΈ°
β βββ UserStore.tsx # μ¬μ©μ μν κ΄λ¦¬ μ€ν μ΄
β βββ DiaryStore.tsx # μΌκΈ° μν κ΄λ¦¬ μ€ν μ΄
β
βββ π types
β βββ user.ts # μ¬μ©μ λ°μ΄ν° νμ
μ μ
β βββ diary.ts # μΌκΈ° λ°μ΄ν° νμ
μ μ
β βββ next-session.d.ts # Next.js API μμ² μΈμ
νμ
μ μ
β βββ next-auth.d.ts # NextAuth.js μΈμ
νμ
νμ₯ μ μ
β
βββ βοΈ .env # νκ²½ λ³μ μ€μ νμΌ
βββ βοΈ next.config.js # Next.js μ€μ νμΌ
βββ βοΈ next-env.d.ts # Next.js μ€μ νμΌ
βββ βοΈ package.json # νλ‘μ νΈ μμ‘΄μ± μ€μ
βββ βοΈ tsconfig.json # TypeScript μ€μ νμΌ- μ£Όμ :
#4C956C(λΌμ΄νΈ κ·Έλ¦°)
- κ°μ‘°μ :
#2C6E49(λ₯ κ·Έλ¦°) - 보쑰μ :
#D6E7DB(μ°ν κ·Έλ¦°) - λ°°κ²½μ :
#FEFEE3(μμ΄λ³΄λ¦¬) - ꡬλΆμ :
#F5F3F5(λΌμ΄νΈ κ·Έλ μ΄)
- κΈμ κ°μ :
#FFC9B9(νμ€ν νν¬) - μλ¦Ό/μ λ :
#D68C45(μ€λ μ§)
