Skip to content

prgrms-fe-devcourse/NFE1-1-3-DEVIEW

Repository files navigation

DEVIEW

Deview๋Š” ๊ฐœ๋ฐœ์ž, ์ทจ์ค€์ƒ๋“ค์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์›น์‚ฌ์ดํŠธ๋กœ, React์™€ TypeScript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ๋ฐ˜์‘ํ˜• ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

Production

Deview

Figma

DEV 3์ฐจ DEVIEW (Copy)

โญ Deview ReadMe โญ

โ™ป๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

๊ฐœ๋ฐœ ์Šคํƒ

ํ”„๋ก ํŠธ์—”๋“œ

React TypeScript Vite Zustand Tanstack Query Axios React Router TailwindCSS

๋ฐฑ์—”๋“œ

GitHub - shlee9999/deview-backend: deview ํ”„๋กœ์ ํŠธ์˜ backend ๋ ˆํฌ์ง€ํ† ๋ฆฌ

NodeJS Express MongoDB

ํ˜‘์—… ๋„๊ตฌ

Github Projects

์ธํ”„๋ผ & ๋„๊ตฌ

๋ฐฐํฌ ํ™˜๊ฒฝ

Vercel CloudType

๋””์ž์ธ ํ˜‘์—…

Figma

๐Ÿ“ƒ ์ปจ๋ฒค์…˜


  • ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

    • Feat: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • Fix: ๋ฒ„๊ทธ ์ˆ˜์ •
    • Docs: ๋ฌธ์„œ ์ˆ˜์ •
    • Refactor: ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง
    • Chore: ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •
    • Style : ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ๊ธฐ๋Šฅ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
  • ์ฝ”๋“œ ์ปจ๋ฒค์…˜

    1. ์ปดํฌ๋„ŒํŠธ

      1. rfc
      2. rfcn
      type ComponentProps = {
        name: string;
      };
      
      export const Component = ({ name }: ComponentProps) => {
        return <div>Component</div>;
      };
    2. hook

      export function useHook(){
      	...
      }
    3. ESLint, Prettier ์‚ฌ์šฉ

    4. ์ƒ์ˆ˜, ๋ณ€์ˆ˜ ๋ช…๋ช… ๊ทœ์น™

      1. ๋ฒ„ํŠผ
        1. buttonโ†’btn
      2. ๋ฐฐ์—ด
        1. users (s)
        2. user + List(๋‹จ์ˆ˜๋ช… + List)
    5. ์ฝœ๋ฐฑํ•จ์ˆ˜ โ†’ ํ™”์‚ดํ‘œ

    6. ์ฃผ์„

      1. anchor?

      2. Better Comments vscode ํ™•์žฅ

      3. ๊ธฐ๋ณธ ์ฃผ์„ ์ƒ‰์ƒ ๋ฐ”๊พธ๊ธฐ - settings.json์— ๋‹ค์Œ ์ถ”๊ฐ€

         "editor.tokenColorCustomizations": {
            "textMateRules": [
              {
                "scope": ["comment", "comment punctuation.definition.comment"],
                "settings": {
                  "foreground": "#EFDC05",
                  "fontStyle": ""
                }
              }
            ]
          },
    7. ํด๋” ๋„ค์ด๋ฐ

      1. ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ๋ช…๋ช…๊ทœ์น™
      2. ์ปดํฌ๋„ŒํŠธ ์ด์™ธ์˜ ํŒŒ์ผ ๋ช…๋ช…๊ทœ์น™
      3. ์ปดํฌ๋„ŒํŠธ ํด๋” - ํŒŒ์Šค์นผ
      4. ์ตœ์ƒ์œ„ ํด๋” - ์นด๋ฉœ
    8. ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ ๋„ค์ด๋ฐ

      ๋ฆฌ์…‹ ๋ฒ„ํŠผ

๐Ÿ› ๏ธ ์ฑ„ํƒํ•œ ๊ฐœ๋ฐœ ๊ธฐ์ˆ 


ํ”„๋ก ํŠธ์—”๋“œ ํ•ต์‹ฌ ๊ธฐ์ˆ 

TailwindCSS

  • ์ง๊ด€์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋กœ ๋น ๋ฅธ UI ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  • ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์šฉ์ดํ•˜๊ณ  ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”
  • ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ๊ตฌํ˜„์ด ํŽธ๋ฆฌ
  • ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์Šคํƒ€์ผ๋ง์œผ๋กœ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

