Selections - zziuni/d3 GitHub Wiki

Wiki โ–ธ API Reference โ–ธ Core โ–ธ Selections

์„ ํƒ๋ฌผ(selection) ์€ ํ˜„์žฌ ๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฌธ์„œ์š”์†Œ์˜ ์ง‘ํ•ฉ์ด๋‹ค. D3๋Š” ๋ฌธ์„œ์š”์†Œ ์„ ํƒ์— CSS3๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ํƒœ๊ทธ("div"), CSSํด๋ž˜์Šค(".awesome"), ID("#foo"), Html ์†์„ฑ("[color=red]"), ์ปจํ…Œ์ด๋„ˆ("parent child")๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ ํƒ์ž๋Š” AND(".this.that")๋‚˜ OR(".this .that")๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์„ ํƒ์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•ด์„œ D3์ด์ „์— Sizzle์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ ํ›„์—๋Š” ์ž‘์—…์„ ํ•˜๊ธฐ์œ„ํ•ด์„œ ์—ฐ์‚ฐ์ž(operator) ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์‚ฐ์ž๋Š” ์ปจํ…์ธ ์˜ ์†์„ฑ(attributes), ์Šคํƒ€์ผ(styles), ํ”„๋กœํผํ‹ฐ(properties), HTML, ํ…์ŠคํŠธ(text)๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ (get) ์ง€์ •(set)ํ•  ์ˆ˜ ์žˆ๋‹ค. Attribute๋“ฑ์˜ ์ด๋Ÿฐ ๊ฐ’๋“ค์—๋Š” ์ƒ์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ง€์ •๋˜๊ณ  ์„ ํƒํ•œ ๊ฐ ์š”์†Œ๋ณ„๋กœ ์ ์šฉ๋œ๋‹ค. ์„ ํƒ๋ฌผ์€ ๋ฐ์ดํ„ฐ(data)์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ์„ ํ•˜๋ฉด ํ•˜์œ„ ์„ ํƒ๋ฌผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ(enter)๊ณผ ๋‚˜์˜ค๊ธฐ(exit)๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์œผ๋กœ ๊ฒฐ๊ณผ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ถ”๊ฐ€(add)ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ(remove)ํ•  ์ˆ˜ ์žˆ๋‹ค.

D3์—์„œ๋Š” ๋ฌธ์„œ ์ˆ˜์ •์„ ์œ„ํ•ด์„œ for๋ฅผ ์ด์šฉํ•œ ๋ฃจํ”„๋ฌธ์ด๋‚˜ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐœ๋ณ„ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ˆœํ™˜ํ•˜๋Š” ๋Œ€์‹ ์— ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ์„ ํƒ๋ฌผ์— ํ•œ๋ฒˆ์— ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋ฉด ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” each์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์ˆ˜๋™์œผ๋กœ ๋ฌธ์„œ์š”์†Œ๋ฅผ ๋ฃจํ”„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ๋ฌผ์€ ๋ฐฐ์—ด์ด๋ผ์„œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค( selection[0][0] ). D3๋Š” ๋ฉ”์„œ๋“œ ์ฑ„์ด๋‹์„ ์ง€์›ํ•œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•  ๋•Œ ํ‘œํ˜„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์—ฐ์‚ฐ์ž์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ทธ ์„ ํƒ๋ฌผ์ด๋‹ค.

Selecting Elements

D3๋Š” ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋ฉ”์„œ๋“œ ๋‘๊ฐœ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. select๊ณผ selectAll์ด๋‹ค. ์ด๋“ค์€ ์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ์ „์ž๋Š” ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ์ค‘ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๋งŒ ์„ ํƒํ•˜๊ณ , ํ›„์ž๋Š” ๋ฌธ์„œ์ƒ์˜ ์ˆœ์„œ๋Œ€๋กœ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ์ธ์ž๋Š” ์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด ๋ฟ์ด ์•„๋‹ˆ๋ผ DOM ๋…ธ๋“œ(node)๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ jQuery๋‚˜ ๊ฐœ๋ฐœํˆด($0) ๊ฐ™์€ ์„œํŠธํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ†ตํ•ฉ์ด ์šฉ์˜ํ•˜๋‹ค.

# d3.select(selector)

์ธ์ž๋กœ ์ง€์ •ํ•œ ์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ๋‹จ์ผ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ง€์ •ํ•œ ์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ํ˜„์žฌ ๋ฌธ์„œ์— ์—†๋‹ค๋ฉด ๋นˆ ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์…€๋ ‰ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ๋ฌธ์„œ์ˆœ์„œ์ƒ ์ฒซ๋ฒˆ์งธ๋กœ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค.

# d3.select(node)

์ธ์ž๋กœ ์ง€์ •ํ•œ ๋…ธ๋“œ( node )๋ฅผ ์„ ํƒํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ d3.select(this)๊ฐ™์ด ์„ ํƒํ•œ ๋…ธ๋“œ๋‚˜ document.body๊ฐ™์ด ์„ ํƒํ•œ ์ „์—ญ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ’์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

# d3.selectAll(selector)

์ธ์ž๋กœ ์ง€์ •ํ•œ ์„ ํƒ์ž( selector )์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ๋ฌธ์„œ์š”์†Œ๋Š” ๋ฌธ์„œ์ƒ์˜ ์ˆœ์„œ๋Œ€๋กœ(์œ„์—์„œ ์•„๋ž˜๋กœ) ์„ ํƒ๋œ๋‹ค. ํ˜„์žฌ ๋ฌธ์„œ์— ์„ ํƒ์ž์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉด ๋นˆ ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# d3.selectAll(nodes)

์ธ์ž๋กœ ์ง€์ •ํ•œ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐฐ์—ด์„ ์„ ํƒํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ d3.selectAll(this.childNodes)๊ฐ™์ด ์„ ํƒํ•œ ๋…ธ๋“œ๋‚˜ document.links๊ฐ™์ด ์„ ํƒํ•œ ์ „์—ญ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ’์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์ธ์ž nodes ๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐฐ์—ด์€ ์•„๋‹ˆ๋‹ค. ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์œ ์‚ฌ๋ฐฐ์—ด์ด ๋™์ž‘ํ•œ๋‹ค.(NodeList๋‚˜ arguments)

Operating on Selections

์„ ํƒ๋ฌผ์€ ๋ง๊ทธ๋Œ€๋กœ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐฐ์—ด์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  D3๋Š” ๋ฐฐ์—ด์— ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”์ธ๋“œํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ฐ™์€ ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์— ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์„ ํƒ๋ฌผ์€ ์ผ์ฐจ์› ๋ฐฐ์—ด์ด ์•„๋‹Œ ์„ ํƒ๋ฌผ์ด ๋ฌธ์„œ์š”์†Œ ๋ฐฐ์—ด์˜ ๋ฐฐ์—ด์ธ ๊ทธ๋ฃน ์ด๋‹ค. ์ด๋Š” ํ•˜์œ„์„ ํƒ๋ฌผ์˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ง€๊ธˆ์€ ์ด๋Ÿฐ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋ฌด์‹œํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์„ ํƒ๋ฌผ์ด [node]์ด ์•„๋‹ˆ๋ผ [[node]]๋กœ ๋ณด์ด๋Š” ์ด์œ ๋‹ค. ์ค‘์ฒฉ ์„ ํƒ๋ฌผ์— ๋Œ€ํ•œ ์ƒ์„ธ๋‚ด์šฉ์€ Nested Selections๋ฅผ ๋ณด๋ผ.

