๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋…ธ๋ ฅ์„ ์ด๊ธฐ๋Š” ์žฌ๋Šฅ์€ ์—†๊ณ 
๋…ธ๋ ฅ์„ ์™ธ๋ฉดํ•˜๋Š” ๊ฒฐ๊ณผ๋„ ์—†๋‹ค.
- ์ด์ฐฝํ˜ธ 9๋‹จ

D E V E L O P M E N T/SPRING

[SPRING] ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ

  Junesker   2020. 4. 7.
๋ฐ˜์‘ํ˜•

ํ…์ŠคํŠธ ํŽธ์ง‘๋„๊ตฌ๋“ค ์ค‘ CKEditor๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด๋‹ค. ์˜ˆ์ „๋ถ€ํ„ฐ ๊พธ์ค€ํžˆ CKEditor๋ฅผ ์ด์šฉํ•ด์„œ ๋งŽ์€ ๊ฐœ๋ฐœ๋„ ํ•˜๊ณ  ์ต์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋Ÿฐ์ง€ CKEditor๋ฅผ ์ ์šฉํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ œ์ผ ํŽธํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋“ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋ฅผ ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์ž๋Š” ๋งˆ์Œ์ด ์ƒ๊ฒจ ์ ์šฉํ•ด๋ณด์•˜๋‹ค.

 

 

 

 

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์ ์šฉํ•˜๊ธฐ


SmartEditor2์—์„œ ์ด์ „ ๋ฒ„์ „์— ๋น„ํ•ด ๊ฐœ์„ ๋œ ๊ธฐ๋Šฅ๊ณผ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

๊ฐœ์„ ๋œ ๊ธฐ๋Šฅ

  • UI ๋””์ž์ธ ๊ฐœ์„ 
    ๊ธ€๊ผด, ๊ธ€์ž ํฌ๊ธฐ, ์ค„ ๊ฐ„๊ฒฉ ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” UI๋ฅผ ๊ธฐ์กด์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ๋ ˆ์ด์–ด๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋””์ž์ธ์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค.
  • ๊ธ€์ž ์ƒ‰๊ณผ ๊ธ€์ž ๋ฐฐ๊ฒฝ ์ƒ‰
    ๊ธฐ์กด์˜ ๊ธฐ๋ณธ ์ƒ‰์ƒํ‘œ ์ด์™ธ์— ๋‹ค์–‘ํ•œ ์ƒ‰์ƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ปฌ๋Ÿฌ ํŒ”๋ ˆํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ค„ ๊ฐ„๊ฒฉ
    ์ค„ ๊ฐ„๊ฒฉ ๊ฐ’์„ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธ์šฉ๊ตฌ
    ์ธ์šฉ๊ตฌ ์Šคํƒ€์ผ์ด ๊ธฐ์กด์˜ 7๊ฐ€์ง€์—์„œ 10๊ฐ€์ง€๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค.
  • ํ‘œ
    ํ‘œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ๊ธฐ์กด์—๋Š” ํ…Œ๋‘๋ฆฌ ์ƒ‰์ƒ๊ณผ ๋‘๊ป˜๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ SmartEditor2 ๋ฒ„์ „์—์„œ๋Š” ํ…Œ๋‘๋ฆฌ ์Šคํƒ€์ผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‰ฝ๊ฒŒ ํ‘œ๋ฅผ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋„๋ก ํ‘œ ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•œ๋‹ค.

์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

  • ํ‘œ ๊ฐ„๋‹จ ํŽธ์ง‘๊ธฐ
    ํ‘œ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ‘œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„์—๋„ ์Šคํƒ€์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • TEXT ๋ชจ๋“œ
    Editor๋ชจ๋“œ(WYSIWYG)์™€ HTML๋ชจ๋“œ ์™ธ์— TEXT๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹จ์ˆœ ํ…์ŠคํŠธ๋งŒ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‘œ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ‘œ๋ฅผ ์‚ฝ์ž…ํ•œ ํ›„์—๋„ ์Šคํƒ€์ผ์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€์› ๋ธŒ๋ผ์šฐ์ €

 

