๋ณธ๋ฌธ์œผ๋กœ ์ด๋™

qooxdoo

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „.
qooxdoo
์•ˆ์ •ํ™” ๋ฒ„์ „
7.8.0 / 2025๋…„ 1์›” 28์ผ(21๊ฐœ์›” ์ „)(2025-01-28)[1]
์ €์žฅ์†Œ
์ข…๋ฅ˜์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
๋ผ์ด์„ ์ŠคLGPL, EPL
์›น์‚ฌ์ดํŠธqooxdoo.org

qooxdoo(/หˆkuหksduห/)๋Š” ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด Ajax ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” LGPL ๋ฐ EPL ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฅด๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ฐ ์„œ๋ฒ„ ๋…๋ฆฝ์ ์ธ ์†”๋ฃจ์…˜์ด๋ฉฐ, ์ „๋ฌธ์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ ์ง€์›, ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค (GUI) ์œ„์ ฏ ํˆดํ‚ท, ๊ทธ๋ฆฌ๊ณ  ๊ณ ๊ธ‰ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ

[ํŽธ์ง‘]

qooxdoo๋Š” ์™„์ „ํžˆ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ๊ฒŒ์ฝ” (ํŒŒ์ด์–ดํญ์Šค, ๋ชจ์งˆ๋ผ, ์‹œ๋ชฝํ‚ค), ํ”„๋ ˆ์Šคํ†  (์˜คํŽ˜๋ผ), ํŠธ๋ผ์ด๋˜ํŠธ (์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ, ๋ฆฌ์–ผํ”Œ๋ ˆ์ด์–ด, ์œˆ์•ฐํ”„), ์›นํ‚ท (ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ)์„ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€์ ์ธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•œ๋‹ค.[2] ๋˜ํ•œ Javadoc ์Šคํƒ€์ผ์˜ ์ฃผ์„์œผ๋กœ๋ถ€ํ„ฐ ์ž๋™ ์ƒ์„ฑ๋˜๋Š” API ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋„๊ตฌ ๋ชจ์Œ์—๋Š” ์ž๋™ ๋นŒ๋“œ ๊ณผ์ •์˜ ํ•„์ˆ˜ ์š”์†Œ์ธ ํฌ๊ด„์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ตœ์ ํ™”, ๋ฐ์ดํ„ฐ ์••์ถ•, ๋งํฌ, ๋ฐฐํฌ ๋ฐ ๋ฌธ์„œ ์ƒ์„ฑ์— ์‚ฌ์šฉ๋œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตญ์ œํ™”์™€ ์ง€์—ญํ™”๋„ ์ง€์›ํ•œ๋‹ค. qooxdoo๋Š” ํฌ๊ด„์ ์ธ SDK๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.[3]

GUI ํˆดํ‚ท

[ํŽธ์ง‘]

์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , qooxdoo๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ Qt, ํ‘œ์ค€ ์œ„์ ฏ ํˆดํ‚ท (SWT) ๋“ฑ๊ณผ ๊ฐ™์€ GUI ํˆดํ‚ท๊ณผ ๋Œ€๋“ฑํ•œ ์ˆ˜์ค€์ด๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์†Œ๋ฅผ ๋‹ฎ์€ ์ผ๋ จ์˜ ์œ„์ ฏ์„ ์ œ๊ณตํ•œ๋‹ค. ํ‚ค๋ณด๋“œ ํƒ์ƒ‰, ํฌ์ปค์Šค ๋ฐ ํƒญ ์ฒ˜๋ฆฌ, ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์— ๋Œ€ํ•œ ๋‚ด์žฅ ์ง€์›์ด ์ œ๊ณต๋œ๋‹ค. ํฌ๊ธฐ๋Š” ์ •์ (static), ์ž๋™ ํฌ๊ธฐ ์กฐ์ •(auto-sizing), ๋Š˜๋ฆฌ๊ธฐ(stretching), ๋ฐฑ๋ถ„์œจ, ๊ฐ€์ค‘์น˜ ํ”Œ๋ ‰์Šค(weighted flex) ๋˜๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ํฌ๊ธฐ, ํ˜น์€ ์ด๋“ค์˜ ์กฐํ•ฉ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์œ„์ ฏ์€ ์œ ์—ฐํ•œ ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋Š” ๋งŽ์€ ๊ณ ๊ธ‰ ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ HTML์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ์Šคํƒ€์ผ์„ ์ง€์ •ํ•  ๋•Œ CSS๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์ƒ‰์ƒ, ์•„์ด์ฝ˜ ๋ฐ ๊ธฐํƒ€ ์‹œ๊ฐ์  ์†์„ฑ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ชจ์–‘ ํ…Œ๋งˆ(appearance theme)๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋Š” ๋Ÿฐํƒ€์ž„ ์ „ํ™˜๋„ ์ง€์›ํ•œ๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