Zustand

  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Redux๋ณด๋‹ค ์ ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ
  • Flux ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ํ๋ฆ„
  • TypeScript ์ง€์›์ด ์šฐ์ˆ˜ํ•˜๋ฉฐ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ์Œ

๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

React Query

  • ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํšจ์œจ์  ์ฒ˜๋ฆฌ
  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๋ฐ ์ž๋™ ๊ฐฑ์‹ 
    • ์‹ ์„ ํ•œ ๋ฐ์ดํ„ฐ ์œ ์ง€(Fresh & Stale)
    • ์˜ตํ‹ฐ๋ฏธ์Šคํ‹ฑ ์—…๋ฐ์ดํŠธ ์ง€์›
    • ๋ฌดํ•œ ์Šคํฌ๋กค/ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ ์šฉ์ด
    • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ฒฝํ—˜

  • ESLint & Prettier: ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ ์œ ์ง€
  • TypeScript: ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด
  • Vite: ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐ ๋นŒ๋“œ ์„ฑ๋Šฅ

๐ŸŒด ๋ธŒ๋žœ์น˜ ์ „๋žต

GitHub Flow๋ฅผ ์ฑ„ํƒํ•œ ์ฃผ์š” ์ด์œ ์™€ ํŠน์ง•์„ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ ํƒ ์ด์œ 

  • ์งง์€ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์— ์ตœ์ ํ™”๋œ ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ
  • ์‹ ์†ํ•œ ๋ฐฐํฌ์™€ ํšจ์œจ์ ์ธ ํ˜‘์—…

์ฃผ์š” ํŠน์ง•

๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ

  • ๋‹จ์ผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(main)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์šด์˜
  • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ๋น ๋ฅธ ๋ณ‘ํ•ฉ
  • ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ๋‹จ์ˆœํ•˜์—ฌ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ๋‚ฎ์Œ

ํ˜‘์—… ํ”„๋กœ์„ธ์Šค

  • Pull Request๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ
  • ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ์™€ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ์ง€์›
  • ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ

์žฅ์ 

  • ์œ ์—ฐํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์›Œํฌํ”Œ๋กœ์šฐ
  • ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ง€์†์ ์ธ ๊ฐœ์„ 