์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋Š” SmartEditor2์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ์„ ์ง€์›ํ•œ๋‹ค. ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋ธŒ๋ผ์šฐ์ € ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์šด์˜์ฒด์ œ๋ณ„๋กœ SmartEditor2์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์„ค์น˜ ์ „ ํ™•์ธ์‚ฌํ•ญ

 

  • HTML DOCTYPE
    SmartEditor2๋Š” HTML Traditional 4.01๋งŒ ์ง€์›ํ•˜๋ฉฐ, Internet Explorer 8.0 ์ด์ƒ์—์„œ๋Š” Internet Explorer 7.0 ํ˜ธํ™˜ ๋ชจ๋“œ๋กœ ์—ด๋ฆฐ๋‹ค.
  • ํŒŒ์ผ ์ธ์ฝ”๋”ฉ
    SmartEditor2์—์„œ ์ œ๊ณตํ•˜๋Š” JavaScript, CSS, HTML ์ฝ”๋“œ๋Š” ๋ชจ๋‘ UTF-8 BOM(Byte Order Mark)์œผ๋กœ ์ธ์ฝ”๋”ฉ๋˜์—ˆ๋‹ค.

 

 

1.  ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 Githup ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 Githup

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ ์—๋””ํ„ฐ2๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Githup์— ๋„ค์ด๋ฒ„ > ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ํŽ˜์ด์ง€๋กœ ์ ‘์†ํ•œ๋‹ค. ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ๋Š” ์›๋ž˜ ๋„ค์ด๋ฒ„ ๋””๋ฒจ๋กœํผ์Šค์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐํฌํ–ˆ๋‹ค. ๋‹น์—ฐํžˆ ์ด์Šˆ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๋‹ค. ํ•˜์ง€๋งŒ, ์ด์ œ๋Š” Githup์—์„œ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฒ„์ „๋ณ„ ๋ฐฐํฌํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ด์Šˆ๋„ ๊นƒํ—™์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

 

 

 

 

 

2.  ํ•„์š”ํ•œ ๋ฒ„์ „์„ ์„ ํƒ ํ›„, ์Šค๋งˆํŠธ ์—๋””ํ„ฐ ์••์ถ• ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 Githup Release
๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์›ํ•˜๋Š” ๋ฒ„์ „ zipํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

๊นƒํ—™์—์„œ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ ์—๋””ํ„ฐ2 ๋ฆด๋ฆฌ์ฆˆ๋กœ ์˜ค๊ฒŒ๋˜๋ฉด ๋งŽ์€ ๋ฒ„์ „์˜ ์Šค๋งˆํŠธ ์—๋””ํ„ฐ2 ๋กœ๊ทธ์™€ ๋ฐฐํฌํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•Œ๊ณ  ๊ฐ€์•ผํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฒ„์ „ 2.9.0 ~ 2.10.0 ๋ฐฐํฌ ํŒŒ์ผ์—” ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ๋น ์ ธ์žˆ์—ˆ๋‹ค. ์ด ์  ๊ผญ ์ฐธ๊ณ ํ•˜์‹œ๊ณ  ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋ฒ„์ „ 2.8.2.3 ๋ฐฐํฌ ํŒŒ์ผ zip์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•˜๋‹ค.

 

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ

 

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฒ„์ „ 2.8.2.3์„ ์„ค์น˜ํ•˜๊ณ  ์ ์šฉํ•˜์˜€๋‹ค. ์ ์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ถ„๋“ค์€ ์œ„ ๋งํฌ๋ฅผ ํด๋ฆญํ•ด ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 

 

 

 

 

3.  ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ zipํŒŒ์ผ์˜ ์••์ถ•์„ ํ‘ผ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฒ„์ „ 2.8.2.3 ํŒŒ์ผ ์••์ถ•ํ•ด์ œ

๋‹ค์šด๋ฐ›์€ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฒ„์ „ 2.8.2.3 ํŒŒ์ผ์„ ์••์ถ•ํ•ด์ œํ•˜๋ฉด ์œ„์™€๊ฐ™์€ ํŒŒ์ผ๊ตฌ์กฐ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์— ํ•„์š”ํ•œ js์™€ html์€ sampleํด๋”์— ์กด์žฌํ•œ๋‹ค.

 

 

 

 

 

4.  ์••์ถ•์„ ํ‘ผ ํด๋” ๊ทธ๋Œ€๋กœ webapp ์•„๋ž˜์— ๋ถ™์—ฌ๋„ฃ๊ณ  ํด๋” ์ด๋ฆ„์„ smarteditor2๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ํด๋” ๋ถ™์—ฌ๋„ฃ๊ธฐ

