Skip to content

minimo-editor/minimo-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

384 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, ์‹ค์‹œ๊ฐ„ ์ธํ„ฐ๋ ‰์…˜ ๋“ฑ์„ ํฌํ•จํ•œ ์žฌ๋ฐŒ๋Š” ์š”์†Œ๋“ค์„ ๋ธ”๋ก๋‹จ์œ„๋กœ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ 2์ฃผ์˜ ์งง์€ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋•Œ๋ฌธ์—, ์ด๋ฒˆ 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 ์ด์•ผ๊ธฐ

1. CONTEXT API + useReducer VS Redux

  • ์ดˆ๊ธฐ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ๋Š” ๋‹จ์ˆœํžˆ prop-drilling์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์ •๋„์˜€๊ธฐ ๋•Œ๋ฌธ์— Context API๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌํ˜„์„ ํ•˜๋ฉด์„œ Editor(project)์˜ ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์ด ์ปค์ ธ์„œ Redux๋ฅผ ์‚ฌ์šฉํ• ์ง€ Context API + useReducer๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ์ œ ํ”„๋กœ์ ํŠธ๋Š” Redux๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋„ ํ•„์š”๊ฐ€ ์—†์—ˆ๊ณ , ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋นˆ๋ฒˆํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด Redux๋ฅผ ๋ฐ›์•„ ๋ฒˆ๋“ค๋ง ์‚ฌ์ด์ฆˆ๋ฅผ ๏ฟฝ๏ฟฝ๏ฟฝ์šฐ๊ธฐ ๋ณด๋‹จ Context API + useReducer๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2. AnimateBlocks

  • ์ดˆ๊ธฐ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ๋Š” ์•„๋ž˜์˜ '๊ธฐ์กด ์ฝ”๋“œ ๋ฐ๋ชจ'์ฒ˜๋Ÿผ ๋ธ”๋ก๋“ค์„ ์ด๋™ ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ๋งŒ๋“ค์–ด๋ณด๋‹ˆ ์ด๋Š” ๋ณด๊ธฐ์— ์–ด์ƒ‰ํ–ˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ์ข‹๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋ฏธ ๊ฐœ๋ฐœ ๋งˆ๋ฌด๋ฆฌ ๋‹จ๊ณ„์˜€๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์— ์™„์„ฑ๋œ ์—๋””ํ„ฐ ๋ฐ ๋ธ”๋ก ๋กœ์ง์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์‹ถ์—ˆ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ด€๋ จ ๋กœ์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

    ๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ AnimateBlock ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์ฒ˜๋Ÿผ, AnimateBlock์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ children์œผ๋กœ ๋ธ”๋ก๋“ค์„ ๋ฐ›์•„ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ƒ๊ธฐ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. AnimateBlock์€ children์˜ unique key๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ณ€ํ™”๋œ ์—˜๋ฆฌ๋จผํŠธ๋งŒ ์ฐพ์•„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉ์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ฉด์„œ ์ฒ˜์Œ์œผ๋กœ useLayoutEffect, React.Children ๋“ฑ์„ ์ด์šฉํ•˜์˜€๋Š”๋ฐ, ๊ทธ๋™์•ˆ ๋ฆฌ์•กํŠธ๋ฅผ ๋งŽ์ด ๊ณต๋ถ€ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ๊ณ , ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ž์ฃผ ๋ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ ๋˜ํ•œ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ์กด ์ฝ”๋“œ ๋ฐ๋ชจ
noAnimateImg withoutAnimate
AnimateBlock ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ AnimateBlock ์ถ”๊ฐ€ ํ›„ ๋ฐ๋ชจ
withBlockImg withBlock

3. DRAG AND DROP

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๋ฆฌ์•กํŠธ์—์„œ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธ€๋“ค์„ ์ฐพ์•„๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ draggableํ•˜๊ฒŒ ํ•˜๊ณ  ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. draggable์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— text๊ฐ€ ์žˆ์œผ๋ฉด, ๊ฐ„ํ—์ ์œผ๋กœ ๊ทธ text๊ฐ€ ๋“œ๋ž˜๊ทธ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์œ ์ €๊ฐ€ ์ž˜๋ชปํ•ด์„œ text๋ฅผ ๋“œ๋ž˜๊ทธ ๋“œ๋กญํ•˜๋ฉด text๋Š” data-transfer์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์•„ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ์—๋Ÿฌ๋Š” ํ•ธ๋“ค๋ง์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ css๋ฅผ ํ†ตํ•ด text์š”์†Œ์— ๋“œ๋ž˜๊ทธ๊ฐ€ ์•ˆ๋˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋“œ๋ž˜๊ทธ ํ•  ๋Œ€์ƒ์ด text ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์š”์†Œ๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ , ์ถ”ํ›„์— ๋ธ”๋ก๋“ค์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์‹ ๊ฒฝ์“ธ ๊ฒŒ ๋งŽ์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋Š” ๋ธ”๋ก๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์ด๋ฏธ์ง€๋ฅผ draggableํ•˜๊ฒŒ ํ•ด์„œ ํ•ด๊ฒฐํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ์š”์†Œ๋“ค์„ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์œผ๋ฉฐ, ๋ธ”๋ก ์ถ”๊ฐ€๋„ ์šฉ์ดํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋“œ๋ž˜๊ทธ ํ•  ๋ธ”๋ก๋“ค์€ ์‚ฌ์‹ค ๋ณด์—ฌ์ฃผ๋Š” ์šฉ๋„์ผ ๋ฟ, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ๋ชฉ์ ์—๋„ ๋” ๋งž๋Š” ๊ตฌํ˜„์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผํ†ตํ•ด ๊ผญ ์ฝ”๋”ฉ์œผ๋กœ๋งŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ํŒŒ์•…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ๊ทธ์— ๋งž๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๊ฒฐ๊ตญ ๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


โ›‘ 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

Languages