๐Ÿ—๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ


  • Front-End
    ๐Ÿ“ฆsrc
     โ”ฃ ๐Ÿ“‚assets            # ์ •์  ์ž์›
     โ”ฃ ๐Ÿ“‚components        # ์ปดํฌ๋„ŒํŠธ
     โ”ƒ โ”ฃ ๐Ÿ“‚Common         # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
     โ”ƒ โ”ฃ ๐Ÿ“‚LoginPage      # ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚MainPage       # ๋ฉ”์ธ ํŽ˜์ด์ง€ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚MyPage         # ๋งˆ์ด ํŽ˜์ด์ง€ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚PostCreatePage # ํฌ์ŠคํŠธ ์ƒ์„ฑ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚PostDetailPage # ํฌ์ŠคํŠธ ์ƒ์„ธ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚PostPage       # ํฌ์ŠคํŠธ ๋ชฉ๋ก ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚RankPage       # ๋žญํ‚น ํŽ˜์ด์ง€ ๊ด€๋ จ
     โ”ƒ โ”— ๐Ÿ“‚RegisterPage   # ํšŒ์›๊ฐ€์ž… ๊ด€๋ จ
     โ”ฃ ๐Ÿ“‚constants         # ์ƒ์ˆ˜
     โ”ฃ ๐Ÿ“‚customTypes      # ํƒ€์ž… ์ •์˜
     โ”ฃ ๐Ÿ“‚hooks            # ์ปค์Šคํ…€ ํ›…
     โ”ฃ ๐Ÿ“‚pages            # ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ
     โ”ฃ ๐Ÿ“‚services         # API ์„œ๋น„์Šค
     โ”ƒ โ”ฃ ๐Ÿ“‚auth          # ์ธ์ฆ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚comment       # ๋Œ“๊ธ€ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚notification  # ์•Œ๋ฆผ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚post          # ๊ฒŒ์‹œ๊ธ€ ๊ด€๋ จ
     โ”ƒ โ”ฃ ๐Ÿ“‚report        # ์‹ ๊ณ  ๊ด€๋ จ
     โ”ƒ โ”— ๐Ÿ“‚user          # ์‚ฌ์šฉ์ž ๊ด€๋ จ
     โ”ฃ ๐Ÿ“‚stores           # ์ƒํƒœ ๊ด€๋ฆฌ
     โ”ฃ ๐Ÿ“‚utils            # ์œ ํ‹ธ๋ฆฌํ‹ฐ
     โ”— ๐Ÿ“œApp.tsx          # ์•ฑ ์ง„์ž…์ 
    
  • Back-End
    ๐Ÿ“ฆsrc
     โ”ฃ ๐Ÿ“‚.vscode
     โ”ƒ โ”— ๐Ÿ“œsettings.json
     โ”ฃ ๐Ÿ“‚config
     โ”ƒ โ”ฃ ๐Ÿ“œdatabase.js
     โ”ƒ โ”ฃ ๐Ÿ“œserver.js
     โ”ƒ โ”— ๐Ÿ“œsocket.js
     โ”ฃ ๐Ÿ“‚controllers
     โ”ƒ โ”ฃ ๐Ÿ“œauthController.js
     โ”ƒ โ”ฃ ๐Ÿ“œcommentController.js
     โ”ƒ โ”ฃ ๐Ÿ“œnotificationController.js
     โ”ƒ โ”ฃ ๐Ÿ“œpostController.js
     โ”ƒ โ”ฃ ๐Ÿ“œreportController.js
     โ”ƒ โ”— ๐Ÿ“œuserController.js
     โ”ฃ ๐Ÿ“‚middleware
     โ”ƒ โ”ฃ ๐Ÿ“œauthMiddleware.js
     โ”ƒ โ”ฃ ๐Ÿ“œcommentMiddleware.js
     โ”ƒ โ”ฃ ๐Ÿ“œcorsMiddleware.js
     โ”ƒ โ”ฃ ๐Ÿ“œindex.js
     โ”ƒ โ”— ๐Ÿ“œpostMiddleware.js
     โ”ฃ ๐Ÿ“‚models
     โ”ƒ โ”ฃ ๐Ÿ“œComment.js
     โ”ƒ โ”ฃ ๐Ÿ“œLike.js
     โ”ƒ โ”ฃ ๐Ÿ“œNotification.js
     โ”ƒ โ”ฃ ๐Ÿ“œPost.js
     โ”ƒ โ”ฃ ๐Ÿ“œReport.js
     โ”ƒ โ”ฃ ๐Ÿ“œScrap.js
     โ”ƒ โ”ฃ ๐Ÿ“œThumb.js
     โ”ƒ โ”ฃ ๐Ÿ“œUser.js
     โ”ƒ โ”— ๐Ÿ“œView.js
     โ”ฃ ๐Ÿ“‚routes
     โ”ƒ โ”ฃ ๐Ÿ“œauthRoutes.js
     โ”ƒ โ”ฃ ๐Ÿ“œcommentRoutes.js
     โ”ƒ โ”ฃ ๐Ÿ“œindex.js
     โ”ƒ โ”ฃ ๐Ÿ“œnotificationRoutes.js
     โ”ƒ โ”ฃ ๐Ÿ“œpostRoutes.js
     โ”ƒ โ”ฃ ๐Ÿ“œreportRoutes.js
     โ”ƒ โ”— ๐Ÿ“œuserRoutes.js
     โ”ฃ ๐Ÿ“‚utils
     โ”ƒ โ”— ๐Ÿ“œgetPaginated.js
     โ”ฃ ๐Ÿ“œ.env
     โ”ฃ ๐Ÿ“œ.gitignore
     โ”ฃ ๐Ÿ“œapp.js
     โ”ฃ ๐Ÿ“œpackage-lock.json
     โ”— ๐Ÿ“œpackage.json
    

๐Ÿ™‹โ€โ™‚๏ธ ์—ญํ•  ๋ถ„๋‹ด