์„ ํƒ๋ฌผ์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด, ๋ฌธ์„œ์š”์†Œ ์„ ํƒ์„ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ ์ฝ˜์†”์—์„œ ์‚ดํŽด๋ณด๋ผ. ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์„ ํƒ๋œ ์œ„์น˜๋ฅผ ๋ณด๊ณ  ๊ทธ๋ฃนํ•‘๋œ ๋ฐฉ๋ฒ•์„ ๋ณด๊ธฐ์œ„ํ•ด์„œ ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์„ ๋’ค์ €๋ณผ ์ˆ˜ ์žˆ๊ณ  ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์— ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ์ปจํ…์ธ ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

Content

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

# selection.attr(name[, value])

value ์ธ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์—์„œ ์ง€์ •ํ•œ ์†์„ฑ๋ช…์˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๊ฐ™์€ ์†์„ฑ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€๋งŒ value ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๊ฐ ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ์ธ์ž๋กœ datum d์™€ ์ธ๋ฑ์Šค i๊ฐ€ ๋„˜์–ด์˜ค๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ํ•จ์ˆ˜ ๋งŒํ™˜ ๊ฐ’์ด ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ์†์„ฑ ๊ฐ’์ง€์ •์— ์‚ฌ์šฉ๋œ๋‹ค. null ๊ฐ’์€ ์ง€์ •ํ•œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์ • ์†์„ฑ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ๋ฌผ์ด ํ™•์‹คํ•˜๊ฒŒ ๋ฌธ์„œ์š”์†Œ๋ฅผ ํ•˜๋‚˜๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ์œ ์šฉํ•˜๋‹ค.

XLink ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ "href" ์†์„ฑ์„ ์ง€์ •ํ•˜๊ธฐ์œ„ํ•ด์„œ xlink:href๋ผ๊ณ  ํ•˜๋“ฏ, name ์ธ์ž์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ D3๋Š” svg, xhtml, xlink, xml, xmlns ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ณ„๋„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” d3.ns.prefix๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

name ์ธ์ž์—๋Š” name๊ณผ value ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฑ„๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

# selection.classed(name[, value])

์ด ์—ฐ์‚ฐ์ž๋Š” "class"์†์„ฑ์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ† ํฐ ์„ธํŠธ๋ผ๋Š”๊ฑธ ์ธ์‹ํ•˜๋Š” "class" ์†์„ฑ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ํŽธํ•œ ์ˆ˜๋‹จ์ด๋‹ค. ์ด๋Ÿฐ ์ „์ œํ•˜์— CSS ํด๋ž˜์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ํ† ๊ธ€ํ•˜๊ธฐ์œ„ํ•ด์„œ ๊ฐ€๋Šฅํ•˜๋ฉด classList ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด ์„ ํƒ ๋ฌธ์„œ์š”์†Œ์™€ ์—ฐ๊ด€๋œ ์ง€์ •ํ•œ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด์„œ true์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ, ์•„์ง ํด๋ž˜์Šค๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ง€์ •ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์— ํ• ๋‹นํ•œ๋‹ค. false์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด๋ฉด์„œ ํ• ๋‹น๋˜์—ˆ๋‹ค๋ฉด ๊ทธ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์„ ํƒ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. value ๊ฐ€ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ๊ทธ ํ•จ์ˆ˜๋Š”์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i์ด๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์— ํด๋ž˜์Šค๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์ง€์ •ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต์€ ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒฝ์šฐ์—๋งŒ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค.

# selection.style(name[, value[, priority]])

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋ฉด ์ด ๊ฐ’์„ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์—์„œ ์ง€์ •ํ•œ ์ด๋ฆ„์˜ CSS ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ์— ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๋™์ผ ์Šคํƒ€์ผ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€๋งŒ value ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์„ ํƒ๋œ ๊ฐ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i์ด๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. null ๊ฐ’์€ ์ง€์ •ํ•œ ์ด๋ฆ„์˜ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  null์ด๋‚˜ "important"๋กœ priority ์ธ์ž๋ฅผ ์ง€์ • ์ˆ˜๋„ ์žˆ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์ • ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ์˜ ๊ณ„์‚ฐ๋œ ํ˜„์žฌ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค. ๊ณ„์‚ฐ๋œ ๊ฐ’์€ ์ด์ „์— ์ง€์ •ํ–ˆ๋˜ ๊ฐ’๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.ํŠนํžˆ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ•์•ฝํ˜• ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ๋ง์ด๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด "font-size", "font-face"์˜ ์ถ•์•ฝํ˜•์€ "font"์ด๋‹ค. )

# selection.property(name[, value])

๋ช‡๊ฐ€์ง€ HTML ๋ฌธ์„œ์š”์†Œ๋Š” ํ‘œ์ค€ ์†์„ฑ์ด๋‚˜ ์Šคํƒ€์ผ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋ณ„๋ž€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํผ์˜ ํ…์ŠคํŠธ ํ•„๋“œ๋Š” value๋ผ๋Š” ๋ฌธ์ž์—ด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๊ณ  ์ฒดํฌ๋ฐ•์Šค๋Š” checked๋ผ๋Š” ๋ธ”๋ฆฌ์–ธ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋Ÿฐ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ property ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋‹ˆ๋ฉด className๊ฐ™์ด ๊ธฐ๋ฐ˜ ๋ฌธ์„œ์š”์†Œ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋ฉด ์ด ๊ฐ’์„ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์—์„œ ์ง€์ •ํ•œ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ์— ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€๋งŒ, value ๊ฐ€ ํ•จ์ˆ˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i์ด๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. null์€ ์ง€์ •ํ•œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์ • ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค.

# selection.text([value])

text ์—ฐ์‚ฐ์ž๋Š” textContent ํ”„๋กœํผํ‹ฐ์— ๊ธฐ์ดˆํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ํ•˜์œ„ ๋ฌธ์„œ์š”์†Œ๋Š” ๋ชจ๋‘ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋กœ ๊ต์ฒด๋œ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋ฉด ๊ทธ ๊ฐ’์„ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์—์„œ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋กœ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ฌด๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๊ฐ™์€ ํ…์ŠคํŠธ ๋‚ด์šฉ์ด ๋˜์ง€๋งŒ, value ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i์ด๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. null์€ ์ง€์ •ํ•œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์ • ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค.

# selection.html([value])

