Photo Layout Editor
μν°ν΄ μ 보
- λ₯μ§
- Tool & Service
- λΆλ₯
- Extra
- λ±λ‘μΌ
- 2019-06-23 16:38:50
- date: 2016. 05
- language: javascript, html, css
- tool: PHPStorm, Photoshop, Sketch 3, Illustrator
- demo: https://redgoose-dev.github.io/react-photo-layout-editor/
- GitHub: https://github.com/redgoose-dev/photo-layout-editor
μ¬μ§ λ μ΄μμμ νΈμ§νλ λꡬλ₯Ό λΈλΌμ°μ μμ ꡬλλλ νλ‘κ·Έλ¨μ λ§λ€κ² λμλ€.
μ΄κ²μ λ§λ€κ² λ κ³κΈ°λ Instagram blogμμ μ¬μ§μ΄ λ€μν ν¨ν΄μΌλ‘ μλ¦λ΅κ² λ°°μΉλμ΄ μλ λͺ¨μ΅μμ κ°λͺ μ λ°μλλ° μ¬μ§ λ μ΄μμμ νΈμ§νκ³ κΈ λ³Έλ¬Έμ μ½μ ν μ μλ€λ©΄ μ’κ² λ€λ μκ°μ λ―Έμ³ μ΄λ κ² λ§λ€κ² λμλ€.
μ΄κ²μ΄ λ§λ€μ΄μ§κ±°λΌκ³ λ μκ°λ λͺ»νλ€. 무μλ³΄λ€ λΈλμ μ΄λνλ건 λμ§ΈμΉκ³ λΈλμ μ΄λν μ리μ κΈ°μ‘΄ λΈλμ λ€λ₯Έ μμΉμ λ°λ¦¬λ μκ³ λ¦¬μ¦μ ꡬνν΄μΌνλλ° μκ³ λ¦¬μ¦ μ체λ₯Ό ꡬννλ건 μ§κΈ λλ‘μ¨λ λΆκ°λ₯νκ³ , μ΄λ° κΈ°λ₯μ΄ κ΅¬νλ μ λΉν μ€ν¬λ¦½νΈ νλ¬κ·ΈμΈμ μ°Ύμ보λλΌ μμ μ μμνμ§λ μμλ€.
Plan
μμ μ μμνμκ³ κ²°μ¬νκ³ μκ°μ΄ μ’ νλ¬ λΈλ λ°°μΉλ₯Ό νΈμ§ν μ μλ jQuery νλ¬κ·ΈμΈμ λ°κ²¬νκ² λμλ€. gridster.jsμ΄λΌλ κ²μΈλ° μ΄μ λλ§ν μ€ν¬λ¦½νΈ νλ¬κ·ΈμΈμ λμ΄μ μμ΄μ μ΄κ±Έ λ°κ²¬νκ³ λμ λ°λ‘ μμ μ λμ νκ² λμλ€.
κΈ°λ³Έμ μΌλ‘ μ΄λ€ κΈ°λ₯μ λ£μ건μ§λ λμΆ© λ¨Έλ¦Ώμμ λ€μ΄μμλ€.
λΈλ μμ±μ νΈμ§ν μ μλ μμ±νΌκ³Ό, λ μ΄μμμ νΈμ§νλ 컨ν
μ΄λ, μ΄λ―Έμ§λ₯Ό μ
λ‘λνκ³ μ
λ‘λν μ΄λ―Έμ§λ₯Ό λͺ¨μλλ μμ, μ νν μ΄λ―Έμ§λ₯Ό ν¬λ‘ννμ¬ μ¬μ΄μ¦λ₯Ό λ°κΎΈκ±°λ μ΄λ―Έμ§ μμΉλ₯Ό λ³νν μ μλ κΈ°λ₯λ€μ νλ©΄μ μ§μ΄λ£μΌλ €κ³ νλ€.
κ·Έλμ λ€μ κ·Έλ¦Όκ³Ό κ°μ΄ λ¨Όμ μμ΄μ΄νλ μμ κ·Έλ €λ΄€λ€.
μμ΄μ΄ νλ μμ μ΄λ κ² κ·Έλ Έλ€κ³ λμμΈμ΄ λκ°μ΄ λ§λ€μ΄μ§μ§λ μμλ€. μ€μ λ‘ μ¬μ©ν΄λ³΄λ©΄ λΆνΈν UIλ‘ κ΅¬μ±λκ³€ νλ©΄ μ‘°κΈμ© λμμΈμ κ³ μΉ μκ°μ΄μλ€.
μ΄ κ³Όμ μ μ§ννλ©΄μ μ€ν¬λ¦½νΈλ₯Ό μ΄λ»κ² μμ±ν κ²μΈμ§μ λν΄μ κ³ λ―ΌνκΈ° μμνλ€.
μ΄ μμ
μμ λλΆλΆμ λΉμ€μ μ°¨μ§νλ λΆλΆμ javascriptμΈλ° λ¨μν jQueryλ§μΌλ‘ μμ±νλ©΄ ꡬ쑰μ μΌλ‘ λ§λ€κΈ°λ μ λ§λ‘ νλ€κ³ DOM μ
λ°μ΄νΈμ λ€μ΄κ°λ λΉμ©μ΄ λ§μ΄ λ€μ΄κ°λκ±Έ μ μκ³ μμ΄μ μ’λ νΈν λ°©μμ μκ°νκ³ μμλ€.
λ§μΉ¨ reactλΌλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ΄λ°μ λ°κ²λ€μ λ§λ€κΈ° μμνλ λλΌμ μ°μ΅ν΄λ³ΌκΉ νλ μκ°μΌλ‘ reactλ₯Ό μ¬μ©νμ¬ μμ
μ νκΈ°λ‘ κ²°μ¬νλ€.
μ°μ λμμΈκ³Ό κΈ°μ μ μΈ λΆλΆμ κ³ λ―Όνκ³ μ 리νμ¬ Trello μλΉμ€λ₯Ό μ΄μ©νμ¬ λμ κ³Όμ μ΄λ λ§λ€ μ»΄ν¬λνΈ, κΈ°λ₯λͺ
μΈμ, ν΄μΌν μΌλ€μ κΈ°λ‘ν΄λμλ€.
λμμΈ μμ
μΊ‘μ³νλ©΄μ΄λ μμ΄μ΄νλ μ μΊ‘μ³νλ©΄, μ°Έκ³ ν μ¬μ΄νΈλ κ΄λ ¨ μμ€κ° μλ μ¬μ΄νΈ urlλ€μ μΆκ°λ‘ κΈ°λ‘ν΄λμλ€.
무μλ³΄λ€ λ΄κ° ν΄μΌν μΌμ΄λ μμ
ν΄μΌν λΆλΆλ€μ κΈ°λ‘ν΄λλ©΄ μμ§μκ³ ν μ μμ΄μ Trelloλ λλ¨ν κ³ λ§μνλ μλΉμ€λ€.
Design
μ΄λ€κ²λ€μ κ΅¬μ± ν μ§μ λν΄μ κ²°μ νκ³ λμ λμμΈ μμ
μ μμνκ² λμλ€.
μ²μμλ PhotoshopμΌλ‘ μμ
μ μμνλ€. κ·Έμ λ²λ¦μ²λΌ λμμΈμμ
μ μμνκΈ°λ§ νλ©΄ ν¬ν μ΅λΆν° μΌλ²λ¦°λ€. ν¬ν μ΅μΌλ‘ μ΄λμ λ μμ
μ νλ€κ° Sketch 3λΌλ λμμΈ νλ‘κ·Έλ¨μ μκ² λμ΄μ νλ‘κ·Έλ¨μ λ°κΏμ μλ‘ μμ
νκΈ° μμνλ€.
μμ΄μ΄ νλ μμ 그릴λλ μ½κ² λΈλμ νΈμ§νλ λ²μ λν΄μ ꡬ체μ μΈ κ³νμ΄ μμλλ° μ€μ λ‘ λμμΈμ ν΄λ³΄λ ν΄λ°λ₯Ό λ§λ€μλ μκ°μ λ―ΈμΉκ² λμλ€.
κ·Έλμ λΈλμ νΈμ§νλ μμμμ κΈ°λ₯μ μ€ννλ ν΄λ° λ²νΌλ€μ λ°°μΉνλ€.
μ€λ₯Έμͺ½μ μ΄λ―Έμ§λ₯Ό μ
λ‘λνκ³ μΈλ€μΌ μ΄λ―Έμ§λ€μ΄ λμ€λ ν¨λμ λ£μλ€.
μ΄ ν¨λμ λ«μλ€κ° μ΄λ¦¬λ μ΄λ²€νΈκ° μκ³ , μ΄λ―Έμ§ μμ κ·Έκ²μ 컨νΈλ‘€νλ λ²νΌλ€μ λ°°μΉνλ€.
λ³Έ νλ©΄μ μ΄λ κ² μΈκ°μ§ ννμ μμμ λκ³ , νμ
μΌλ‘ μ νν μ΄λ―Έμ§λ₯Ό ν¬λ‘ννλ κΈ°λ₯μ λ§λ€κΈ° μνμ¬ λμμΈμ νλ€.
λ€μ λ§λ€κΈ΄ νμ§λ§ Sketch 3 λΌλ νλ‘κ·Έλ¨μ λ§μ΄ λμλ°μ κΈ°λΆμ΄ λ λ€.
Development Environment
λμμΈ μμ
μ λλ΄κ³ λμ κ°λ°μ μν μΈν
μ λ§μ λ
Έλ ₯κ³Ό μκ°μ λ€μλ€.
scssμ reactκ°μκ²λ€μ κ·Έλλ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ λΉλμμ
μ ν΅νμ¬ μ¬μ©ν μ μλ μμ€λ‘ λ³νμ ν΄μ€μΌνλ€. νΈνκ² λΉλν μ μλ νκ²½μ λ§λ€μ΄ λλ©΄ λΉ λ₯΄κ³ , κ°λ°μ μ§μ€ν μ μμ΄μ§λ€.
scss to cssλ‘ λΉλλ gulp-sass λͺ¨λμ μ¬μ©νμ¬ μ½κ² λΉλ μ€ν¬λ¦½νΈλ₯Ό μμ±νλ€.
νμ§λ§ javascriptμͺ½μ λλ¨ν 볡μ‘νλ€. node.jsκ° λ±μ₯νκ³ λμ javascriptμ λν λ§μ κ°λ
λ€μ΄ μ겨λ¬λλ° μ΄κ²λ€μ΄ μΉλΈλΌμ°μ μμ λμνμ§ μλκ²λ€μ΄μ΄μ gulp, browserify λͺ¨λμ μ΄μ©νμ¬ λΉλλ₯Ό νλ €νλλ° μΈν
νλ λμ΄λκ° μ½μ§ μμλ€.
μ¬μ°¨μ¬μ°¨ javascript λΉλνκ²½μ λ§λ€κ³ λμ κ°λ°μ λ€μ΄κ°λ€. μ΄λμ λ κ°λ°νκ³ λ νμ browserify λͺ¨λμ μ΄μ©ν λΉλνκ²½μ λ§λλκ² λ무 νλ€κΈ°λνκ³ μλμ΄ μ© μ’μ§λ μμλ€λκ²μ κΉ¨λ¬μλ€.
그리νμ¬ λΉμμ μΈκΈ°κ° λ§μ webpackμ΄λΌλ λͺ¨λ λ²λ€λ¬ λΌλκ±Έ μ΄μ©νμ¬ λΉλνκ²½μ λ°κΏ¨λ€.
μκ·Έλλ κ°λ°νκ³ μλ μμ€μ½λλ₯Ό ν μμ΄λ²λ¦¬λ μκΈ°λ μμκ³ ν΄μ λλ¦λλ‘ μνμ°©λ‘λ₯Ό κ²ͺκ³ μλλμ javascript λΉλνκ²½μ webpack λ² μ΄μ€λ‘ νμ μ§μλ€.webpack λͺ¨λλ²λ€λ¬λ νμ€ν λ€λ₯Έ λͺ¨λμ λΉν΄μ μ€μ νκΈ°κ° μ¬ννκ³ νΈλ¦¬νλ€.
μ΅μ’
μ μΌλ‘ gulpλ₯Ό λΉλμ€νμ λ΄λΉνκ³ cssλ gulp-sass, javascriptλ webpack-stream λͺ¨λμ μ¬μ©νκ³ , reactμ ea2015 μ½λλ₯Ό λΉλνλ λͺ¨λ ν리μ
μ babelμμμ babel-preset-es2015, babel-preset-reactλ₯Ό μ¬μ©νλ€.
Development
ν΄λ§€λ©΄μ κ°λ°νκ²½μ ꡬμΆνκ³ λ°λ‘ νΌλΈλ¦¬μ±κ³Ό κ°λ°μ λ€μ΄κ°λ€.
λ¨Όμ κΈ°μ΄μ μΈ ννλ₯Ό html λ§ν¬μ
μ νκ³ , cssλ₯Ό μμ±νλ€. μλ¬΄λ° μ΄λ²€νΈλ₯Ό κ³ λ €νμ§μκ³ μμνκ² λμμΈλλ‘ νΌλΈλ¦¬μ± μμ
μ λ§μ³€λ€.
λλ΅μ μΈ νΌλΈλ¦¬μ± μμ
μ λ§μΉκ³ λμ javascriptμμ
μ λμ
νλ©΄μ reactλ₯Ό μλκΈ° μμνλ€.
reactκ° μ»΄ν¬λνΈμμ domμ΄ λ€μ΄κ°κΈ° λλ¬Έμ νΌλΈλ¦¬μ±μ΄ μ¬μ€ κ°λ°μ΄λ λ§μ°¬κ°μ§λ€.
κ°μ’
μ΄λ²€νΈμ μν΄ λ³νλλ νλ©΄λ cssλ‘ μ²λ¦¬νλκ²μ΄ ν¨μ¬ ν¨μ¨μ μ΄μ΄μ(css3 transformμ λμ νΌν¬λ¨Όμ€λ₯Ό κ°μ§ μ λλ©μ΄μ
μ ꡬνν μ μλ€.) μ€ν¬λ¦½νΈ κ°λ°μ νλ©΄μ cssμμ±λ κ°μ΄ ν νΈμ΄μλ€.
μ²μ μμ
ν λμλ μ΅κ³ μ λΆλͺ¨ μ»΄ν¬λνΈλ₯Ό νκ°λ‘ ꡬμ±μ νλ€.
κ·Έ μμμ κ°κ°μ κΈ°λ₯μ λ§λ μ»΄ν¬λνΈλ€μ λ£μ΄λκ³ κ·Έ νμ μ»΄ν¬λνΈ μ μμ μ΄μ΄λκ°λ€.
λ¨μν ννμ¬λ λ§λ€λ€λ³΄λ λλ¨ν λ§μ μ»΄ν¬λνΈκ° λ§λ€μ΄μ§κ² λμλλ° μ΄κ²λ€μ μλ‘ ν΅μ νλλ²μ λν΄ λ§μ μ΄λ €μμ λλΌκ² λμλ€.
fluxλ₯Ό μ¬μ©ν΄λ³ΌκΉ μΆμμ§λ§ μμ§ κ°λ
μ΄ μ΄ν΄κ° μκ°λ μνκ³ , λ§μ΄ μ§μ²λ μνλΌμ μ μ©νκΈ°κ° λ¬΄λ¦¬κ° μμλ€.
μΌλ¨ ν° μμμ λλμ΄ κ°μ₯ ν° λΆλͺ¨ μ»΄ν¬λνΈλ₯Ό μ¬λ¬κ°λ‘ λλκ³ , λΆλͺ¨ μ»΄ν¬λνΈ κ°μ²΄λ€μ ν κ°μ²΄μ λ΄μ κ΄λ¦¬νλ κ΅¬μ‘°λ‘ λ°κΎΈμ΄μ μλ‘ λ©λ¦¬μλ μ»΄ν¬λνΈλ₯Ό ν΅μ ν μ μλλ‘ κ°μ νλ€.
μ¬μ΄λλ°λΌλ μ΄λ¦μ μ»΄ν¬λνΈλ μ¬μ§μ μ λ‘λνκ³ μ λ‘λν μ¬μ§μ λ΄μλλ μν μ νλλ° λ‘컬μ μ¬μ§μ μ¬λ¦¬κ±°λ μλ² νλ‘κ·Έλ¨μ νΈμΆνμ¬ μ¬μ§μ μλ²μ μ¬λ¦΄ μ μλ ννλ‘ μ€ν¬λ¦½νΈλ₯Ό μμ±νλ€.
컨ν
μ΄λ μμμ ν΄λ° μ΄λ²€νΈκ° λ€μ΄κ°κ³ , λΈλμ νΈμ§ν μ μλ gridster jQuery νλ¬κ·ΈμΈμ΄ λ€μ΄κ°λ€.
κ°μ₯ ν° λ¬Έμ λ gridsterλ react μ»΄ν¬λνΈκ° μλλΌμ 컨νΈλ‘€νλμΌμ΄ μ¬κ° μ½μ§κ° μμλ€.
cropper μ»΄ν¬λνΈλ€λ κ·Έλμ λ λ§λ€μ΄λλ€.
result μ»΄ν¬λνΈκ° μ΄ μμ
μ ν λμ κ°μ₯ νμ΄λΌμ΄νΈμλ κ² κ°λ€.
λͺ¨λ λΈλκ³Ό μ΄λ―Έμ§λ€μ λ°μ΄ν°λ₯Ό λ°μ μ²λ¦¬νμ¬ JSONμΌλ‘ λ½μμ€κ±°λ μ΄λ―Έμ§ λ°μ΄ν°λ‘ λ½μμ€λ μν μ νλ μ»΄ν¬λνΈλ€.
νΉν μ΄λ―Έμ§ λ°μ΄ν°λ‘ λ³νν λ μκ°μ μΌλ‘ canvas νκ·Έλ₯Ό λ§λ€κ³ κ±°κΈ°μλ€ κ·Έλ¦¬κ³ base64 νμμ μ΄λ―Έμ§ λ°μ΄ν°λ‘ λ³ννμ¬ μ¬μ©νλλ‘ λ§λ€μλ€.
μ΄ μμ
μ νλ©΄μ drag&drop μ΄λ²€νΈλ₯Ό μ§μ λ§λ€μ΄λ³΄λ μ’μ κ²½νμ ν΄λ³΄κ² λμλ€. νλΈλ¦Ώ λλ°μ΄μ€μμ μ¬μ© κ°λ₯νλλ‘ νκΈ° μνμ¬ ν μ΄λ²€νΈλ μλ³΄κ³ νλ€λ³΄λ μμ
μμ΄ λ§μμ§κ³ , κ·Έλ§νΌ μμ
μκ°λ κΈΈμ΄μ§κ² λμλ€.
κΈ°λ³Έμ μΈ κΈ°λ₯μ λν μμ μ΄ λλκ³ λμ보λ μ»΄ν¬λνΈλ λ©μλλ€μ μ κ·Όν μ μλ λ°©λ²λ€μ΄ μ κ°κ°μ΄μ΄μ apiλΌλ κ°μ²΄λ₯Ό λ§λ€κ³ , λ©μλλ₯Ό μ κ·Όνλ©΄ μ½κ² κΈ°λ₯μ μ¬μ©ν μ μλλ‘ λ§λ€μ΄ 보μλ€. μ¬κΈ°μμ λ¬Έμμμ μ ν λ λ§μ΄ νΈν΄μ‘λ€.
End
μΈλΆ κ°λ°μκ° μ΄ νλ‘κ·Έλ¨μ νμ©νκ±°λ κΈ°λ₯μ μμ ν μ μλλ‘ λ§μ κ³ λ―Όμ νλλ° μ΄κ² μ΅μ μΈμ§λ λͺ¨λ₯΄κ² λ€.
무μλ³΄λ€ APIκ°μ²΄λ₯Ό λ§λ€μ΄λ λλΆμ λ€λ₯Έμ¬λμ΄ μ»¨νΈλ‘€μ ν μ μλλ‘ λ¬Έμλ₯Ό λ§λλλ° λ§μ λμμ΄ λμλ€.
μ΄ νλ‘κ·Έλ¨μ΄ νΌμμ μ§ννλ μ€νμμ€ νλ‘μ νΈλΌμ μΌμ μ΄ μλ€λ³΄λ μκ°μ΄ νλλλμμ΄ κ±Έλ¦¬κ² λμ΄μ κΈ°κ°μ΄ λͺλ¬μ΄λ κ±Έλ Έλ€.
μ€ μμ
μκ°μ ν¨μ¬ μ§§μ§λ§ μμ
μ μνλ λ λ λ§μκ³ , μλλ©΄ λͺμ€ μ κ³ λλΈμ λ μκΈ°λ νκ³ , νλ‘μ νΈλ₯Ό μμ΄λ²λ¦°λλ μλ€λ³΄λ κΈ°κ°μ΄ κΈΈμ΄μ§ μ λ°μ μμλ€.
μ무리 μ§ν μκ°μ΄ κΈΈμ΄μ§λλΌλ μ΄λ κ² μμ±νκ³ λλ 보λμ΄ μκ²Όλ€.
μ΄κ±Έ μ΄μ©νμ¬ λ€λ₯Έμ¬λλ€μ΄ λ©μ§ 컨ν μΈ λ₯Ό λ§λ€μμΌλ©΄ νλ λ°λ¨λ μκΈ΄λ€.