Skip to content

minimo-editor/minimo-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

minimo

λ―Έλ‹ˆλͺ¨λŠ” λͺ¨λ°”일 μ΄ˆλŒ€μž₯, 행사 ν¬μŠ€ν„° 등을 λ“œλž˜κ·Έ μ•€ λ“œλ‘­μœΌλ‘œ μ‰½κ²Œ μ œμž‘ν•  수 μžˆλŠ” λ―Έλ‹ˆ μ›Ή λΉŒλ”μž…λ‹ˆλ‹€.

λ©”μΈλ™μ˜μƒ

JavaScript html5 CSS3 React Styled Components MongoDB Nodejs Express.js ESLint Webpack Firebase AWS Jest Testing-Library git npm

πŸ”— λ°œν‘œμ˜μƒ - 3λΆ„ λ‚΄μ™Έμ˜ κ°„λ‹¨ν•œ κΈ°λŠ₯μ†Œκ°œ λΆ€λΆ„μž…λ‹ˆλ‹€. 전체적인 κΈ°λŠ₯을 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”— 배포링크: https://www.minimo.life

πŸ”— frontend: https://github.com/minimo-editor/minimo-client

πŸ”— backend: https://github.com/minimo-editor/minimo-server


πŸ›  기술 μŠ€νƒ

  • Frontend

    • React
    • ContextAPI
    • ES6
    • Styled-components
    • Google-Maps-API
    • Immer
    • AWS-S3
    • Jest
    • React-testing-library
  • Backend

    • Node.js
    • Express.js
    • MongoDB
    • Mongoose

✨ λͺ©μ°¨


πŸ„β€β™‚οΈ ν”„λ‘œμ νŠΈ κ°œμš”

λ―Έλ‹ˆλͺ¨ μ›Ή λΉŒλ”λŠ” λͺ¨λ°”일 청첩μž₯μ—μ„œ μ‹œμž‘λœ μ•„μ΄λ””μ–΄μž…λ‹ˆλ‹€.

κ²°ν˜Όμ„ ν•  λ•Œ μ‚¬λžŒλ“€μ€ 웨딩홀, λ“œλ ˆμŠ€, λ°˜μ§€ λ“± λͺ¨λ“ κ²ƒμ„ 졜고둜 ν™”λ €ν•˜κ²Œ ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λͺ¨λ°”일 청첩μž₯은 보톡 정적이며 μ΅œκ³ λŠ” μ•„λ‹ˆλΌκ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. 특히 μ½”λ‘œλ‚˜λ‘œμΈν•΄ κ²°ν˜Όμ‹ 뢈참이 λ§Žμ€ μƒν™©μ—μ„œ, λͺ¨λ°”일 청첩μž₯을 더 νŠΉλ³„ν•˜κ²Œ λ§Œλ“€λ©΄ μ’‹κ² λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

ν˜„λŒ€μ˜ 웹은 3D, μ‹€μ‹œκ°„ μΈν„°λ ‰μ…˜, parallax scrolling λ“± μž¬λ°ŒλŠ” μš”μ†Œλ„ 많이 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 것듀을 λ°”μ˜κ²Œ 결혼 μ€€λΉ„ν•˜μ‹œλŠ” 뢄듀이 쉽고 λΉ λ₯΄κ²Œ λ§Œλ“€ 수 μžˆλŠ” μ›Ή λΉŒλ”λ₯Ό λ§Œλ“€κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