html ์—ฐ์‚ฐ์ž๋Š” innerHTML ํ”„๋กœํผํ‹ฐ์— ๊ธฐ์ดˆํ•œ๋‹ค. ๊ทธ๋ž˜์„œ inner HTML ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ํ•˜์œ„ ๋ฌธ์„œ์š”์†Œ๋Š” ๋ชจ๋‘ ์ง€์ •ํ•œ HTML๋กœ ๊ต์ฒด๋œ๋‹ค. ์•„๋‹ˆ๋ฉด, ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ HTML ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” append๋‚˜ insert ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์„ ์„ ํ˜ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ต์  ์ ์€ HTML์„ ์›ํ•  ๋•Œ๋ฅผ ์œ„ํ•ด์„œ ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๋ฆฌ์น˜ ํฌ๋ฉ”ํŒ…์ด๋ผ ํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์—์„œ inner HTML ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๊ฐ™์€ inner HTML ์ปจํ…์ธ ๊ฐ€ ๋˜์ง€๋งŒ, value ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i์ด๊ณ  this๋Š” ํ˜„์žฌ DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. null์€ ์ง€์ •ํ•œ ์†์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์ • ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ์“ธ๋ชจ๊ฐ€ ์žˆ๋‹ค.

# selection.append(name)

ํ˜„์žฌ ์„ ํƒ๋ฌผ์—์„œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์œผ๋กœ ์ง€์ •ํ•œ name ์˜ ์‹ ๊ทœ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ํ•œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ํฌํ•จํ•œ ์ƒˆ๋กœ์šด ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ๋ฌธ์„œ์š”์†Œ๋Š” ๋ถ€๋ชจ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์†ํ•œ๋‹ค. ๋งŒ์•ฝ ์žˆ์œผ๋ฉด ํ•˜์œ„ ์„ ํƒ๋ฌผ์— ๋Œ€ํ•œ select๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ „๋‹ฌ์ธ์ž name ์€ ์ƒ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ฐจํ›„์— ์ธ์ž๋กœ ์กด์žฌํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋‚˜ ๋™์ ์œผ๋กœ ์ด๋ฆ„ ์ƒ์„ฑ์„ ์œ„ํ•œ ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์›ํ•  ๊ณ„ํš์ด๋‹ค.

๋ฌธ์„œ์š”์†Œ์˜ ํƒœ๊ทธ ๋ช…(name)์—๋Š” SVG ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— "text" ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ "svg:text"๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ D3๋Š” svg, xhtml, xlink, xml, xmlns ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. d3.ns.prefix๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ถ”๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

# selection.insert(name, before)

ํ˜„์žฌ ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ before ์…€๋ ‰ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ ์•ž์— name ์œผ๋กœ ๋ช…๋ช…ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์„œ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฝ์ž…ํ•œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ ์ƒˆ๋กœ์šด ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. before ์…€๋ ‰ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•  ์ƒˆ ๋ฌธ์„œ์š”์†Œ๋Š” append์ฒ˜๋Ÿผ ๋งจ ๋์˜ ์ž์‹์š”์†Œ๊ฐ€ ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋ฌธ์„œ์š”์†Œ๋Š” ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์†ํ•œ๋‹ค. ํ•˜์œ„ ์„ ํƒ๋ฌผ์˜ select์—์„œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋‘ ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์ƒ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค. ์ฐจํ›„์— ์กด์žฌํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋‚˜ ๋™์ ์œผ๋กœ name ์ด๋‚˜ before ์…€๋ ‰ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์›ํ•  ๊ณ„ํš์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, insert("div", ":first-child")๋Š” ํ˜„์žฌ ์„ ํƒ๋ฌผ์— div ์ž์‹ ๋…ธ๋“œ๋ฅผ ์•ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.

๋ฌธ์„œ์š”์†Œ์˜ ํƒœ๊ทธ ๋ช…(name)์—๋Š” SVG ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— "text" ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ "svg:text"๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ D3๋Š” svg, xhtml, xlink, xml, xmlns ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. d3.ns.prefix๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ถ”๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

# selection.remove()

ํ˜„์žฌ ๋ฌธ์„œ์˜ ํ˜„์žฌ ์„ ํƒ๋ฌผ์—์„œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ๋ฌธ์„œ์— ๋‹ค์‹œ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋Š” ๊ทธ ์„ ํƒ๋ฌผ ์‚ฌ์šฉ์„ ๋ฉˆ์ถฐ์•ผ ํ•œ๋‹ค. ( ์ถ”๊ฐ€๋Š” ๋ฐ”๋กœ ์•ž์—์„œ ์„ค๋ช…ํ•œ append์™€ insert ์ฐธ๊ณ )

Data

# selection.data([values[, key]])

ํ˜„์ œ ์„ ํƒ๋ฌผ์— ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ•œ๋‹ค. ์ธ์ž values ๋Š” ์ˆซ์ž๋‚˜ ๊ฐ์ฒด ๋ฐฐ์—ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด์ด๊ฑฐ๋‚˜ ๊ทธ๋Ÿฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. key ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด, ์ „๋‹ฌํ•œ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ…€(datum)์„ ํ˜„์žฌ ์„ ํƒ๋ฌผ์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์— ํ• ๋‹นํ•˜๊ณ , ๋‘๋ฒˆ์งธ ๋ฐ์ดํ…€์€ ๋‘๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์—... ์ด๋Ÿฐ์‹์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์„œ์š”์†Œ์— ํ• ๋‹น๋˜๋ฉด, ๊ทธ ๊ฐ’์€ __data__ ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์„ ํƒ๋ฌผ์„ ์žฌ ์„ ํƒ ํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์„œ์š”์†Œ์— ์ง ๋‹ฌ๋ผ๋ถ™๊ฒŒ ๋งŒ๋“ ๋‹ค.

values ๋ฐฐ์—ด์€ ์„ ํƒ๋ฌผ ์•ˆ์˜ ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์„ ํƒ๋ฌผ์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ทธ๋ฃน(d3.selectAll๋ฅผ ์ด์„œ์„œ selection.selectAll๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) ์ด๋ฉด, data ๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค(๊ฐ ๊ทธ๋ฃน๋ณ„๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ด๋‹นํ•˜๋ ค ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ). ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ดˆ ์„ ํƒ๋ฌผ์— 2์ฐจ์› ๋ฐฐ์—ด์„ ์—ฐ๊ฒฐํ–ˆ๋‹ค ์น˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ํ•˜์œ„ ์„ ํƒ๋ฌผ์—๋Š” ์•ˆ์ชฝ ๋ฐฐ์—ด์ด ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์˜ values ํ•จ์ˆ˜๋Š” ํ•ญ๋“ฑ ํ•จ์ˆ˜(identity function)์ด๊ณ , ์ด ํ•จ์ˆ˜๋Š” ์ž์‹ ๋ฌธ์„œ์š”์†Œ๋“ค์„ ๊ฐ€์ง„ ๊ฐ ๊ทธ๋ฃน์—์„œ ํ˜ธ์ถœ๋˜๊ณ  ๋ถ€๋ชจ ๋ฌธ์„œ์š”์†Œ์— ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„์„œ ์ด ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

var matrix = [
  [11975,  5871, 8916, 2868],
  [ 1951, 10048, 2060, 6171],
  [ 8010, 16145, 8090, 8045],
  [ 1013,   990,  940, 6907]
];

var tr = d3.select("body").append("table").selectAll("tr")
    .data(matrix)
  .enter().append("tr");