์••์ถ•์„ ํ‘ผ ํด๋”๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ดํด๋ฆฝ์Šค ํ”„๋กœ์ ํŠธ์•ˆ์— webapp๋ฐ”๋กœ ์•„๋ž˜์— ๋ถ™์—ฌ๋„ฃ๊ณ  ๊ธฐ์กด smarteditor2-2.8.2.3์œผ๋กœ ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๋ช…์„ smarteditor2๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ• ๋•Œ ํŒŒ์ผ๋ช…์ด ๊ธธ๊ฑฐ๋‚˜ ๋ณต์žกํ•˜๋ฉด ์†Œ์Šค๊ฐ€ ๊ธธ์–ด์ง€๊ฑฐ๋‚˜ ์ง€์ €๋ถ„ํ•ด์ง€๋ฏ€๋กœ ์งง๊ฒŒ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

 

 

 

 

 

5.  HuskyEZCreator.js๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 js ์ถ”๊ฐ€

headํƒœ๊ทธ ์•ˆ์— HuskyEZCreator.js ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

<script type="text/javascript" src="/smarteditor2/js/HuskyEZCreator.js" charset="utf-8"></script>

 

 

 

 

 

6.  ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋ฅผ ์ ์šฉํ•  ๋“ฑ๋ก ํŽ˜์ด์ง€์— textarea์™€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

textarea ์ถ”๊ฐ€
๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

form ํŽ˜์ด์ง€์— textarea๋ฅผ ์ถ”๊ฐ€ํ•ด ๋‚ด์šฉ์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” html์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. ์ด๋•Œ, name๊ณผ id๊ฐ’์„ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํฌ๋ฆฝํŠธ์— nhn.husky.EZCreator.createInIFrame()์„ ์„ ์–ธํ•œ๋‹ค.

 

<textarea class="form-control" rows="20" name="bo_content" id="bo_content"></textarea>

 

var oEditors = [];

nhn.husky.EZCreator.createInIFrame({
  oAppRef : oEditors,
  elPlaceHolder : "bo_content",
  sSkinURI : "/smarteditor2/SmartEditor2Skin.html",
  fCreator : "createSEditor2"
});

 

 

 

 

 

7.  ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๊ฐ€ ์ž˜ ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์ ์šฉ

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๊ฐ€ ์ž˜ ์ ์šฉ๋˜์—ˆ๋‹ค. ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ์—์„œ ์•ˆ๋‚ดํ•ด์ฃผ๋Š” ์ œ๊ณต๊ธฐ๋Šฅ์ƒ์„ธ ๋ฉ”๋‰ด๋“ค์ด ๋“ค์–ด์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์‚ฌ์ง„์ด๋ผ๋Š” ๋ฉ”๋‰ด๋„ ์ž˜ ๋ณด์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‹จ์—๋Š” ์ž…๋ ฅ์ฐฝ ํฌ๊ธฐ์กฐ์ ˆ๊ณผ Editor, HTML, TEXT๋ฅผ ์„ ํƒํ•ด ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋‰ด๋„ ๋ณด์ธ๋‹ค. ์™ผ์ชฝ ์ƒ๋‹จ์— ๋ฒ„์ „์ด๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๋Š”๋ฐ ์ด ๋ถ€๋ถ„์€ SmartEditor2Skin.html์—์„œ ์ œ๊ฑฐํ•ด์ฃผ๋ฉด ์—†์–ด์ง€๋ฏ€๋กœ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

โ€ป ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋ฅผ ์ ์šฉํ•œ ๊ฒŒ์‹œํŒ ๋“ฑ๋กํผ์—์„œ ๊ฒŒ์‹œ๊ธ€ ์ž…๋ ฅ ์‹œ, ์ถ”๊ฐ€์‚ฌํ•ญ

 

๊ฒŒ์‹œํŒ FormํŽ˜์ด์ง€์—์„œ textarea์— ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ ์ž…๋ ฅ ํ›„ ๊ฒŒ์‹œ๊ธ€์„ ๋“ฑ๋กํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋“ฑ๋ก์ด ๋˜์งˆ ์•Š๋Š”๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ formํƒœ๊ทธ์•ˆ์— ๋“ค์–ด์žˆ๋Š” input์š”์†Œ๋“ค์˜ name๊ฐ’์„ ํ†ตํ•ด submit๋˜์–ด์ง„ ๋ฐ์ดํ„ฐ๋“ค์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•ด ๊ฒŒ์‹œ๊ธ€์„ ๋“ฑ๋กํ•˜๋Š”๋ฐ ์ด๋•Œ textarea๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋”ฐ๋กœ ์žˆ๋‹ค. ๊ฒŒ์‹œํŒ ๋“ฑ๋ก ํŽ˜์ด์ง€์ธ form์—์„œ ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋“ฑ๋กํ•˜๋ ค๋Š” ์ด๋ฒคํŠธ ๋‚ด์— ์•„๋ž˜์™€ ๊ฐ™์€ javascript code๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.  