[ํŽธ์ง‘]

qooxdoo๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ซํžŒ ํ˜•ํƒœ(closed form)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ „์—ญ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋ฐ, ํ•˜๋‚˜๋Š” ์ƒˆ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” 'construct'(์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ ํ›…), 'statics'(์ •์  ํด๋ž˜์Šค ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ์šฉ), 'members'(์ธ์Šคํ„ด์Šค ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ์šฉ), 'destruct'(์†Œ๋ฉธ์ž์šฉ)์™€ ๊ฐ™์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ‚ค ์ง‘ํ•ฉ์˜ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋งต์ด๋‹ค. ์ด (๋•Œ๋กœ๋Š” ํฐ) ๋งต์ด ํด๋ž˜์Šค ์ •์˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํด๋ž˜์Šค๋Š” 'extend' ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณจ๊ฒฉ์€ ์ด ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. ์ด ์ฝ”๋“œ๋Š” ํˆดํŒ์ด ์žˆ๊ณ  ๋ˆŒ๋ €์„ ๋•Œ ๊ฒฝ๊ณ  ์ƒ์ž๋ฅผ ์—ฌ๋Š” ๋ฒ„ํŠผ์ด ํฌํ•จ๋œ ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•œ๋‹ค. ์˜จ๋ผ์ธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—์„œ ์ด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค:[4]

qx.Class.define("custom.Application",
{
  extend : qx.application.Standalone,

  members :
  {
    main : function()
    {
      this.base(arguments);

      // ๋ฒ„ํŠผ ์ƒ์„ฑ
      var button1 = new qx.ui.form.Button("์ฒซ ๋ฒˆ์งธ ๋ฒ„ํŠผ",
                                          "icon/22/apps/internet-web-browser.png");

      // Document๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฃจํŠธ์ž„
      var doc = this.getRoot();

      // ๊ณ ์ • ์ขŒํ‘œ๋กœ ๋ฌธ์„œ์— ๋ฒ„ํŠผ ์ถ”๊ฐ€
      doc.add(button1, {left: 100, top: 50});

      // ํˆดํŒ ๋ถ€์ฐฉ
      button1.setToolTip(new qx.ui.tooltip.ToolTip("๋ฉ‹์ง„ ํˆดํŒ",
                                                   "icon/32/status/dialog-information.png"));

      // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
      button1.addListener("execute", function(e) {
        alert("Hello World!");
      });
    }
  }
});

์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฏน์Šค์ธ๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.

qooxdoo ํ”„๋กœ์ ํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ฐ ์„œ๋ฒ„ ๋…๋ฆฝ์ ์ธ ์†”๋ฃจ์…˜์ด์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์„ ์‹œ์—ฐํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ์ ์ธ RPC ์„œ๋ฒ„ ๊ตฌํ˜„(ํ˜„์žฌ ์ž๋ฐ”, PHP, ํŽ„, ํŒŒ์ด์ฌ)์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ์ถ”์ƒ ์ „์†ก ๊ณ„์ธต์€ XMLHttpRequest, Iframe ๋ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ํ, ํƒ€์ž„์•„์›ƒ ๋ฐ ๊ตฌํ˜„์„ ์ง€์›ํ•œ๋‹ค. qooxdoo์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๊ณ„์ธต์€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜์กดํ•œ๋‹ค.

๊ฐ™์ด ๋ณด๊ธฐ

[ํŽธ์ง‘]

๊ฐ์ฃผ

[ํŽธ์ง‘]
  1. โ†‘ โ€œRelease v7.8.0 ยท qooxdoo/qooxdooโ€. ใ€Šgithub.comใ€‹. 2025๋…„ 1์›” 28์ผ. 2025๋…„ 4์›” 1์ผ์— ํ™•์ธํ•จ.
  2. โ†‘ โ€œqooxdoo Requirementsโ€. 2010๋…„ 12์›” 19์ผ์— ์›๋ณธ ๋ฌธ์„œ์—์„œ ๋ณด์กด๋œ ๋ฌธ์„œ. 2011๋…„ 2์›” 2์ผ์— ํ™•์ธํ•จ.
  3. โ†‘ โ€œqooxdoo Download pageโ€. 2010๋…„ 12์›” 25์ผ์— ์›๋ณธ ๋ฌธ์„œ์—์„œ ๋ณด์กด๋œ ๋ฌธ์„œ. 2011๋…„ 2์›” 2์ผ์— ํ™•์ธํ•จ.
  4. โ†‘ โ€œPlaygroundโ€. 2011๋…„ 2์›” 2์ผ์— ํ™•์ธํ•จ.

์™ธ๋ถ€ ๋งํฌ

[ํŽธ์ง‘]