var td = tr.selectAll("td")
    .data(function(d) { return d; })
  .enter().append("td")
    .text(function(d) { return d; });

๋ฌธ์„œ์š”์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์ธ์ž key ์— key ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆœ์ฐจ์ ์ธ ๋™์ž‘์—์„œ๋Š” ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค. key ํ•จ์ˆ˜๋Š” ์‹ ๊ทœ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋ณ„๋กœ ํ˜ธ์ถœ๋œ ํ›„, ์„ ํƒ๋ฌผ์—์„œ ์กด์žฌํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ์ด ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์— key ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋ฐ์ดํ…€ d์™€ ์ธ๋ฑ์Šค i๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. key ํ•จ์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์›๋ณ„๋กœ ์‹ฑํ–‰๋  ๋–„, ํ•จ์ˆ˜ ๋‚ด์—์„œ this๋Š” ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์ด๊ณ , key ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์„ ํƒ๋ฌผ์—์„œ ์‹คํ–‰๋  ๋•Œ๋Š” this๊ฐ€ ๊ด€๋ จ DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. key ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์‚ฌ์ „์— ์—ฐ๊ฒฐํ•œ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐ์ดํ…€์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๊ฐ ๋ฐ์ดํ…€์— name์ด๋ผ๋Š” ์œ ์ผํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

.data(data, function(d) { return d.name; })

key ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋” ์ž์„ธํ•œ ์˜ˆ์ œ๋Š” A Bar Chart, Part 2 ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

data ์—ฐ์‚ฐ์ž๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ๊ฐฑ์‹  ๋œ ์„ ํƒ๋ฌผ(์ „๋ถ€๊ฐ€ ์•„๋‹Œ)๋กœ์„œ, ์„ ํƒํ•œ DOM ๋ฌธ์„œ์š”์†Œ์— ์ธ์ž๋กœ ๋„˜๊ธด ๋ฐ์ดํ„ฐ์˜ ์›์†Œ๋ฅผ ํ• ๋‹นํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐฑ์‹  ๋œ ์„ ํƒ๋ฌผ์—๋Š” ๋ถ€์กฑํ•œ(enter) ์„ ํƒ๋ฌผ๊ณผ ๋‚จ๋Š”(exit) ์„ ํƒ๋ฌผ๋กœ์˜ ์ฐธ์กฐ๋„ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ HTML ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, key ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์กด์žฌํ•˜๋Š” ์„ ํƒ๋ฌผ์ด ์ง€์ •ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๋‹ค ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์ ๋‹ค๋ฉด, ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ํ”Œ๋ ˆ์ด์Šค ํ™€๋”๋กœ ์ฑ„์šด๋‹ค. ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ๋ณด๋‹ค ์„ ํƒ๋ฌผ์— ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๋” ๋งŽ๋‹ค๋ฉด, ๋‚จ๋Š” ์„ ํƒ๋ฌผ์€ ๋‚จ๋Š” ๋ฌธ์„œ์š”์†Œ๋กœ ์ฑ„์šด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ํƒํ•œ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด, ๊ฐฑ์‹ ๋œ ์„ ํƒ๋ฌผ์— ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ  ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ๊ณผ ๋‚จ๋Š” ์„ ํƒ๋ฌผ์€ ๋น„์–ด์žˆ๊ฒŒ ๋œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠœํ† ๋ฆฌ์–ผ Thinking With Joins ๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

key ํ•จ์ˆ˜ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด data ์—ฐ์‚ฐ์ž๋กœ ๋…ธ๋“œ ์ˆœ์„œ์˜ ์ƒ‰์ธ(index)๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ƒ‰์ธ์€์€ ๋ชจ๋“  ์—ฐ์‚ฐ ํ•จ์ˆ˜๊ฐ’์„ ์œ„ํ•ด์„œ ํ•จ์ˆ˜์˜ ๋‘๋ฒˆ์งธ ์ „๋‹ฌ์ธ์ž i๋กœ ์ „๋‹ฌ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฌธ์„œ์— ์กด์žฌํ•˜๋Š” DOM ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ž๋™์œผ๋กœ ์žฌ๋ฐฐ์—ดํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ค. ๋ฌธ์„œ๋‚ด ๋ฌธ์„œ์š”์†Œ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋Š” sort๋‚˜ order๋ฅผ ์จ์•ผํ•œ๋‹ค.

values ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์ด ๋ฉ”์„œ๋“œ๋Š” ์„ ํƒ๋ฌผ์˜ ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฃน์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ์„ ํƒ๋ฌผ์˜ ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฃน์˜ ๊ธธ์ด๊ฐ€ ๋˜๊ณ  ๋ฐ˜ํ™˜ ๋ฐฐ์—ด ๊ฐ ๋ฐ์ดํ…€์˜ ์ƒ‰์ธ์€ ๋ถ€ํ•ฉํ•˜๋Š” ์„ ํƒ๋ฌผ์˜ ์ƒ‰์ธ๊ณผ ๊ฐ™๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, ๋งŒ์•ฝ ์„ ํƒ๋ฌผ์˜ ๋ฌธ์„œ์š”์†Œ ์ผ๋ถ€๊ฐ€ null ์ด๊ฑฐ๋‚˜ ์„ ํƒ๋ฌผ์ด ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๋ฐฐ์—ด์•ˆ์˜ ํ•ด๋‹น ์ƒ‰์ธ์˜ ์›์†Œ๋Š” undefined๊ฐ€ ๋œ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ: data ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์ „์— ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆฌ์–ด ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ. ์ด๋•Œ๋Š” selection.datum๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# selection.enter()

์ด ๋ฉ”์„œ๋“œ๋Š” ํ˜„์žฌ ์„ ํƒ๋ฌผ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ๋งŒํผ DOM ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด ๊ทธ ๊ฐ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์œ„ํ•œ ํ”Œ๋ž˜์ด์Šค ํ™€๋” ์—ญํ™œ์„ ํ•˜๋Š” ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” data์—ฐ์‚ฐ์ž์˜ ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์—๋งŒ ์ •์˜๋˜์–ด์žˆ๊ณ , append, insert, select๋Š” ๊ทธ ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ์—๋งŒ ์ •์˜๋˜์–ด์žˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋“ค์€ ์ปจํ…์ธ  ํŽธ์ง‘ ์ „์— ๋ถ€์กฑํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋Š ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ์ด ๋น„์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ empty๋„ ์žˆ๋‹ค.), ์ฃผ์˜ํ•  ์ ์€ enter ์—ฐ์‚ฐ์ž๋Š” ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ๋กœ์˜ ์ฐธ์กฐ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ํ•  ๋…ธ๋“œ๋Š” ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์„ ํƒ์€ ํ–ˆ๋Š”๋ฐ ์„ ํƒ๋ฌผ์ด ๋น„์—ฌ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋ฐ์ดํ„ฐ์™€ ๋งค์นญ๋˜๋„๋ก ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋‹ค.

d3.select("body").selectAll("div")
    .data([4, 8, 15, 16, 23, 42])
  .enter().append("div")
    .text(function(d) { return d; });