oEditors.getById["bo_content"].exec("UPDATE_CONTENTS_FIELD",[]);

 

 

 

 

 

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ


 

์‚ฌ์ง„ ํ€ต ์—…๋กœ๋”๋Š” SmartEditor2๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์ง„์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์—… UI์™€ ์—๋””ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•œ๋‹ค. ์—๋””ํ„ฐ์˜ ํŒ์—… ๊ด€๋ จ ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ์„œ๋ฒ„ ์ž‘์—…๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ํŒ์—… UI์—์„œ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์˜ HTML5 ์ง€์› ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์˜ UI๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ popup

HTML5 ์ง€์› ๋ธŒ๋ผ์šฐ์ €

 

HTML5๋ฅผ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํ•œ ์žฅ ์ด์ƒ์˜ ์‚ฌ์ง„์„ ๋Œ์–ด๋‹ค ์ง€์ •๋œ ์˜์—ญ์— ๋†“์œผ๋ฉด ์‚ฌ์ง„์ด ์ฒจ๋ถ€๋œ๋‹ค. HTML5 ์ง€์› ๋ธŒ๋ผ์šฐ์ €์˜ ์‚ฌ์ง„ ํ€ต ์—…๋กœ๋”๋Š” HTML5์˜ ๋“œ๋ž˜๊ทธ ์•ค๋“œ ๋“œ๋กญ๊ณผ File API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 2012๋…„ 12์›”์„ ๊ธฐ์ค€์œผ๋กœ Internet Explorer 10 ์ด์ƒ ๋ฒ„์ „, Firefox 15 ์ด์ƒ ๋ฒ„์ „, Chrome 22 ์ด์ƒ ๋ฒ„์ „, Safari 5.1 ์ด์ƒ ๋ฒ„์ „์ด HTML5์˜ ๋“œ๋ž˜๊ทธ ์•ค๋“œ ๋“œ๋กญ๊ณผ File API๋ฅผ ์ง€์›ํ•œ๋‹ค.

 

HTML5 ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ €

 

HTML5๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํ•œ ๋ฒˆ์— ํ•œ ์žฅ์˜ ์‚ฌ์ง„๋งŒ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ”๋กœ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค€๋‹ค. HTML5 ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ €์˜ ์‚ฌ์ง„ ํ€ต ์—…๋กœ๋”๋Š” NAVER์—์„œ ์ œ์ž‘๋œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Jindo์˜ FileUploader๋ฅผ ์ด์šฉํ•˜์—ฌ ์ œ์ž‘ํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

 

 

 

 

 

1.  attach_photo.js ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

 

sample/photo_uploader/attach_photo.jsํŒŒ์ผ์„ ์—ฐ๋‹ค. attach_photo.js์•ˆ์— ์žˆ๋Š” callFileUploader()์™€ html5Upload() ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. callFileUploader()๋Š” ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํŒ์—…์ฐฝ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋˜๊ณ , html5Upload()๋Š” ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํŒ์—…์ฐฝ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

callFileUploader() ์ˆ˜์ •

 

callFileUploader() ์ˆ˜์ •

sUrl  : '/singleImageUploader.do',
sCallback : '/smarteditor2/sample/photo_uploader/callback.html'

 

callFileUploader()์˜ sUrl, sCallback ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. sUrl์€ php๊ฒฝ๋กœ๋กœ ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ปจํŠธ๋กค๋Ÿฌ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  sCallback ๊ฒฝ๋กœ๋กœ๋Š” smarteditor2/sample/photo_uploader/callback.html์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

html5Upload() ์ˆ˜์ •

 

html5Upload() ์ˆ˜์ •

 

sUploadURL= '/multiImageUploader.do';

html5Upload()์˜ sUploadURL ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. sUploadURL์˜ ๊ฒฝ๋กœ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋„ฃ๋Š”๋‹ค.

 

 

 

 

์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ


 

2.  ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ํ–ˆ์„๋•Œ ๋ฐ›์„ VO๋ฅผ ๋งŒ๋“ ๋‹ค.

 

@Data
public class SmarteditorVO {
	private MultipartFile filedata;
	private String callback;
	private String callback_func;
}

VO๋ฅผ ์ข€๋” ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ lombok์„ ํ™œ์šฉํ•ด ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

 

 

 