개발 기간이 2주둜 μ§§κΈ° λ•Œλ¬Έμ—, 이번 개발 κΈ°κ°„λ™μ•ˆμ—λŠ” μ•„λž˜μ™€ 같은 λͺ©ν‘œλ₯Ό κ°–κ³  μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • 좔후에 νŽΈν•˜κ²Œ 블둝(에디터 κΈ°λŠ₯)을 μΆ”κ°€ν•  수 있게 ν™•μž₯μ„± 있게 λ§Œλ“€κΈ°
  • μœ μ € κ²½ν—˜μ— 핡심적인 λ“œλž˜κ·Έ μ•€ λ“œλ‘­μ„ 라이브러리 없이 직접 λ§Œλ“€κΈ°
  • 기본적인 블둝 μš”μ†Œλ“€(ν…μŠ€νŠΈ, λ™μ˜μƒ, 사진 λ“±)이 ν¬ν•¨λœ 에디터λ₯Ό 잘 λ§Œλ“€κΈ°
  • μ»΄ν¬λ„ŒνŠΈλ“€μ„ μž¬μ‚¬μš©μ„± 있게 ν•˜μ—¬ 좔후에 블둝에 μΆ”κ°€ν•  수 있게 λ§Œλ“€κΈ°

λ”°λΌμ„œ 청첩μž₯ λ³΄λ‹€λŠ” ν™•μž₯μ„± μžˆλŠ” μ›Ή λΉŒλ” ν˜•μ‹μœΌλ‘œ ν•˜κ²Œ λ˜μ—ˆκ³ , 이번 ν”„λ‘œμ νŠΈ κΈ°κ°„λ™μ•ˆ κΈ°λ³Έ νˆ΄μ„ λ§Œλ“€κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ“… μž‘μ—… κΈ°κ°„

  • 기획 : 2021/05/03 ~ 2021/05/07 (1μ£Ό)

    • 아이디어 λΈŒλ ˆμΈμŠ€ν† λ°, 기획, 기술 검증
    • minimo wireframe μž‘μ„±
  • 개발 : 2021/05/10 ~ 2021/05/21 (2μ£Ό)

    • 2μ£Όμ°¨
      • 에디터 및 λ“œλž˜κ·Έ μ•€ λ“œλ‘­ λ“± 핡심 κΈ°λŠ₯ κ΅¬ν˜„
      • μ‚¬μš©μž 인증, μ „μ—­ μƒνƒœκ΄€λ¦¬ λ“±
    • 3μ£Όμ°¨
      • μ»΄ν¬λ„ŒνŠΈ 및 μ»€μŠ€ν…€ ν›… μž¬μ‚¬μš©μ„± 있게 λ¦¬νŒ©ν† λ§
      • λ“œλž˜κ·Έ λ“œλ‘­ μ• λ‹ˆλ©”μ΄μ…˜, μΆ”κ°€ 블둝, κΈ°λŠ₯ λ“±
      • μœ λ‹› ν…ŒμŠ€νŠΈ 및 배포

πŸ•Ή κΈ°λŠ₯

πŸ”— λ°œν‘œμ˜μƒ - 3λΆ„ λ‚΄μ™Έμ˜ κ°„λ‹¨ν•œ κΈ°λŠ₯μ†Œκ°œ λΆ€λΆ„μž…λ‹ˆλ‹€. 전체적인 ν”Œλ‘œμš°λ₯Ό 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

  • κΈ°λ³Έ ν…œν”Œλ¦Ώμ„ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ“œλž˜κ·Έ λ“œλ‘­μ„ 톡해 μ‰½κ²Œ 블둝듀을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이미지, λ™μ˜μƒ, 유튜브 μ˜μƒ 등을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ†Œμ…œ λ―Έλ””μ–΄ λ²„νŠΌμ— 개인 링크λ₯Ό μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŠΉμ • μœ„μΉ˜λ₯Ό 지도에 λ§ˆν¬ν•˜μ—¬ μ£Όμ†Œμ™€ ν•¨κ»˜ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ°”일 화면에 맞게 미리보기가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μ›ν•˜λŠ” μ£Όμ†Œλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