๋ฌธ์„œ์˜ body๊ฐ€ ๋นˆ ์ฑ„๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์—, ์œ„์˜ ์ฝ”๋“œ๋Š” 6๊ฐœ์˜ DIV ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ body์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ DIV์˜ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋ฅผ ๋งคํ•‘๋œ ๋ฐ์ดํ„ฐ ์ˆซ์ž๋กœ ์ฑ„์šด๋‹ค.

<div>4</div>
<div>8</div>
<div>15</div>
<div>16</div>
<div>23</div>
<div>42</div>

enter ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’ ํ”Œ๋ ˆ์ด์Šค ํ™€๋” ๋…ธ๋“œ์— ๋Œ€ํ•ด ํ•œ๊ฐ€์ง€ ๋” ์ง‘์„ ๋‚ด์šฉ์€ ์ด ๋…ธ๋“œ๋“ค์ด ๋ถ€๋ชจ ๋…ธ๋“œ์— ์œ„์น˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ enter ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ๋…ธ๋“œ๋Š” append์™€ insert๋งŒ ์ง€์›ํ•œ๋‹ค.

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

# selection.exit()

์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ ์›์†Œ์˜ ์ˆ˜๋ณด๋‹ค ํ˜„์žฌ ์„ ํƒ๋ฌผ์˜ DOM ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ๊ทธ ๋‚จ๋Š” ์„ ํƒ๋ฌผ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” data ์—ฐ์‚ฐ์ž์˜ ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์—๋งŒ ์ •์˜๋˜์–ด์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ remove๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๊ธด ํ•˜์ง€๋งŒ ๋‚จ๋Š” ์„ ํƒ๋ฌผ ์—๋Š” ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ ๊ณผ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๊ฐ€ ์ •์˜๋˜์–ด์žˆ๋‹ค. ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋“ค์ด ์žˆ์œผ๋ฏ€๋กœ ์›ํ•˜๋Š” ์ˆœ๊ฐ„ ์ „ํ™˜(transition)์„ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์˜ํ•  ์ ์€ exit ์—ฐ์‚ฐ์ž๋Š” ๋‚จ๋Š” ์„ ํƒ๋ฌผ ๋กœ์˜ ์ฐธ์กฐ๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ์ œ๊ฑฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชซ์ด๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, enter ์—ฐ์‚ฐ์ž๋ฅผ ์œ„ํ•œ ์•ž์˜ ์˜ˆ์ œ์—์„œ ์ƒ์„ฑ๋œ 6๊ฐœ์˜ DIV ๋ฌธ์„œ์š”์†Œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฌธ์ œ ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์ž. ์ด์ œ ๊ฐ’์„ ๋ช‡๊ฐœ๋งŒ ๋ฐ”๊พผ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ์ด ๋ฌธ์„œ์š”์†Œ์— ๊ฒฐํ•ฉํ•œ๋‹ค.

var div = d3.select("body").selectAll("div")
    .data([1, 2, 4, 8, 16, 32], function(d) { return d; });

๊ทธ๋Ÿฌ๋ฉด data ์—ฐ์‚ฐ์ž ํ˜ธ์ถœ ๊ฒฐ๊ณผ์ธ ๋ณ€์ˆ˜ div๋Š” ๊ฐฑ์‹ ํ•œ ์„ ํƒ๋ฌผ ์„ ์ฐธ์กฐํ•œ๋‹ค. ์˜ˆ์ œ๊ฐ€ ํ•ญ๋“ฑํ•จ์ˆ˜์ธ key ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ–ˆ๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์ด ์ด์ „ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์—๋„ ์žˆ๋˜ [4, 8, 16]์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐฑ์‹ ํ•œ ์„ ํƒ๋ฌผ ์€ ์„ธ๊ฐœ์˜ DIV ๋ฌธ์„œ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด์ œ ์ด์ „ ๋ฐ์ดํ„ฐ์—์„œ ๋‚จ์€ ์›์†Œ๋ฅผ ์ด์•ผ๊ธฐํ•ด๋ณด์ž. ๋ถ€์กฑํ•œ ์„ ํƒ๋ฌผ ์„ ์‚ฌ์šฉํ•ด์„œ [1, 2, 32] ์‹ ๊ทœ ์›์†Œ๋ฅผ ์ธ์Šคํ„ด๋“œํ•ด์„œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

div.enter().append("div")
    .text(function(d) { return d; });

์•„๋‹ˆ๋ฉด ๋‚จ์€ ์›์†Œ [15, 23, 42]๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜์žˆ๋‹ค.

div.exit().remove();

๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์„œ์˜ body๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

<div>4</div>
<div>8</div>
<div>16</div>
<div>1</div>
<div>2</div>
<div>32</div>

DOM ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์ˆœ์„œ๊ฐ€ ์—‰๋ง์ธ๊ฒŒ ๋ฌธ์ œ์ธ๋ฐ, ์„ ํƒ๋ฌผ ์ƒ‰์ธ i๋Š” (์—ฐ์‚ฐ์ž ํ•จ์ˆ˜์˜ ๋‘๋ฒˆ์งธ ์ธ์ž) ์ƒˆ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ์ƒ‰์ธ๊ณผ ์ผ์น˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฅผ index ์†์„ฑ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

d3.selectAll("div").attr("index", function(d, i) { return i; });

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<div index="2">4</div>
<div index="3">8</div>
<div index="4">16</div>
<div index="0">1</div>
<div index="1">2</div>
<div index="5">32</div>

๋ฐ์ดํ„ฐ ์ˆœ์„œ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ ์š”์ˆ˜ ์ˆœ์„œ๋ฅผ ์›ํ•œ๋‹ค๋ฉด sort, order๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# selection.filter(selector)

์„ ํƒ๋ฌผ์„ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ์ฆ‰, ์ธ์ž selector ๊ฐ€ true์— ๋Œ€ํ•ญํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด๊ณ  ์žˆ๋Š” ์„ ํƒ๋ฌผ์„ ์ƒˆ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. selector ๋Š” ํ•จ์ˆ˜์ด๊ฑฐ๋‚˜ ".foo"๊ฐ™์€ CSS ์…€๋ ‰ํ„ฐ ๋ฌธ์ž์—ด์ด๋‹ค. ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋“ค ์ฒ˜๋Ÿผ, ์ด ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ…€ d์™€ ์ƒ‰์ธ๊ฐ’ i๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ณ , ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ปจํ…์ŠคํŠธ this๋กœ ๊ฐ€์ง„๋‹ค. ๋ฐฐ์—ด์˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ filter์ฒ˜๋Ÿผ, ์›๋ž˜ ์„ ํƒ๋ฌผ์˜ ์ƒ‰์ธ๊ฐ’์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ‰์ธ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด select๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™€์ˆ˜ ๋ฒˆ์งธ๋งŒ ๋ชจ๋‘ ์„ ํƒํ•˜๋ ค๋ฉด,

var odds = selection.select(function(d, i) { return i & 1 ? this : null; });

๊ฐ™์€ ์ž‘์—…์„ filter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,

var odds = selection.filter(function(d, i) { return i & 1; });

ํ˜น์€ CSS ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,

var odds = selection.filter(":nth-child(odd)");

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฌธ์„œ์š”์†Œ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ ์šฉํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” select๋‚˜ filter ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