3.  ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

 

@RequestMapping(value="/singleImageUploader.do")
	public String simpleImageUploader(
		HttpServletRequest req, SmarteditorVO smarteditorVO) 
        	throws UnsupportedEncodingException{
	String callback = smarteditorVO.getCallback();
	String callback_func = smarteditorVO.getCallback_func();
	String file_result = "";
	String result = "";
	MultipartFile multiFile = smarteditorVO.getFiledata();
	try{
		if(multiFile != null && multiFile.getSize() > 0 && 
        		StringUtils.isNotBlank(multiFile.getName())){
			if(multiFile.getContentType().toLowerCase().startsWith("image/")){
            	String oriName = multiFile.getName();
                String uploadPath = req.getServletContext().getRealPath("/img");
                String path = uploadPath + "/smarteditor/";
                File file = new File(path);
                if(!file.exists()){
                file.mkdirs();
                }
                String fileName = UUID.randomUUID().toString();
                smarteditorVO.getFiledata().transferTo(new File(path + fileName));
                file_result += "&bNewLine=true&sFileName=" + oriName + 
                			   "&sFileURL=/img/smarteditor/" + fileName;
			}else{
				file_result += "&errstr=error";
			}
		}else{
			file_result += "&errstr=error";
		}
	} catch (Exception e){
		e.printStackTrace();
	}
	result = "redirect:" + callback + 
			 "?callback_func=" + URLEncoder.encode(callback_func,"UTF-8") + file_result;
	return result;
}

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์„ค์ •ํ•œ ๊ฒฝ๋กœ๊ฐ€ callFileUploader()์—์„œ sUrl๊ณผ ๋™์ผํ•˜๋‹ค. ๋‹จ์ผ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์‹œ simpleImageUploader()๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

 

 

 

 

 

4.  ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋กœ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด๋ณธ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์‹ฑ๊ธ€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด์„œ ํŒŒ์ผ์„ ํƒ์œผ๋กœ ์—…๋กœ๋“œ ํ•  ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•œ๋‹ค. ํ™•์ธ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋œ ํ›„ ๋ฆฌํ„ด์œผ๋กœ "redirect:/[callback๊ฒฝ๋กœ]?callback_func=[callback_func ํŒŒ๋ผ๋ฉ”ํ„ฐ]"๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฑ‰๋Š”๋‹ค.

 

 

 

 

 

๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ


 