๐Ÿ‘ฉโ€๐Ÿ’ป ๋ฏผ์ •์•„ ๐Ÿ‘จโ€๐Ÿ’ป ์†ก์›…๊ทœ ๐Ÿ‘ฉโ€๐Ÿ’ป ์ด๊ฐ€์€ ๐Ÿ‘จโ€๐Ÿ’ป ์ด์„ฑํ›ˆ ๐Ÿ‘จโ€๐Ÿ’ป ์กฐ์ฒœ์‚ฐ
๋‹ด๋‹น ํŽ˜์ด์ง€
- ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€
- ๋žญํ‚น ํŽ˜์ด์ง€

์ฃผ์š” ๊ธฐ๋Šฅ
- ํ—ค๋”
- ์•Œ๋ฆผ
- ๊ฒ€์ƒ‰ ๋ฐ ๊ฒ€์ƒ‰ ๋ชฉ๋ก
- ๋žญํ‚น ๋ชฉ๋ก
๋‹ด๋‹น ํŽ˜์ด์ง€
- ๋ฉ”์ธ ํŽ˜์ด์ง€
- ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก
- ์œ ์ € ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก

์ฃผ์š” ๊ธฐ๋Šฅ
- ๋ฐ˜์‘ํ˜• ์Šฌ๋ผ์ด๋“œ ๋ฉ”์ธ๋ฐฐ๋„ˆ
- ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ
- ์Šค์ผˆ๋ ˆํ†ค UI
๋‹ด๋‹น ํŽ˜์ด์ง€
- MyPage
- Footer

์ฃผ์š” ๊ธฐ๋Šฅ
- UserProfile
- UserPosts
- UserComments
- UserScraps
- UserInfo
- CodeViewer
Front-End
๋‹ด๋‹น ํŽ˜์ด์ง€
- ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
- ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
- ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€
- ์—๋Ÿฌ ํŽ˜์ด์ง€

Back-End
- ๋ชจ๋“  ๋ฐฑ์—”๋“œ ์ „์ž„
๋‹ด๋‹น ํŽ˜์ด์ง€
- ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ ํŽ˜์ด์ง€
- ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธ ํŽ˜์ด์ง€

์ฃผ์š” ๊ธฐ๋Šฅ
- ๊ฒŒ์‹œ๊ธ€ CRUD
- ๋Œ“๊ธ€ CRUD
- ๋ฌดํ•œ ์Šคํฌ๋กค
GitHub GitHub GitHub GitHub GitHub
Gmail Gmail Gmail Gmail Gmail

๐Ÿ“… ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ์ž‘์—… ๊ด€๋ฆฌ


โฐ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„

  • ์ „์ฒด ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 24/10/22 ~ 24/11/06
  • UI ๊ตฌํ˜„ : 24/10/22~24/10/25
  • ๊ธฐ๋Šฅ ๊ตฌํ˜„ : 24/10/25 ~ 24/11/06

๐Ÿ“‹ ์ด์Šˆ ๊ด€๋ฆฌ

  • GitHub Projects์™€ Issues๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ 
  • ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์š”์ฒญ ๋“ฑ ๋ชฉ์ ์— ๋”ฐ๋ฅธ ์ด์Šˆ ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ

๐Ÿง ์‹ ๊ฒฝ ์“ด ๋ถ€๋ถ„


optimistic update

๐Ÿ“„ ํŽ˜์ด์ง€๋ณ„ ๊ธฐ๋Šฅ


[MainPage]

๋ฉ”์ธํŽ˜์ด์ง€1

๋ฐ˜์‘ํ˜•

์Šค์ผˆ๋ ˆํ†ค

์Šค์ผˆ๋ ˆํ†ค

  • ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ
    • ๋ฐฐ๋„ˆ
      • ๊ฐ€์žฅ ์กฐํšŒ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ
      • ์˜ค๋Š˜ ์˜ฌ๋ฆฐ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ
      • ๋‹ต๋ณ€์˜ ์ข‹์•„์š”๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋‹ฌ๋ฆฐ ๋ฆฌ๋ทฐ์–ด
    • ๊ฐ€์žฅ ์ข‹์•„์š”๊ฐ€ ๋งŽ์ด ๋‹ฌ๋ฆฐ ์ธ๊ธฐ ๊ฒŒ์‹œ๊ธ€ 3๊ฐœ
    • ๋‹ต๋ณ€์ด ๋‹ฌ๋ฆฌ์ง€ ์•Š์€ ์งˆ๋ฌธ 2๊ฐœ
    • ์ตœ์‹  ๊ฒŒ์‹œ๊ธ€
    • ์—๋Ÿฌ/๋กœ๋”ฉ ๋Œ€์ฒด UI