# selection.datum([value])

์„ ํƒ๋œ ๊ฐœ๋ณ„ ๋ฌธ์„œ์š”์†Œ์™€ ์—ฎ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ๋‹ค. selection.data ๋ฉ”์„œ๋“œ์™€๋Š” ๋‹ค๋ฅด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ ๊ฒฐํ•ฉ ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ชจ์ž๋ž€ ์„ ํƒ๋ฌผ๊ณผ ๋‚จ๋Š” ์„ ํƒ๋ฌผ ์—ฐ์‚ฐ๋„ ์•ˆํ•œ๋‹ค.) ์ด ๋ฉ”์„œ๋“œ๋Š” selection.property ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

d3.selection.prototype.datum = function(value) {
  return arguments.length < 1
      ? this.property("__data__")
      : this.property("__data__", value);
};

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ ๋ชจ๋“  ์„ ํƒ ๋ฌธ์„œ์š”์†Œ์—์„œ ์—ฎ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๊ฐ™์€ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€๋งŒ, value ๊ฐ€ ํ•จ์ˆ˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ๊ฐ ์„ ํƒ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ํ˜ธ์ถœ๋˜๊ณ , ์ด์ „ ๋ฐ์ดํ…€ d์™€ ํ˜„์žฌ ์ƒ‰์ธ๊ฐ’ i ์„ ์ธ์ž๋กœ ๊ฐ€์ง€๋ฉฐ ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ปจํ…์ŠคํŠธ this๋กœ ๊ฐ€์ง„๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ ์ง€์ •์— ์‚ฌ์šฉ๋œ๋‹ค. value ๊ฐ€ null์ด๋ฉด ์—ฎ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ์ƒ‰์ธ๊ฐ’์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค.

value ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ์— ์—ฎ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์„ ํƒ๋ฌผ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ๋ฌธ์„œ์š”์†Œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋•Œ๋งŒ ์œ ์šฉํ•˜๋‹ค.

์ฃผ์˜: ์ด ๋ฉ”์„œ๋“œ์˜ ์ด์ „ ์ด๋ฆ„์€ "map"์ด ์˜€๋‹ค. "map"์€ ํ๊ธฐ๋˜์—ˆ๋‹ค.

datum ๋ฉ”์„œ๋“œ๋Š” D3๋กœ HTML5์˜ custom data ์†์„ฑ์— ์ ‘๊ทผํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ฐ™์€ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์žˆ๋‹ค.

<ul id="list">
  <li data-username="shawnbot">Shawn Allen</li>
  <li data-username="mbostock">Mike Bostock</li>
</ul>

์—ฌ๋Ÿฌ๋ถ„์€ HTML5 ๋‚ด์žฅ ํ”„๋กœํผํ‹ฐ dataset๋กœ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ด์„œ D3๋กœ custom data ์†์„ฑ์„ ๋Œ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

selection.datum(function() { return this.dataset; })

์˜ˆ๋ฅผ ๋“ค์–ด, username์œผ๋กœ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# selection.sort(comparator)

์ธ์ž๋กœ ์ง€์ •ํ•œ ๋น„๊ต ํ•จ์ˆ˜ comparator ์— ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์„ ํƒ๋ฌผ์„ ์ •๋ ฌํ•œ๋‹ค. ๋น„๊ต ํ•จ์ˆ˜๋Š” ๋น„๊ตํ•  ๋ฐ์ดํ„ฐ ์›์†Œ a ์™€ b ๋ฅผ ์ธ์ž๋กœ ๊ฐ–๋Š”๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ ์–‘์ˆ˜, ์Œ์ˆ˜, 0 ์ค‘ ํ•˜๋‚˜๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด ์Œ์ˆ˜๋ฉด a ๊ฐ€ b ๋ณด๋‹ค ์•ž์— ์˜จ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์ด ์–‘์ˆ˜๋ฉด a ๋Š” b ๋ณด๋‹ค ๋’ค์— ์˜จ๋‹ค. ๊ทธ๋ ‡์ง€์•Š์œผ๋ฉด a ๊ณผ b ๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๋ณด๊ณ  ์ˆœ์„œ๋Š” ์ž„์˜๋กœ ์ •ํ•œ๋‹ค. sort๋Š” ์•„์ง ์•ˆ์ •ํ™” ๋ฒ„์ „์ด ์•„๋‹ˆ์ง€๋งŒ ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฐฐ์—ด์˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ sort์™€ ๋™์ผ ๋™์ž‘์„ ๋ณด์žฅํ•œ๋‹ค.

# selection.order()

๋ฌธ์„œ ์ˆœ์„œ๊ฐ€ ์„ ํƒ๋ฌผ ์ˆœ์„œ์™€ ์ผ์น˜ํ•˜ ๋„๋ก ๋ฌธ์„œ์— ๋ฌธ์„œ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์‚ฝ์ž…ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์ •๋ ฌ ๋˜์–ด์žˆ๋‹ค๋ฉด sort()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ๊ณผ ๊ฐ™์ง€๋งŒ ๋” ๋น ๋ฅด๋‹ค.

Animation & Interaction

# selection.on(type[, listener[, capture]])

ํ˜„์žฌ ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์— ์ธ์ž๋กœ ์ง€์ •ํ•œ ํƒ€์ž…(type) ์˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(listener) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•œ๋‹ค. type ์€ "click", "mouseover", "submit" ๊ฐ™์€ ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ์ด๋ฆ„์„ ์˜๋ฏธํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ์ธ์ž๋กœ ๋„˜๊ธด listener ๋Š” ๊ฐ๊ฐ์˜ DOM ๋ฌธ์„œ์š”์†Œ์—์„œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณ„๋„์˜ ์—ฐ์‚ฐ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ…€ d์™€ ์ƒ‰์ธ i์„ ์ธ์ž๋กœ ๊ฐ€์ง€๋ฉฐ, ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๊ฐ€ this๊ฐ€ ๋œ๋‹ค. ๋ฆฌ์Šค๋„ˆ์—์„œ ํ˜„์žฌ ์ด๋ฒคํŠธ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ์ „์—ญ ๊ฐ์ฒด์ธ d3.event๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ฌด์‹œ๋œ๋‹ค.

์„ ํƒํ•œ ๋ฌธ์„œ์š”์†Œ์— ๋“ฑ๋กํ•˜๋ ค๋Š” ์ด๋ฒคํŠธ ํƒ€์ž…์˜ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด์ „ ๋ฆฌ์Šค๋„ˆ๋Š” ์‹ ๊ทœ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ์‚ญ์ œ ๋œ๋‹ค. ๋™์ผ ํƒ€์ž…์— ์—ฌ๋Ÿฌ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด "click.foo"๋‚˜ "click.bar"๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์˜ต์…˜์œผ๋กœ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ๋Š” listener ์ธ์ž์— null๋ฅผ ๋„˜๊ธด๋‹ค. ์–ด๋–ค ์ด๋ฒคํŠธ ํƒ€์ž…์—์„œ ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด listener์—๋Š” null์„, type์—๋Š” .type๋ฅผ ๋„˜๊ธด๋‹ค. ์˜ˆ) selection.on(".foo", null)