ν…œν”Œλ¦Ώ 선택 λ°°κ²½ λ³€κ²½ / 블둝 μΆ”κ°€ / μ†Œμ…œλ§ν¬
ν…œν”Œλ¦Ώ basic
지도 블락 및 이미지 λ³€κ²½ ν…μŠ€νŠΈ νŽΈμ§‘
map texts
블둝 μŠ€μ™‘ 및 μ‚­μ œ λͺ¨λ°”일 ν™”λ©΄ 미리보기
λ°©λͺ…둝 preview
youtube / video 블락 blank(곡백) 블락
video blank
λ°œν–‰ / μ£Όμ†Œμ„€μ • λ°œν–‰λœ νŽ˜μ΄μ§€ (λͺ¨λ°”일 ν™”λ©΄)
publish published

πŸ§‘β€πŸ’» TECH STACK WHY?

1. CONTEXT API + useReducer VS Redux

  • 초기 μ„€κ³„λ‹¨κ³„μ—μ„œλŠ” μ „μ—­ μƒνƒœλŠ” λ‹¨μˆœνžˆ prop-drilling을 막기 μœ„ν•œ μ •λ„μ˜€κΈ° λ•Œλ¬Έμ— Context APIλ₯Ό μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€.

  • κ΅¬ν˜„μ„ ν•˜λ©΄μ„œ Editor(project)의 μƒνƒœκ΄€λ¦¬ 둜직이 μ»€μ Έμ„œ Reduxλ₯Ό μ‚¬μš©ν• μ§€ Context API + useReducerλ₯Ό μ‚¬μš©ν• μ§€ κ³ λ―Όν–ˆλŠ”λ°, 제 ν”„λ‘œμ νŠΈλŠ” Reduxκ°€ μ œκ³΅ν•˜λŠ” μ—¬λŸ¬ κΈ°λŠ₯도 ν•„μš”κ°€ μ—†μ—ˆκ³ , μƒνƒœμ˜ λ³€ν™”κ°€ κ·Έλ ‡κ²Œ λΉˆλ²ˆν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ꡳ이 Reduxλ₯Ό λ°›μ•„ λ²ˆλ“€λ§ μ‚¬μ΄μ¦ˆλ₯Ό ν‚€μš°κΈ° 보단 Context API + useReducerλ₯Ό μ„ νƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.