[PostPage]

๋ฐ๋ชจ ์‹œ์—ฐ

  • ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ
    • ์ •๋ ฌ ํ† ๊ธ€๋ฒ„ํŠผ์„ ํ†ตํ•œ ์ธ๊ธฐ/์ตœ์‹  ๊ฒŒ์‹œ๊ธ€ ๋ณ€๊ฒฝ
    • ๋ฌดํ•œ์Šคํฌ๋กค
    • ์—๋Ÿฌ/์ดˆ๊ธฐ ๋กœ๋”ฉ ๋Œ€์ฒด UI

[RankPage]

๋žญํ‚น

  • ์œ ์ € ๋žญํ‚น
    • ํ•ด๋‹น ์œ ์ €๊ฐ€ ๋‹จ ๋Œ“๊ธ€์— ์ถ”์ฒœ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์œผ๋กœ ์ˆœ์œ„ ๊ฒฐ์ •
    • ์œ ์ € ID, ์†ํ•œ ๊ทธ๋ฃน, ์ถ”์ฒœ์ˆ˜, ๊ฒŒ์‹œ๊ธ€ ๋ณด๊ธฐ
    • ๊ฒŒ์‹œ๊ธ€ ๋ณด๊ธฐ๋Š” ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

[SearchPage]

๊ฒ€์ƒ‰

  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
    • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•ด ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ
    • ํ•„ํ„ฐ๋งŒ ์„ ํƒ ๊ฐ€๋Šฅํ•˜๊ณ  ์ตœ๋Œ€ 3๊ฐœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ฒ€์ƒ‰ ๋ชฉ๋ก ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น PostDetailPage๋กœ ์ด๋™

[LoginPage]

๋กœ๊ทธ์ธํšŒ์›๊ฐ€์ž…

  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ
    • ์•„์ด๋””
    • ๋น„๋ฐ€๋ฒˆํ˜ธ

[RegisterPage]

  • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ
    • ์•„์ด๋””
    • ๋น„๋ฐ€๋ฒˆํ˜ธ
    • ์ด๋ฆ„
    • ๊ทธ๋ฃน

[PostCreatePage]

๊ฒŒ์‹œ๋ฌผ์ƒ์„ฑ

  • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ
    • ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ
    • ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ
    • ๊ด€๋ จ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์–ธ์–ด ๋ฐ ๋ฒ„์ „ ์ •๋ณด
          • ๋ฒ„ํŠผ์œผ๋กœ ์ถ”๊ฐ€, ์‚ญ์ œ
    • ์งˆ๋ฌธํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ ์ž‘์„ฑ
      • Quill ์—๋””ํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ํ•˜์ด๋ผ์ดํŒ…

[PostDetailPage]

๊ฒŒ์‹œ๊ธ€์ˆ˜์ •์‚ญ์ œ

  • ๊ฒŒ์‹œ๊ธ€ ์„ธ๋ถ€
    • ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ
    • ์ž‘์„ฑ์ผ, ์ž‘์„ฑ์ž, ์–ธ์–ด ๋ฐ ๋ฒ„์ „ ์ •๋ณด
    • ๋‚ด์šฉ ๋ฐ ์ฝ”๋“œ
    • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ
    • ๊ฒŒ์‹œ๊ธ€์— ์ข‹์•„์š”, ์Šคํฌ๋žฉ, ์‹ ๊ณ 
    • ๋Œ“๊ธ€ ๊ธฐ๋Šฅ
    • ๋Œ“๊ธ€ ์ถ”์ฒœ ๊ฐ€๋Šฅ
    • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ ๋Œ“๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ

[PostUpdatePage]

  • ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •
    • ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ, ๋‚ด์šฉ, ์–ธ์–ด ๋ฐ ๋ฒ„์ „, ์ฝ”๋“œ ์ˆ˜์ •

[MyPage]