W3C์˜ useCapture ํ”Œ๋ž˜๊ทธ์™€ ํ•ด๋‹นํ•˜๋Š” capture ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. useCapture ํ”Œ๋ž˜๊ทธ ๋Š” ๊ณ„์ธต๊ตฌ์กฐ์˜ ํ•˜๋‹จ์— ์žˆ๋Š” EventTarget์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๊ธฐ ์ „์— ๋“ฑ๋ก๋œ EventListener๋กœ ๋จผ์ € ์ „ํŒŒ๋œ๋‹ค. ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด์„œ ๋ฒ„๋ธ”๋ง ๋˜๋Š” ์ด๋ฒคํŠธ๋Š” capture๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€๋ช…ํ•œ EventListener๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

listener ์ธ์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์ง€์ •ํ•œ type ์„ ์œ„ํ•ด ํ˜„์žฌ ํ• ๋‹น๋œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# d3.event

๋งŒ์•ฝ ํ˜„์žฌ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์ „์—ญ ๊ฐ์ฒด์—๋Š” on ์—ฐ์‚ฐ์ž๋กœ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ธ”๋Ÿญ์•ˆ์— ํ†ต๋ณด๋œ ํ›„์— ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜์—์„œ ๊ฐ™์€ ํ˜•ํƒœ(๋ฐ์ดํ„ฐ d๊ณผ ์ƒ‰์ธ i๋ฅผ ์ธ์ž๋กœ ๊ฐ–๋Š”)๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

d3.event ๊ฐ์ฒด๋Š” DOM event๋กœ์„œ preventDefault()์™€ stopPropagation()๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ๋ฌผ๋ก ์ด๊ณ  timeStampe์™€ keyCode๊ฐ™์€ ํ‘œ์ค€ ์ด๋ฒคํŠธ ํ•„๋“œ๊นŒ์ง€ ๊ตฌํ˜„ํ•œ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฒคํŠธ์ธ pageX, pageY๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, d3.event๋Š” ์ด๋ฒคํŠธ ์ขŒํ‘œ๊ฐ’์„ ํ•ด๋‹น ์ด๋ฒคํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์‹œ์Šคํ…œ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜์— ๋„์›€์„ ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์„œ์•ˆ์— SVG๊ฐ€ ์žˆ๋‹ค๋ฉด SVG ์ด๋ฏธ์ง€ ์ขŒ์ธก ์ƒ๋‹จ ๊ธฐ์ค€์˜ ์ด๋ฒคํŠธ ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•˜๊ณ , SVG ์ปจํ…Œ์ด๋„ˆ์— ๋ณ€ํ™˜(transform)์ด ์ผ์–ด๋‚ฌ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€ํ™˜์— ๋ฐ˜์˜๋œ ์ด๋ฒคํŠธ ์ขŒํ‘œ๋„ ํ•„์š”ํ•˜๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋งˆ์šฐ์Šค ์ขŒํ‘œ๋Š” d3.mouse์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , iOS ๋ฉ€ํ‹ฐํ„ฐ์น˜์˜ ์ขŒํ‘œ๋Š” d3.touches๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

# d3.mouse(container)

์ธ์ž๋กœ ๋„˜๊ธด container ๊ธฐ์ค€์œผ๋กœ ํ•ด๋‹น d3.event์˜ x, y ์ขŒํ‘œ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค. container ๋Š” svg:g๋‚˜ svg:svg๊ฐ™์€ HTML, SVG ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๋œ๋‹ค. ์ขŒํ‘œ๊ฐ’์œผ๋กœ ์›์†Œ๊ฐ€ ๋‘๊ฐœ์ธ [ x, y ] ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# d3.touches(container)

์ธ์ž๋กœ ๋„˜๊ธด container ๊ธฐ์ค€์œผ๋กœ touches ์†์„ฑ ๊ธฐ๋ฐ˜์˜ ํ•ด๋‹น d3.event์˜ x, y ์ขŒํ‘œ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค. container ๋Š” svg:g, svg:svg๊ฐ™์€ HTML, SVG ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๋œ๋‹ค. ์ขŒํ‘œ๊ฐ’์œผ๋กœ ์›์†Œ๊ฐ€ ๋‘๊ฐœ์ธ ๋ฐฐ์—ด์˜ ๋ฐฐ์—ด [ [ x1 , y1], [ x2 , y2], โ€ฆ ]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# selection.transition()

ํ•ด๋‹น ์„ ํƒ๋ฌผ๋ฅผ ์œ„ํ•œ transition ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹œ๊ฐ„์„ ๋‘๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ผ์œผํ‚ค๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณ€ํ™˜(Transition)์€ ๋Œ€๋ถ€๋ถ„ ์„ ํƒ๋ฌผ(selection)์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ์ด๋‹ค.

Subselections ํ•˜์œ„ ์„ ํƒ๋ฌผ

์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์„ ํƒ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๋Š” ๋ฐ˜๋ฉด์— ์„ ํƒ๋ฌผ์˜ select๊ณผ selectAll ์—ฐ์‚ฐ์ž๋Š” ๊ฐ ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์˜ ์ž์†์š”์†Œ์—์„œ ์กฐํšŒ๋ฅผ ํ•œ๋‹ค. D3๋Š” ์ด๋ฅผ "ํ•˜์œ„์„ ํƒ๋ฌผ"์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, d3.selectAll("p").select("b")๋Š” ๋ชจ๋“  ๋‹จ๋ฝ("p") ๋ฌธ์„œ์š”์†Œ์—์„œ ์ฒซ๋ฒˆ์งธ ๋ณผ๋“œ("b") ๋ฌธ์„œ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. selectAll๋ฅผ ํ†ตํ•œ ํ•˜์œ„์„ ํƒ๋ฌผ ์„ ํƒ์€ ์กฐ์ƒ์š”์†Œ์—์„œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ๊ทธ๋ฃน์ง“๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, d3.selectAll("p").selectAll("b")์€ d3.selectAll("p b")๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ‰๋ฉด์ ์ธ ์„ ํƒ๋ฌผ์„ ๋‹จ๋ฝ("p")๋ฌธ์„œ์š”์†Œ๋กœ ๊ทธ๋ฃน์ง“๋Š”๋‹ค. select๋ฅผ ํ†ตํ•œ ํ•˜์œ„ ์„ ํƒ๋ฌผ ์„ ํƒ๋„ ๋น„์Šทํ•˜์ง€๋งŒ ๊ทธ๋ฃน์€ ์œ ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํŒŒํ•œ๋‹ค. ๊ทธ๋ฃน์€ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ์—์„œ ์ค‘์š”ํ•œ ๊ทœ์น™์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ํ˜• ์—ฐ์‚ฐ์ž๋Š” ๊ทธ๋ฃน์•ˆ์—์„œ ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ์˜ ์ˆซ์žํ˜• ์ƒ‰์ธ์— ์˜์กดํ•œ๋‹ค.

# selection.select(selector)