5.  ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ JSP๋ฅผ ๋งŒ๋“ ๋‹ค.

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.UUID"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%
    String fileInfo = "";
    String fileName = request.getHeader("file-name");
    String fileName_suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
    String[] suffixArr = { "jpg", "png", "bmp", "gif" };
 
    int cnt = 0;
    for (int i = 0; i < suffixArr.length; i++) {
        if (fileName_suffix.equals(suffixArr[i])) {
            cnt++;
        }
    }
 
    if (cnt == 0) {
        out.println("NOTALLOW_" + fileName);
    } else {
        String defaultPath = request.getSession().getServletContext().getRealPath("/");
        String filePath = defaultPath + "img" + File.separator + "smarteditor2" + 
        					File.separator;
        File file = new File(filePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        String autoFileName = UUID.randomUUID().toString() + 
        						fileName.substring(fileName.lastIndexOf("."));
        String rFileName = filePath + autoFileName;
        InputStream is = request.getInputStream();
        OutputStream os = new FileOutputStream(rFileName);
        int num;
        byte b[] = new byte[Integer.parseInt(request.getHeader("file-size"))];
        while ((num = is.read(b, 0, b.length)) != -1) {
            os.write(b, 0, num);
        }
        if (is != null) {
            is.close();
        }
        os.flush();
        os.close();
 
        fileInfo += "&bNewLine=true";    
        fileInfo += "&sFileName=" + fileName;    
        fileInfo += "&sFileURL=/img/smarteditor2/"+autoFileName;
        out.println(fileInfo);
    }
%>

๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋„ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์—์„œ HttpServletRequest ๊ฐ์ฒด์— ๋‹ด๊ฒจ์˜จ inputStream()์˜ ๊ฐ’์œผ๋กœ ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์™€ ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ์— ๋ฟŒ๋ ค์ฃผ๋ ค ํ•˜์˜€์œผ๋‚˜, HttpServletRequest ๊ฐ์ฒด์— ๋‹ด๊ฒจ์˜จ ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์˜ฌ์ˆ˜ ์—†์–ด while๋ฌธ์„ ๋Œ๋ ค OutputStream์œผ๋กœ ๋‚ด๋ณด๋‚ธ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ jsp๋ฅผ ๋งŒ๋“ค๊ณ  jsp์—์„œ ๋™์ผํ•œ ์†Œ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋Œ๋ ค๋ณด๋‹ˆ request์—์„œ ํŒŒ์ผ์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ , ๋ฐ”๊นฅ์œผ๋กœ ๋‚ด๋ณด๋‚ธ ํŒŒ์ผ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ถ€๋ถ„์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฉด์—์„œ ์˜๋ฌธ์ด ๋‚จ๋Š”๊ฒŒ ๋งŽ์ง€๋งŒ, ์ถ”ํ›„ ์™œ ์•ˆ๋˜๋Š”์ง€? ์–ด๋–ค ๋ถ€๋ถ„์ด ์ž˜ ๋ชป๋˜์–ด ์ ์šฉ์ด ๋˜์ง€ ์•Š์•˜๋˜๊ฑด์ง€? ์—๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ณด๊ณ  ์—ฐ๊ตฌํ•ด์„œ ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ ํ•  ์˜ˆ์ •์ด๋‹ค.

 

jspํŒŒ์ผ์€ "multiImageUploader"๋ช…์˜ jspํŒŒ์ผ์„ ๋งŒ๋“ค์–ด webapp/smarteditor2/๊ฒฝ๋กœ ์•ˆ์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. WEB-INF๊ฒฝ๋กœ ์•ˆ์œผ๋กœ ๋„ฃ๊ฒŒ๋˜๋ฉด ์ง์ ‘ ์œ ์ž…์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ webapp์•ˆ์—์„œ ๋„ฃ์–ด์ค€๋‹ค. 

 

 

 

 

 

 

6.  ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2๋กœ ์—ฌ๋Ÿฌ์žฅ์˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด๋ณธ๋‹ค.

 

๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ๋ฉ€ํ‹ฐ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

 

 

 

 

 


๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ์—๋””ํ„ฐ2 ์ ์šฉํ•˜๋ฉด์„œ ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ถ€๋ถ„์—์„œ ์ •๋ง ๋งŽ์€ ์‹œ๋„์™€ ๋งŽ์€ ์ˆ˜์ •์ด ์žˆ์—ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ request๊ฐ์ฒด์— ๋„˜์–ด์˜ค๋Š” ๋ชจ๋“  ์†์„ฑ๊ฐ’๋“ค์„ ์ผ์ผ์ด ์ฐพ์•„๋ณด๊ธฐ๋„ํ•˜๊ณ , ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋ณผ์ˆ˜ ์žˆ๋Š” ์ธ์ž๊ฐ€ ์žˆ์ง€๋Š” ์•Š์„๊นŒํ•ด์„œ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ์—ด๊ณ  ์ผ์ผ์ด ๊ฐ’์„ ์ฐŽ์–ด๋ณด๊ธฐ๋„ ํ–ˆ์ง€๋งŒ, ์‹คํŒจ๋„ ๋Œ์•„๊ฐ”๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ์€ jspํŽ˜์ด์ง€๋กœ ๋งŒ๋“ค์–ด out๊ฐ์ฒด๋กœ ๋ฟŒ๋ ค์ฃผ์–ด ๋ฉ€ํ‹ฐ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ถ€๋ถ„์„ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค. java ๋‹จ์—์„œ ํŒŒ์ผ์„ ๋‹ค๋ฃจ๊ธฐ๋Š” ์–ธ์ œํ•ด๋„ ๊ฑฐ๋ถ€๊ฐ์ด ๋จผ์ € ๋“ค๊ณค ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋ฉด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹œ๋„๋„ ํ•˜๊ณ  ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒƒ์— ์„œ์„œํžˆ ๋‹ค๋‹ค๋ฅผ๋•Œ ๊ธฐ์จ์€ ๋ฐฐ๊ฐ€ ๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค. 

๋ถ€์กฑํ•œ ์‹ค๋ ฅ์ด์ง€๋งŒ, ๋„ค์ด๋ฒ„ ์Šค๋งˆํŠธ ์—๋””ํ„ฐ2๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค ํ•˜๋Š” ๋ถ„๋“ค๊ป˜ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋ฌ์œผ๋ฉด ํ•œ๋‹ค. ์ž‘์„ฑ์ž ๊ธ€์„ ๋ณด๊ณ  ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์กฐ์–ธ์„ ์•„๋ผ์ง€ ์•Š์•„๋„ ์ข‹๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€