๋งˆ์ดํŽ˜์ด์ง€

  • ๋งˆ์ดํŽ˜์ด์ง€
    • ํ”„๋กœํ•„ (ํšŒ์›๊ฐ€์ž…ํ•˜๋ฉด ๋žœ๋ค ์ง€์ •)
    • ์ด๋ฆ„(๊ทธ๋ฃน)
    • ๋‚ด ๊ฒŒ์‹œ๊ธ€ - ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€
    • ๋‚ด ๋Œ“๊ธ€ - ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋Œ“๊ธ€
    • ์Šคํฌ๋žฉ - ๋‚ด๊ฐ€ ์Šคํฌ๋žฉํ•œ ๊ธ€
    • ๋‚ด ์ •๋ณด - ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ์‹œ ๋‚ด ์ •๋ณด ์—ด๋žŒ ๋ฐ ์ˆ˜์ •

[Alarm]

์•Œ๋ฆผ

  • ๋‚ด ๊ฒŒ์‹œ๋ฌผ์— ๋Œ“๊ธ€ ๋‹ฌ๋ฆด ๊ฒฝ์šฐ
  • ๋‚ด ๊ฒŒ์‹œ๋ฌผ์— ์ถ”์ฒœ
  • ์‹ ๊ณ  5ํšŒ ์ด์ƒ
  • ์‚ญ์ œ ๊ฐ€๋Šฅ, ์ „์ฒด ํ™•์ธ ๊ฐ€๋Šฅ

[ErrorPage]

์—๋ŸฌํŽ˜์ด์ง€

  • ์—๋Ÿฌ ํŽ˜์ด์ง€

๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…


  • React Quill

    • ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •์—์„œ, ๋ฐ์ดํ„ฐ ์†์‹ค
    • ์—๋””ํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์ด ์ผ์–ด๋‚จ
    • CodeViewer์—์„œ react quill์„ read only ๋กœ ๋ณด์—ฌ์คฌ์œผ๋‚˜, ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋กœ react-quill์—†์ด ๊ทธ๋ƒฅ html ํƒœ๊ทธ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜
      • ์ด๋•Œ highlight.js๋ฅผ ์‚ฌ์šฉํ•ด์„œ highlighter ์ ์šฉ
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ API๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ๋‹ค์šด๋˜๋Š” ๋ฌธ์ œ

    • ์˜ต์…”๋„ ์ฒด์ธ์„ ํ†ตํ•ด ์กด์žฌํ•˜์ง€ ์กด์žฌ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌ
    • react-error-boundary๋ฅผ ๋„์ž…ํ•ด ์—๋Ÿฌ๋ฐœ์ƒ ์‹œ fallback ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ€์ฒด๋˜๋„๋ก ๋ณ€๊ฒฝ

Back-End

  • MongoDB ์šฉ๋Ÿ‰ ์ œํ•œ โ†’ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ œํ•œ โ†’ boring-avatar ์‚ฌ์šฉํ•˜์—ฌ DB ์ฐจ์ง€ X
  • ์ข‹์•„์š”, ์Šคํฌ๋žฉ๋งŒ ํ•ด๋„ updatedAt ๋ณ€๊ฒฝ๋จ โ†’ timestamp: false
  • MongoDB timestamp๊ฐ€ UTC ์‹œ๊ฐ„์œผ๋กœ๋งŒ ์ €์žฅ๋จ โ†’ ๋ชจ๋“  ์Šคํ‚ค๋งˆ์˜ createdAt, updatedAt์˜ getter์— moment ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ

