react-konva-image-editor
Version:
๐ผ HTML5 Canvas API Image Editor based on React.js & Konva.js
226 lines (145 loc) โข 12.7 kB
Markdown
# react-konva-image-editor
<p align="center">
<img src="images/logo.png" width="300" />
</p>
## Subject
> - (๊ตญ๋ฌธ) HTML5 Canvas ๊ธฐ๋ฐ ์คํ์์ค ์ด๋ฏธ์ง ์๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ
> - (์๋ฌธ) Opensource Image Editor Library Development based on HTML5 Canvas
- ๋ณธ ํ๋ก์ ํธ๋ 2021-2ํ๊ธฐ ๊ฒฝํฌ๋ํ๊ต ์บก์คํค ๋์์ธ 1 - ์ฐ์
์ฒด ์ฃผ์ (๋ชจ๋ฐ์ผ ์ฑ๊ฐ๋ฐ ํ๋์กฐํฉ)๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ๋ฐํ์ต๋๋ค.
## Members
- ์ ์ข
์ค(@wormwlrm)
## Abstract
> HTML5๋ถํฐ ๋ฑ์ฅํ Canvas API๋ฅผ ์ด์ฉํ๋ฉด ์น์์๋ ์ด๋ฏธ์ง ํธ์ง์ ๋น๋กฏํ ๋ค์ํ ๊ทธ๋ํฝ ๊ธฐ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
> ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ API์ ์ถ์ํ ๋จ๊ณ๊ฐ ๋ฎ๊ณ , ๊ทธ๋ํฝ ๋๋ฉ์ธ์ ๋ํ ์ง์์ ๋ณ ๋๋ก ํ์ตํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
> ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ Canvas API๋ฅผ ์ง์ ํ์ฉํ๊ธฐ๋ณด๋ค๋ ์์ฑ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
>
> ๋ณธ ๋
ผ๋ฌธ์์๋ ์ด๋ฏธ์ง ํธ์ง์ ์ด์ ์ ๋ง์ถ์ด, 2D ๊ทธ๋ํฝ ๊ธฐ๋ฐ์ Canvas API๋ฅผ ํ์ฉํ ์คํ์์ค ์ด๋ฏธ์ง ์๋ํฐ๋ฅผ ๊ตฌํํ๋ค.
> ์ด๋ฏธ์ง ์๋ํฐ์์ ์ ๊ณตํ๋ ๋ค์ํ ํธ์ง ๊ธฐ๋ฅ๋ค์ ์ด๋ ํ Canvas API์ ๋์์ธ ํจํด์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ์ง๋ฅผ ์ฐ๊ตฌํ๊ณ , ์ด ๊ณผ์ ์์ ๋ง์ฃผ์น๋ ํ๊ณ์ ๋ค์ ๊ทน๋ณตํ๋ ๋ฐฉ์์ ๋ํด ์์๋ณธ๋ค.
## Overview
<p align="center">
<img src="images/demo.gif" />
</p>
> ๋ณ๋ ์ ์ํ [๋ฐ๋ชจ ํ์ด์ง](https://wormwlrm.github.io/react-konva-image-editor-demo)์์ ๋์ํ๋ ์์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ณธ ํ๋ก์ ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ๊ธฐ๋ฅ์ ๋ํ ์์ธํ ์ค๋ช
์ ์๋์์ ํ์ธํ ์ ์์ต๋๋ค.
- [x] ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ํจํค์ง ๋ฆด๋ฆฌ์ค
- [x] ํธ์คํธ ์ต์
์ ๊ณต
- [x] ์ด๋ฏธ์ง/๋ํ ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ํธ์ง
- [x] ์์ ๊ฐ๋ฅํ ํ
์คํธ ์ปดํฌ๋ํธ ์ ๊ณต
- [x] ์ปดํฌ๋ํธ ๋ณต์ /์ญ์
- [x] ์คํ ์ทจ์/๋ค์ ์คํ
- [x] ๋๋ก์
- [x] ์ด๋ฏธ์ง ์ ์ฅ
- [x] ์บ๋ฒ์ค ํ๋ ๋ฐ ์ถ์
- [x] Z-index ์กฐ์
- [x] ์ด๋ฏธ์ง ์ ์ฅ
- [x] ์ง๋ ฌํ๋ฅผ ์ด์ฉํ ์์ ๋ด์ญ ์ ์ฅ ๋ฐ ๋ณต์ ๊ธฐ๋ฅ
### Motivation
์ง์ ์ ์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ๊ฐ๋ฐํ์ต๋๋ค.
### Concept
- ์ถ์ํ
- ์ํ๊ด๋ฆฌ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ
### Architecture
๋ณธ ํ๋ก์ ํธ์ ์ํคํ
์ฒ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

- **Shapes Layer**: ์บ๋ฒ์ค์ ๊ทธ๋ ค์ง๋ ๋ชจ๋ ๋ํ, ์ฌ์ฉ์ ์ํ ๋ฑ์ ๊ด๋ฆฌํฉ๋๋ค. ๋ํ ์บ๋ฒ์ค์ ํจ๋, ํด๋ฐ ์ฌ์ด์ ์ํธ์์ฉ์ ์ค์ฌํฉ๋๋ค.
- **Snapshot**: ํน์ ํ ์ฌ์ฉ์ ์ก์
(๋ํ ์์ฑ, ์ด๋, ์คํ์ผ ์์ ๋ฑ)์ด ๋ฐ์ํ์ฌ ํ์คํ ๋ฆฌ๋ฅผ ์ ์ฅํด์ผ ํ ๊ฒฝ์ฐ, ํ์ฌ ๋ํ์ ์ค๋
์ท์ผ๋ก ์ ์ฅํ๊ณ ํ์คํ ๋ฆฌ์ ์ถ๊ฐํฉ๋๋ค.
- **History Layer**: ์ ์ฅ๋ ์ค๋
์ท ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์คํ ์ทจ์ ๋ฐ ๋ค์ ์คํ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
- **Canvas Layer**: Shapes Layer์ ์ ์ฅ๋ ๋ํ๋ค์ ์ค์ 2D ๊ทธ๋ํฝ์ผ๋ก ํํํ๊ณ , ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๋ฐ์ ์ํธ์์ฉ์ Shapes Layer์ ๋๊ฒจ์ค๋๋ค.
- **Toolbar Layer**: ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ช
์์ ์ผ๋ก ์
๋ ฅ๋ฐ๋ ์์ญ์
๋๋ค.
- **Panel Layer**: ํ์ฌ ์ ํ๋ ๋ํ์ ์์ฑ์ ํ์ํ๋ ์์ญ์
๋๋ค.
### Features
๋ณธ ํ๋ก์ ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
#### ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ํจํค์ง ๋ฆด๋ฆฌ์ค
๋ฐ๋ชจ ํ๋ก์ ํธ ํ์ธ์ ์ํด ํ์ฌ๊น์ง์ ๊ฐ๋ฐ ์ฌํญ์ node.js ํจํค์ง ๋งค๋์ ์ธ [NPM](https://www.npmjs.com/package/react-konva-image-editor)์ ๋ฐฐํฌํ ์ํ์
๋๋ค. ๋ฐ๋ผ์ ํฐ๋ฏธ๋์์ ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ค์น๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
```bash
# for this package
$ npm install react-konva-image-editor
# for peer dependencies
$ npm install react react-dom
```
ํธ์คํธ ์ธก์์ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```js
// App.js
import { Editor } from 'react-konva-image-editor';
return (
<Editor />
);
```
#### ํธ์คํธ ์ต์
์ ๊ณต
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์ฌ ์ฌ์ฉํ๋ ํธ์คํธ์์ ์๋ํฐ ๋ ์ด์์์ ๋ํ ์ต์
๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
```js
const props = {
width = window.innerHeight, // Number, ๋ช
์์ ์ผ๋ก ๋๋น ์ค์
height = 500, // Number, ๋ช
์์ ์ผ๋ก ๋์ด ์ค์
responsive = false, // Boolean, ๋ฐ์ํ ์ค์
aspectRatio = 1, // Number, ๋ฐ์ํ ์ค์ ์ ๋๋น์ ๋์ด ๋น์จ ์ค์
}
return (
<Editor {...props} />
);
```
#### ์ด๋ฏธ์ง/๋ํ ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ํธ์ง
<!-- ์์ -->
์บ๋ฒ์ค์ ์ด๋ฏธ์ง์ ๋ํ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ฐ ๋ํ์ ๋๋๊ทธ ๊ฐ๋ฅํ๋ฉฐ(Draggable), ์์ฒด์ ์ผ๋ก ํ์ , ๋ฆฌ์ฌ์ด์ง์ด ๊ฐ๋ฅ(Transformable)ํฉ๋๋ค.
์ด๋ฏธ์ง ๋ฐ ๋ํ ์ธ์คํด์ค๋ Shape Layer์์ ๊ด๋ฆฌ๋๋ฉฐ, ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์์ฑ ์ ์๋ `components` ํด๋์ ์ ์๋์ด ์์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋์๋ ์ด๋ฏธ์ง ํ์ผ์ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ ์ฌ์ฉํฉ๋๋ค.
#### ์คํ ์ทจ์/๋ค์ ์คํ
<!-- ์์ -->
์คํ ์ทจ์์ ๋ค์ ์คํ ๊ธฐ๋ฅ์ ์ํด ๋ฉ๋ฉํ ํจํด์ ์ ์ฉํ์ต๋๋ค. ๋ฉ๋ฉํ ํจํด์ ํ์คํ ๋ฆฌ๋ฅผ ์ ์ฅํ๋ Caretaker ์ญํ , ๊ทธ๋ฆฌ๊ณ ํ์คํ ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค๋ฅผ ๋์์ฃผ๋ Originator ์ญํ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ฌ๊ธฐ์ Caretaker ์ญํ ์ ํ๋ ๊ฒ์ด History Layer์
๋๋ค. ๋ํ์ ๋ํ ์ฌ์ฉ์ ์ํธ์์ฉ(๋๋๊ทธ, ํ์ , ๋ฆฌ์ฌ์ด์ง ๋ฑ)์ด ๋ฐ์ํ ๋๋ง๋ค History Layer๋ ํ์ฌ Shapes Layer์ ์ธ์คํด์ค๋ฅผ ์ค๋
์ท์ ์์ฑํ๊ณ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํฉ๋๋ค.
History Layer์๋ ํน์ ์ค๋
์ท์ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค๊ฐ ์ ์๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์คํ ์ทจ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์๋ ์ธ๋ฑ์ค๋ฅผ 1๋งํผ ๊ฐ์์ํค๋ฉฐ, ๋ค์ ์คํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์๋ ์ธ๋ฑ์ค๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํต๋๋ค.
Shapes Layer๋ ํ์ฌ History Layer์์ ๊ฐ๋ฆฌํค๋ ์ค๋
์ท์ ๊ฐ์ ธ์ต๋๋ค. Canvas Layer๋ Shapes Layer์ ์ธ์คํด์ค ๋ฐฐ์ด์ ์ข
์์ ์ด๊ธฐ ๋๋ฌธ์, ์ ์ฅ๋ ์ธ์คํด์ค๋ฅผ ์บ๋ฒ์ค์ ํ์ํฉ๋๋ค.
#### ๋๋ก์
<!-- ์์ -->
๋๋ก์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋๊ทธ ์ค ๋๋กญ๊ณผ ๋์ผํ ์
๋ ฅ์ ๋ฐ์ง๋ง ๋ค๋ฅด๊ฒ ๋์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ํด๋ฐ์์ ๋๋ก์ ๋ชจ๋๋ฅผ ์ ํํ๊ฒ ๋๋ฉด, ์บ๋ฒ์ค์ ์๋ ๋ํ๋ค์ ๋ ์ด์ ๋๋๊ทธ ๊ฐ๋ฅํ์ง ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ํ ์์์ ๋๋ก์์ ์์ํ์ ๋, ๋ํ์ด ๋๋๊ทธ ๋๋ ํ์์ ๋ง๊ธฐ ์ํด์์
๋๋ค.
๋ง์ฐ์ค ์ปค์๋ฅผ ๋๋ฅด๋ฉด `onmousedown` ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ x, y ์ขํ๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ขํ๋ฅผ ์ด์ฐ์ ์ผ๋ก ๋ง๋ถ์ด๋ฉด์ ๋ผ์ธ ์ปดํฌ๋ํธ์ ๊ฒฝ๋ก๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋ผ์ธ ์ปดํฌ๋ํธ ์ญ์ ๋ํ ์ธ์คํด์ค๋ก ์ทจ๊ธ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋๋๊ทธ์ ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง ๋ง์ฐ์ค๋ฅผ ๋ผ๊ธฐ ์ ๊น์ง ๋ผ์ธ ์ปดํฌ๋ํธ๋ ์์ง ์์ฑ๋ ์ํ๊ฐ ์๋์ง๋ง, ํ์ฌ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ์บ๋ฒ์ค์ ํ์ํด์ฃผ์ด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ฐ์ค๋ฅผ ๋ผ๊ธฐ ์ ๊น์ง ์ขํ ๋ฐฐ์ด์ ์์๋ก ์ ์ฅํ๊ณ , ๋ง์ฐ์ค๋ฅผ ๋ ๋ ์ ์ฅ๋ ์ขํ ๋ฐฐ์ด์ ์ด์ฉํด Shape Layer์ ์ ๋ผ์ธ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค.
#### ์์ ๊ฐ๋ฅํ ํ
์คํธ ์ปดํฌ๋ํธ ์ ๊ณต
<!-- ์์ -->
HTML5 ์คํ์ ๋ฐ๋ฅด๋ฉด, ์บ๋ฒ์ค์์ ํ
์คํธ๋ฅผ ๋ ๋ํ ์๋ ์์ง๋ง ์บ๋ฒ์ค ๋ด์์ ์
๋ ฅ๊ฐ์ ์ง์ ์์ ํ ์ ์๋ ์ธํ(input) ํํ๋ก๋ ์ ๊ณต๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด Canvas API๋ฅผ ์ ์ ํ ์ฐํํ์ฌ์ผ ํฉ๋๋ค.
์์ ๊ฐ๋ฅํ ํ
์คํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ Canvas API์ ์ธ๋ถ DOM ์๋ฆฌ๋จผํธ ๊ฐ ์คํ์ผ ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ์ต๋๋ค.
์ฐ์ ์บ๋ฒ์ค์ ํ
์คํธ๋ฅผ ๋ํ๋ผ ์ ์๋ ํ
์คํธ ์ปดํฌ๋ํธ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ์ญ์ ๋ํ ์ธ์คํด์ค๋ก ์ทจ๊ธ๋๋ฏ๋ก ๋๋๊ทธ์ ๋ณํ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๋ง์ฝ ํ
์คํธ ์ปดํฌ๋ํธ์ ๋๋ธ ํด๋ฆญ์ด๋ <kbd>enter</kbd>ํค ๋ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์์น์ `<textarea>` ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๋ ์บ๋ฒ์ค์ ์ค, ํ
์คํธ ์ปดํฌ๋ํธ์ ํ์ , ์ค๋ฐ๊ฟ์ ๊ณ ๋ คํ์ฌ ์ด์ํจ์ด ์๋๋ก ์คํ์ผ์ ์ ์ ํ ์กฐ์ ํด์ค๋๋ค.
<kbd>enter</kbd>ํค ์
๋ ฅ ์ ๊ฐ์ ์ ์ฅํ๊ณ , <kbd>shift</kbd> + <kbd>enter</kbd>ํค๋ฅผ ๋๋ฅผ ๋ ์ค๋ฐ๊ฟ์ด ์ผ์ด๋์ผ ํฉ๋๋ค. ํฌ์ปค์ค๋ฅผ ์์์ ๋์๋ ์๋์ผ๋ก `<textarea>` ๊ฐ ์ญ์ ๋๋๋ก ํฉ๋๋ค.
#### ์บ๋ฒ์ค ํ๋ ๋ฐ ์ถ์
<!-- ์์ -->
์ค ๋ฐฐ์จ์ ์ง์ ํ๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๋ฅผ ์บ๋ฒ์ค ๋ ์ด์ด์ ์ ์ฉํฉ๋๋ค.
#### Z-index ์กฐ์
<!-- ์์ -->
๋ํ ๊ฐ z-index ์กฐ์ ์ Shape Layer์ ๋ํ ์ธ์คํด์ค ๋ฐฐ์ด์ ์์๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
#### ์ด๋ฏธ์ง ์ ์ฅ ๋ฐ ์ง๋ ฌํ ๊ธฐ๋ฐ ์ ์ฅ ๋ฐ ๋ณต์ ๊ธฐ๋ฅ
<!-- ์์ -->
์ด๋ฏธ์ง ์ ์ฅ ๊ธฐ๋ฅ์ ํ์ฌ ๋ ๋๋ ํ๋ฉด์ ์ด๋ฏธ์ง ํ์ผ๋ก ์ ์ฅํ ์ ์๋ Canvas API์ `toDataURL()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณตํฉ๋๋ค.
๋ํ์ ์ธ์คํด์คํํ๊ธฐ ๋๋ฌธ์, ํ์ฌ๊น์ง์ ํธ์ง ๋ด์ญ์ด ๋ด๊ธด Shape Layer์ ๋ํ ์ธ์คํด์ค ๋ฐฐ์ด์ ์ง๋ ฌํํ์ฌ JSON ํ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
์ดํ JSON ํ์ผ์ ๋ถ๋ฌ์ฌ ๋, Shape Layer ๋ฐฐ์ด์ ์ ์ ํ ๋งค์นญ์ํค๋ ๊ธฐ๋ฅ๊น์ง ๊ตฌํ๋ ์ํ์
๋๋ค.
## Conclusion & Limitations
- HTML5์ Canvas API๋ฅผ ํ์ฉํ์ฌ ์ด๋ฏธ์ง ์๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ํ๊ณ , ๊ฐ ๊ธฐ๋ฅ๋ค์ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ํ๊ณ์ ์ ๋ํด ์ฐ๊ตฌํ๊ณ ์์ค ์ฝ๋๋ฅผ ๊ณต๊ฐํ์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ์ ํฉํ ๊ณ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๊ณ , ์ํฉ์ ๋ง๋ ๋์์ธ ํจํด์ ์ฌ์ฉํจ์ผ๋ก์ ์ด๋ฏธ์ง ์๋ํฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์์ต๋๋ค.
- Canvas API์ ๋ฒ์๋ฅผ ๋์ด์๋ ์๊ตฌ์ฌํญ์ ๋ํด์๋ ๊ธฐ์ ์ ์ผ๋ก ์ฐํํ๋ฉด์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํด์น์ง ์์๋ค๋ ์ ์์ ์์๊ฐ ์์์ต๋๋ค.
- ๋ค๋ง ์๊ฐ์ ์ฌ์ ์ ๊ธฐ๋ฅ์ฑ ๋ค์ํ ๋ฐ ์ฌ์ฉ์ ํธ์๋ฅผ ์ํ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค(ํค๋ณด๋ ๋จ์ถํค ์ง์ ๋ฑ)์ ๋ํด์๋ ๊ตฌํ์ด ์๋ฃ๋์ง ์์ ๋ถ๋ถ์ด ์์ต๋๋ค.
- ๋ํ ๋ณต์กํ ์ํ ๊ด๋ฆฌ ๋ฐ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ์ผ๋ก ์ธํด ์ฝ๋ ๊ฐ๋
์ฑ ๋ฐ ์ฑ๋ฅ ์ต์ ํ ๋ฉด์์ ๋ค์ ๋ถ์กฑํ ๋ถ๋ถ์ด ์์ต๋๋ค.
- ํฅํ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ์ ์ง๋ณด์๋ฅผ ํตํด ์ฑ๋ฅ๊ณผ ํธ์๋ฅผ ๊ฐ์ ํด ๋๊ฐ ์์ ์
๋๋ค.
## References
ํ๋ก์ ํธ ๊ฐ๋ฐ ์ค ์ฐธ๊ณ ํ ์๋ฃ์
๋๋ค.
### Papers
- [์ฅ์์ฐ, ํ๋ฌธํ, HTML5 ์บ๋ฒ์ค๋ฅผ ์ด์ฉํ ํ๋ซํผ ๋
๋ฆฝ์ ์ธ ๊ฒ์์ ๊ตฌํ, ํ๊ตญ์ ๋ณดํต์ ํํ๋
ผ๋ฌธ์ง, ์ 18๊ถ, ์ 12ํธ, pp. 3042-3048, 2014](https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART001946202)
- [๋ฐ์์, HTML5์์ ์ง์ ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ด์ฉํ 2D to 3D ์
์ฒด ์ด๋ฏธ์ง ๋ณํ, ๋์งํธ์ต๋ณตํฉ์ฐ๊ตฌ, ์ 12๊ถ, ์ 12ํธ, pp. 521-528, 2014](https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART001939840)
- [๋ฐ๋ฏธ๋ผ, ๋ฐ๊ธฐํธ, ์์ฌ์ฑ, HTML5 Canvas๋ฅผ ํ์ฉํ ์๊ฐ์ ๊ณต๊ฐ๋ถ์ ํ๊ฒฝ์ ์ค๊ณ์ ๊ตฌํ, ํ๊ตญ์ง๋ฆฌ์ ๋ณดํํ์ง, ์ 14๊ถ, ์ 4ํธ, pp.44-53, 2011](https://www.kci.go.kr/kciportal/ci/sereArticleSearch/ciSereArtiView.kci?sereArticleSearchBean.artiId=ART001615401)
### Others
- [Vitaly Friedman, Smashing Book 6: New. Frontiers In Web Design, 2018](https://www.smashingmagazine.com/2018/09/smashing-book-6-release/)
- [Konva.js](https://konvajs.org/)
- [React.js](https://reactjs.org/)
- [Rollup.js](https://rollupjs.org/)
- [TypeScript](https://www.typescriptlang.org/)
- [Typescript + React + Rollup์ผ๋ก ํ์ธํธ Component Library ๋ง๋ค๊ธฐ](https://velog.io/@_junukim/Typescript-React-Rollup%EC%9C%BC%EB%A1%9C-%ED%92%80%EC%84%B8%ED%8A%B8-Component-Library%EB%A7%8C%EB%93%A4%EA%B8%B0)
- [Rollup์ ์ฌ์ฉํ์ฌ ๋์์ธ ์์คํ
๋ฒ๋ค ํ, npm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐฐํฌํ๊ธฐ](https://velog.io/@velopert/bundle-with-rollup-and-publish-to-npm)
## ๋ณด๊ณ ์
<p align="center">
<img src="images/paper.png" width="300">
</p>
_ํด๋น ๋
ผ๋ฌธ์ 2021 ํ๊ตญ์ ๋ณด๊ณผํํ ํ๋ถ์ ๋
ผ๋ฌธ๊ฒฝ์ง๋ํ ๋ณธ์ ์ง์ถ์์
๋๋ค._
- [ ] [์ต์ข
๋ณด๊ณ ์](reports/Final.pdf)
- [x] [ํ๊ตญ์ ๋ณด๊ณผํํ ๋
ผ๋ฌธ](reports/HTML5_Canvas_๊ธฐ๋ฐ_์คํ์์ค_์ด๋ฏธ์ง_์๋ํฐ_๋ผ์ด๋ธ๋ฌ๋ฆฌ_๊ฐ๋ฐ.pdf)
- [x] [ํ๊ตญ์ ๋ณด๊ณผํํ ํ๋ถ์๊ฒฝ์ง๋ํ ๋ฐํ์์](reports/304_์ ์ข
์ค(๊ฒฝํฌ๋ํ๊ต).mp4)