ํ•ด๋‹น ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ธ์ž๋กœ ๋„˜๊ธด selector ๋ฌธ์ž์—ด๊ณผ ๋ถ€ํ•ฉ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ํ•ด๋‹น ์„ ํƒ๋ฌผ์— ์ง€์ •ํ•œ ์…€๋ ‰ํ„ฐ์— ํ•ด๋‹นํ•œ๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์—์„œ ํ•ด๋‹น ์ƒ‰์ธ์˜ ์›์†Œ๋Š” null์ด๋‹ค. D3์˜ ์—ฐ์‚ฐ์ž((data๋Š” ์˜ˆ์™ธ)๋Š” null ์›์†Œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฌด์‹œํ•œ๋‹ค. ์ด๋•๋ถ„์— ์กด์žฌํ•˜๋Š” ์„ ํƒ๋ฌผ์˜ ์ƒ‰์ธ์ด ์œ ์ง€๋œ๋‹ค.ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ์— ๊ด€๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ˜ํ™˜๋˜๋Š” ํ•˜์œ„์„ ํƒ๋ฌผ์— ์ƒ์†๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์™€ ์—ฎ์ธ๋‹ค. ์…€๋ ‰ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ๋ฌธ์„œ์ƒ์—์„œ ์ฒซ๋ฒˆ์งธ๋กœ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋งŒ ์„ ํƒ๋œ๋‹ค.

selector ๋Š” ๋ฌธ์„œ์š”์†Œ๋‚˜ null๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. null์€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํ•จ์ˆ˜ selector ๋Š” ์ „๋‹ฌ์ธ์ž๋กœ ํ•ด๋‹น ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i๋ฅผ ๊ฐ–๊ณ  this๊ฐ€ ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋กœ์„œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

# selection.selectAll(selector)

ํ•ด๋‹น ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์— ๋Œ€ํ•ด์„œ ์ „๋‹ฌ์ธ์ž selector ๋ฌธ์ž์—ด์— ๋ถ€ํ•ฉํ•˜๋Š” ์ž์† ๋ฌธ์„œ์š”์†Œ ๋ชจ๋‘๋ฅผ ์„ ํƒํ•œ๋‹ค. ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์€ ํ•ด์ƒ ์„ ํƒ๋ฌผ์˜ ์กฐ์ƒ ๋…ธ๋“œ๋กœ ๊ทธ๋ฃนํ™” ๋œ๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ์„ ํƒ๋ฌผ์— ์ง€์ •ํ•œ ์…€๋ ‰ํ„ฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์˜ ํ•ด๋‹น ์ƒ‰์ธ ๊ทธ๋ฃน์€ ํ…… ๋น„๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์ธ ํ•˜์œ„์„ ํƒ๋ฌผ์€ ํ•ด๋‹น ์„ ํƒ๋ฌผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค. data ๊ฐ’์„ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ–ˆ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์กฐ์ƒ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ d์™€ ๊ทธ๋ฃน ์ƒ‰์ธ๊ฐ’ i์— ๊ธฐ๋ฐ˜ํ•ด์•ผ ํ•œ๋‹ค.

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

d3.select("body").selectAll("div")

๊ฐ ๊ทธ๋ฃนํ•‘ ๋ฐฐ์—ด์˜ parentNode ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ ๊ทธ๋ฃนํ•‘์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. selecton[0].parentNode์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

์ „๋‹ฌ์ธ์ž selector ๋Š” ๋ฌธ์„œ์š”์†Œ๋‚˜ NodeList ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ถ€ํ•ฉํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉด ๋นˆ ๋ฐฐ์—ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ๋œ๋‹ค. ํ•จ์ˆ˜ selector ๋Š” ์ „๋‹ฌ์ธ์ž๋กœ ํ•ด๋‹น ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i๋ฅผ ๊ฐ–๊ณ  this๊ฐ€ ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋กœ์„œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

Control

For advanced usage, D3 has a few additional operators for custom control flow.

D3๋Š” ์‚ฌ์šฉํŽธ์˜๋ฅผ ์œ„ํ•ด์„œ ํ๋ฆ„์ œ์–ด๋ฅผ ์œ„ํ•œ ๋ช‡๊ฐ€์ง€ ํ™•์žฅ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

# selection.each(function)

ํ•ด๋‹น ์„ ํƒ๋ฌผ์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ ๋ณ„๋กœ ์ „๋‹ฌ์ธ์ž function ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ์ด๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ž ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ d3.select(this)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์—ฐ์‚ฐ์ž๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์„ ํƒ๋ฌผ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# selection.call(function[, argumentsโ€ฆ])

arguments ๋ฅผ ๊ฐ€์ง„ function ๋ฅผ ํ•ด๋‹น ์„ ํƒ๋ฌผ์—์„œ ํ˜ธ์ถœํ•œ๋‹ค. call ์—ฐ์‚ฐ์ž๋Š” function ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ํ•ด๋‹น ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. call ์—ฐ์‚ฐ์ž๋Š” ์ˆ˜๋™์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ๊ณณ์— ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์†์„ฑ์„ ์ง€์ •ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ ๋‹ค.

function foo(selection) {
  selection
      .attr("name1", "value1")
      .attr("name2", "value2");
}

์ด์ œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๊ณ ,

foo(d3.selectAll("div"))

๋™์ผํ•˜๊ฒŒ ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋œ๋‹ค.

d3.selectAll("div").call(foo);

ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ this ์ปจํ…์ŠคํŠธ๋„ ํ•ด๋‹น ์„ ํƒ๋ฌผ์ด๋‹ค. ์ด ์—ฐ์‚ฐ์ž์™€ ์ฒซ ๋ฒˆ์งธ ์ „๋‹ฌ์ธ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฉด์ด ์ข€ ์žˆ์–ด์„œ ์ฐจํ›„์— ๊ฐœ์„ ๋  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

# selection.empty()

ํ•ด๋‹น ์„ ํƒ๋ฌผ์ด ๋น„์–ด์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. null์ด ์•„๋‹Œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ์„ ํƒ๋ฌผ์€ ๋น„์–ด์žˆ๋‹ค๊ณ  ๋ณธ๋‹ค.

# selection.node()

ํ•ด๋‹น ์„ ํƒ๋ฌผ์—์„œ null์ด ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์„ ํƒ๋ฌผ์ด ๋น„์–ด์žˆ์œผ๋ฉด null๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Extension

# d3.selection()

์ตœ์ƒ์œ„(root) ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. d3.select(document.documentElement)์™€ ๊ฐ™๋‹ค. ๊ฐ์ฒด๊ฐ€ ์„ ํƒ๋ฌผ์ธ์ง€(o instanceof d3.selection)๋ฅผ ํ™•์ธํ•  ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์„ ํƒ๋ฌผ์˜ prototype์œผ๋กœ ์‹ ๊ทœ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ์ฒดํฌ๋ฐ•์Šค์˜ "checked" ํ”„๋กœํผํ‹ฐ๋ฅผ ํŽธํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ธฐ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

d3.selection.prototype.checked = function(value) {
  return arguments.length < 1
      ? this.property("checked")
      : this.property("checked", value);
};
โš ๏ธ **GitHub.com Fallback** โš ๏ธ