๐ŸŽฏ ๊ฐœ์„  ๋ชฉํ‘œ


  • ์†Œ์† ๊ธฐ๋Šฅ์„ ํ™•๋Œ€ ๋ฐ ์„ธ๋ถ„ํ™”
    • ์†Œ์† ์ง‘๋‹จ ๋ฟ ์•„๋‹ˆ๋ผ ์†Œ์† ํšŒ์‚ฌ/ํ•™๊ต๋ฅผ ์ถ”๊ฐ€
    • โ€˜๋ธ”๋ผ์ธ๋“œโ€™์™€ ์œ ์‚ฌํ•œ ์ธ์ฆ์ œ๋กœ ๋ณ€๊ฒฝ
    • ๊ฒ€์ฆ๋œ ์œ ๋ช…ํ•œ ํšŒ์‚ฌ์˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ
  • ํŠน์ • ์œ ์ €์—๊ฒŒ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์‹ ์ฒญ
    • ์œ ๋ช… ํšŒ์‚ฌ์— ์†Œ์†ํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ๋ฆฌ๋ทฐ๋ฅผ ์‹ ์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹
    • ๋ฆฌ๋ทฐ์–ด ์ง€์ •์‹œ ์‹ ์ฒญ๋น„๊ฐ€ ๋ฐœ์ƒ : ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉฐ ์•ฝ๊ฐ„์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ํ†ตํ•œ ์ˆ˜์ต๊ตฌ์กฐ
  • ์—…์  ์‹œ์Šคํ…œ
    • ๋ฆฌ๋ทฐ์–ด์˜ ํ™œ๋™์— ๋”ฐ๋ฅธ ์—…์ (๋ฏธ์…˜) ์ง„์ฒ™๋„ ์ƒ์Šน
    • ์ผ์ • ์ˆ˜์น˜ ๋‹ฌ์„ฑ ์‹œ ๋ณด์ƒ์„ ํ†ตํ•ด ๊ฒŒ์‹œ๊ธ€/๋Œ“๊ธ€์—์„œ ์ž์‹ ์˜ ํ”„๋กœํ•„์„ ์žฅ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฑƒ์ง€,์นญํ˜ธ๋ฅผ ํš๋“๊ฐ€๋Šฅ
    • ๋ฑƒ์ง€๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฆฌ๋ทฐ์–ด์˜ ๋‹ต๋ณ€ ํ€„๋ฆฌํ‹ฐ์™€ ์‹ ๋ขฐ๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ
  • ๋” ์„ธ๋ถ„ํ™”๋œ ์ •๋ ฌ ๋ฐ ํ•„ํ„ฐ๋ง
  • ๋” ์„ธ๋ถ„ํ™”๋œ ๊ฒŒ์‹œ๊ธ€/๋Œ“๊ธ€ ํ‰๊ฐ€ ๊ธฐ๋Šฅ
  • ๊ฒŒ์‹œ๊ธ€ ์ž„์‹œ ์ €์žฅ
  • ๋Œ€๋Œ“๊ธ€ ๊ธฐ๋Šฅ
  • ์˜ค๋žซ๋™์•ˆ ๋‹ต๋ณ€์„ ๋ชป ๋ฐ›์€ ๊ฒŒ์‹œ๊ธ€์„ ์œ„ํ•œ AI ๋‹ต๋ณ€
  • ๊นƒํ—ˆ๋ธŒ ํŒŒ์ผ๋งํฌ๋ฅผ ๋ณธ๋ฌธ์— ์ฒจ๋ถ€ํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด ์ฝ”๋“œ๋ฐ•์Šค๋กœ ๋ณด์—ฌ์ง€๋Š” ๊ธฐ๋Šฅ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ


๋ฏผ์ •์•„

React Query ํ™œ์šฉ์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค!

์†ก์›…๊ทœ

ํ˜‘์—… ๊ฒฝํ—˜์„ ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํ”„๋กœ์ ํŠธ์˜€์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ํ”„๋กœ์ ํŠธ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฐ€์€

๊ฐ™์ด ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ๋„ˆ๋ฌด ์žฌ๋ฐŒ์—ˆ๊ณ  ๋งŽ์ด ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜„

ํŒ€์›๋ถ„๋“ค ๋•๋ถ„์— ํฌ๊ฒŒ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„ ์—†์ด ์ž˜ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์ด์„ฑํ›ˆ

์ฃผ๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๋งก๊ฒŒ ๋˜์–ด ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜์ง€๋งŒ ๊ทธ๋งŒํผ ๋งŽ์ด ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๊ณ ,

ํ”„๋ก ํŠธ๋Š” ํŒ€์›๋ถ„๋“ค ๋ชจ๋‘ ์—ด์‹ฌํžˆ ํ•ด์ฃผ์…”์„œ ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์กฐ์ฒœ์‚ฐ

ํŒ€์›๋“ค ๋•๋ถ„์— ์งง์€ ๊ธฐ๊ฐ„์ž„์—๋„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์œ„๊ธฐ๋„ ๋„ˆ๋ฌด ์ข‹์•˜๊ณ  ์ฆ๊ฒ๊ฒŒ ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์–ด๋–ค ๊ฑด์ง€ ์•Œ๊ฒŒ๋œ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published