β›‘ TEST

  • React Testing Library와 Jestλ₯Ό μ‚¬μš©ν•˜μ—¬ Custom Hook, util, reducer λ“±μ˜ μ€‘μš” λ‘œμ§μ„ μš°μ„ μ μœΌλ‘œ μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ νŠΉμ§•

  • WYSIWYG (What You See Is What You Get)

    ν”„λ‘œμ νŠΈλ₯Ό μ œμž‘/νŽΈμ§‘ ν•˜λŠ” κ³Όμ •μ—μ„œμ˜ λͺ¨μŠ΅ κ·ΈλŒ€λ‘œ 결과물이 λ‚˜μ˜€λ„λ‘ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • Block λ‹¨μœ„ 에디터

    λ―Έλ‹ˆλͺ¨λŠ” 전톡적인 WYSIWYG 에디터와 λ‹€λ₯΄κ²Œ block λ‹¨μœ„λ‘œ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    전톡적인 WYSIWYGλŠ” ν•˜λ‚˜μ˜ contenteditable μš”μ†Œ μ•ˆμ— μ„œλ‘œλ‹€λ₯Έ html markup 을 μž‘μ„±ν•˜λŠ” 방식인데, μ΄λŠ” νŽΈμ§‘ν•˜λŠ” 각각의 μš”μ†Œκ°€ μ„œλ‘œμ—κ²Œ 영ν–₯을 μ£ΌλŠ” μž‘μ€ 버그가 μ‘΄μž¬ν•©λ‹ˆλ‹€. 저도 μ΄λŸ¬ν•œ λΆˆνŽΈν•¨μ„ κ²ͺμ–΄λ³Έ 적이 있기 λ•Œλ¬Έμ—, λ―Έλ‹ˆλͺ¨λŠ” paragraph, title, image 등을 각각 독립적인 contenteditable μš”μ†Œλ‘œμ„œ νŽΈμ§‘ν•˜λ„λ‘ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

  • Clean output data

    ν”„λ‘œμ νŠΈμ˜ 결과물은 html markup 이 μ•„λ‹Œ json ν˜•μ‹μ˜ λ°μ΄ν„°λ‘œ μ €μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    λͺ‡λͺ‡ 에디터, λΈ”λ‘œκ·Έ μ„œλΉ„μŠ€ λ“±μ—μ„œ html markup ν˜•νƒœοΏ½οΏ½οΏ½ 데이터λ₯Ό μ €μž₯ν•˜μ—¬ λ§Žμ€ 고민을 ν–ˆμ§€λ§Œ, json ν˜•μ‹μ— μž₯점이 더 λ§Žλ‹€κ³  μƒκ°ν•˜μ—¬ json ν˜•μ‹μœΌλ‘œ μ €μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    html markup ν˜•μ‹

    <section name="0ed1" class="section section--body section--first">
       <div class="section-divider">
          <hr class="section-divider">
       </div>
       <div class="section-content">
          <div class="section-inner sectionLayout--insetColumn">
             <h3 name="f8e8" class="graf graf--h3 graf--leading graf--title">
                <br>
             </h3>
             <p name="83d3" class="graf graf--p graf-after--h3">
                So what do we have?
             </p>
          </div>
       </div>
    </section>
    <section name="d1d2" class="section section--body">
      ...
    </section>

    minimo의 json ν˜•μ‹

    {
        "_id": "60a8ac7ec767550586e16766",
        "address" : "freeboard",
        "concept": "basic",
        "blocks" : [
            {
                "type" : "paragraph",
                "data" : {
                    "contents" : {
                        "texts": "<p>this is free<p>"
                    },
                    "styles": {
                        "color": "black"
                    }
                }
            },
            {
                "type" : "title",
                "data" : {
                    "contents" : {
                        "texts": "give away alert"
                    },
                    "styles": {
                        "color": "red"
                    }
                }
            },
            {
                "type" : "image",
                "data" : {
                   "contents" : {
                        "src": "https://minimo.s3.amazonaws.com/project-image/any.png"
                    }
                }
            }
        ],
       "createdAt": "2021-05-22T07:02:22.401Z"
    }

    μœ„μ™€κ°™μ€ json ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ ν•¨μœΌλ‘œμ¨, ν˜„μž¬ μ‚¬μš©ν•˜λŠ” minimo μ›Ή 뿐만 μ•„λ‹ˆλΌ, native, desktop app, μ˜€λ””μ˜€ 리더, 챗봇 λ“±μ—κ²Œλ„ μ‰½κ²Œ μ μš©ν•  수 μžˆμ„κ±°λΌ μƒκ°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

    λ˜ν•œ λ°±μ—”λ“œμ—μ„œμ˜ validation도 더 μš©μ΄ν•˜κ³ , νŠΉμ • λΆ€λΆ„μ˜ λ°μ΄ν„°λ§Œ μΆ”μΆœν•˜λŠ” 데에도 μˆ˜μ›”ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ“– ν”„λ‘œμ νŠΈ μ‚¬μš© 방법

  1. 디렉토리 이동

    // client
    
    cd minimo-client
    
    // server
    
    cd minimo-server
    
  2. package.json에 μ •μ˜λœ νŒ¨ν‚€μ§€ μ„€μΉ˜

    npm install
    
  3. Firebase Realtime Database μ‚¬μš©μ— ν•„μš”ν•œ dotenv μ„€μ •

    디렉토리 μ΅œμƒλ‹¨μ— .env.example을 .env둜 λ³€κ²½ ν›„ μ•„λž˜μ˜ 값듀을 λ³€κ²½

    // client
    
    REACT_APP_API_KEY=[FIREBASE_CONFIG_API_KEY]
    REACT_APP_AUTH_DOMAIN=[FIREBASE_CONFIG_AUTH_DOMAIN]
    
    REACT_APP_SERVER_URL=[SERVER_URL]
    
    REACT_APP_AWS_ACCESS_KEY=[AWS_S3_ACCESS_KE]
    REACT_APP_AWS_SECRET_KEY=[AWS_S3_SECRET_KEY]
    
    REACT_APP_GOOGLE_API_KEY=[GOOGLE_API_KEY]
    
    // server
    
    PORT=[PORT_NUMBER]
    MONGO_URL=[MONGO_DB_URL]
    

  1. μ‹€ν–‰
    // client
    
    npm start
    
    // server
    
    npm run dev
    

πŸ§‘β€πŸ’» ν”„λ‘œμ νŠΈλ₯Ό 마치며

  • ν”„λ‘œμ νŠΈλ₯Ό 끝내고 슀슀둜 μž˜ν–ˆλ‹€κ³  μƒκ°ν•œ 점은 핡심 κΈ°λŠ₯ κ΄€λ ¨ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 것 μž…λ‹ˆλ‹€.

    이전 ν”„λ‘œμ νŠΈμ—μ„œ 'react-three-fiber'λΌλŠ” 라이브러리λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, λ‚΄λΆ€μ—μ„œ λŒμ•„κ°€λŠ” three.js, canvas, webGL을 잘 λͺ¨λ₯Έ 채 μ‚¬μš©ν•˜μ—¬ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κΈ° μ–΄λ €μ› κ³  μ›ν•˜λŠ” λŒ€λ‘œ κ΅¬ν˜„ν•˜μ§€ λͺ»ν•œ 뢀뢄도 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

    λ”°λΌμ„œ μ΄λ²ˆμ—λŠ” 핡심 κΈ°λŠ₯ κ΄€λ ¨ 라이브러리λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  κΈ°λ³Έ web apiλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ € ν–ˆμŠ΅λ‹ˆλ‹€. 덕뢄에 μ–΄λ €μš΄ 상황을 λ§Œλ‚¬μ„ λ•Œ, MDNκ³Ό stackoverflow 등을 톡해 κΈ°λ³Έ api의 νŠΉμ„±μ„ ν•™μŠ΅ν•˜λ©° 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 이후에 κ΄€λ ¨ 라이브러리 μ‚¬μš© μ‹œμ—λ„ 더 깊게 μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•  수 μžˆμ„ 거라 κΈ°λŒ€ν•©λ‹ˆλ‹€.

  • λ˜ν•œ νšŒμ‚¬μ—μ„œ λ””μžμ΄λ„ˆλ‹˜κ³Ό μž‘μ—…μ„ ν•œλ‹€κ³  κ°€μ •ν•˜κ³ , 기술적 편의λ₯Ό μœ„ν•΄ 초기 wireframe의 λ””μžμΈμ„ λ°”κΎΈμ§€ μ•ŠκΈ°λ‘œ λ§ˆμŒλ¨Ήμ—ˆλŠ”λ°, 이λ₯Ό 잘 μ§€μΌœμ„œ 초기 λ””μžμΈκ³Ό 같은 결과물을 λ§Œλ“  점도 잘 ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

  • ν‰μ†Œ 생산성이 높은 웹앱에 관심이 λ§Žμ•˜λŠ”λ°, 직접 λ§Œλ“€μ–΄ λ³Ό 수 μžˆμ–΄μ„œ λ„ˆλ¬΄ μž¬λ°Œμ—ˆμŠ΅λ‹ˆλ‹€. 좔후에 parallax scroll μ• λ‹ˆλ©”μ΄μ…˜, μ„ λ¬Όλ¦¬μŠ€νŠΈ λ“± 재밌고 μΈν„°λ ‰ν‹°λΈŒν•œ μš”μ†Œλ“€μ„ ν¬ν•¨ν•œ 블락듀을 더 μΆ”κ°€ν•  μ˜ˆμ •μΈλ° λ„ˆλ¬΄ μž¬λ°Œμ„ 것 κ°™λ„€μš”. πŸ˜„

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published