WPF Socketํ†ต์‹ ๊ณผ InotifypropertyChanged

์•ˆ๋…•ํ•˜์„ธ์š” Socketํ†ต์‹ ๊ณผ InotifypropertyChanged ์†์„ฑ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Socket ํ†ต์‹ ์—๋Œ€ํ•ด ์•„์ง ๊ณต๋ถ€์ค‘์ด๊ณ  ์‹ค๋ ฅ์ด ๋งŽ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์ €๊ธฐ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ๊ณต๋ถ€์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณต๋ถ€ํ•˜๋˜ ์ค‘ InotifypropertyChanged์†์„ฑ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ์ด ์†์„ฑ์ด ์–ด๋– ํ•œ ์—ญํ• ์„ํ•˜๋Š”์ง€๋Š” ์ž์„ธํžˆ๋Š” ๋ชจ๋ฅด์ง€๋งŒ
์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • (์—”ํ„ฐํ‚ค๋ฅผ ์ž…๋ ฅํ–ˆ์„๋•Œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ์ด๋ฒคํŠธ์˜ ์†์„ฑ๋„ ์กด์žฌํ•˜๋‚˜์š”?)

์•Œ๊ณ ์‹ถ์€ ๊ฒƒ
INotifyPropertyChanged ์†์„ฑ์— ๋Œ€ํ•ด ์ข€ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„ ์งˆ์˜ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์œ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” INotifyPropertyChanged
๋™์ž‘๋ฐฉ์‹?( )
์†์„ฑ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์‹œ๋ฉด ๋„ˆ๋ฌด๋‚˜ ๊ฐ์‚ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž‘์„ฑํ•œ ํ”„๋กœ์ ํŠธ์˜ zipํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
image

3๊ฐœ์˜ ์ข‹์•„์š”

์›ํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด Send ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, Send ๋ฒ„ํŠผ ์ขŒ์ธก์— ์œ„์น˜ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜๋Š” ํ…์ŠคํŠธ ๋ฐ•์Šค๋ฅผ ๋น„์šฐ๊ณ ์ž ํ•˜์‹œ๋Š” ๊ฒŒ ๋งž๋‚˜์š”?

๋งž๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ ์Šต๋‹ˆ๋‹ค.


INotifyPropertyChanged๋Š” ๋ฌด์—‡์ธ๊ฐ€?
INotifyPropertyChanged๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. INotifyPropertyChanged ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” PropertyChanged๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์™ธ๋ถ€์—์„œ ์ด ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•ด ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WPF์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์—์„œ INotifyPropertyChanged์˜ ์—ญํ• 
WPF์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‹œ, PropertyChanged ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ๊ตฌ๋…ํ•˜๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ PropertyChanged๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ EventArgs๋กœ ๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ์ด๋ฆ„์„ ๋ฐ›๊ณ , ๋ณ€๊ฒฝ๋œ ์†์„ฑ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ์†์„ฑ๊ณผ ๋ฐ”์ธ๋”ฉ๋œ DependencyProperty์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ฐธ๊ณ : INotifyPropertyChanged ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ž์ฒด๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ฐ•ํ•œ ์ฐธ์กฐ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์—…๋ฐ์ดํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ฝ”๋“œ์—์„œ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ณผ์ •
์ž‘์„ฑ์ž๋‹˜๊ป˜์„œ ์˜ฌ๋ฆฌ์‹  ์†Œ์Šค์—์„œ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค(TextBox์˜ Text ์†์„ฑ)์— ๋ฐ”์ธ๋”ฉ๋œ ์†์„ฑ์€ msg(msg1)์ด๋ฏ€๋กœ, TextBox์˜ Text ์†์„ฑ์˜ ๊ฐ’์€ msg ์†์„ฑ์˜ ๊ฐ’์„, msg ์†์„ฑ์€ ํ•„๋“œ ๋ณ€์ˆ˜ _txtInput์˜ ๊ฐ’์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, msg ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์•„๋ž˜์™€ ๊ฐ™์€ ์ ˆ์ฐจ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. _txtInput ๊ฐ’ ๋ณ€๊ฒฝ
  2. ์—…๋ฐ์ดํŠธ๋ฅผ ์›ํ•˜๋Š” ์‹œ์ (BtnSendAll_Clilck)์— PropertyChanged ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด(๋ณ€๊ฒฝ ์†์„ฑ ์ด๋ฆ„: msg)
  3. msg์˜ Binding Target(TextBox.Text)์—์„œ msg์˜ ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด msg์˜ getter ํ˜ธ์ถœ
  4. getter์—์„œ _txtInput ๊ฐ’ ๋ฐ˜ํ™˜
  5. Binding Target(TextBox.Text)์—์„œ _txtInput ๊ฐ’์„ ๋ฐ˜์˜

์ผ๋ฐ˜์ ์œผ๋กœ๋Š”, ์ฒจ๋ถ€ํ•˜์‹  ์ƒ˜ํ”Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•„๋“œ(_txtInput)์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์†์„ฑ(msg)์— ๋Œ€ํ•œ PropertyChanged ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์†Œ๋“œ(NotifyPropertyChanged(โ€œmsg1โ€))๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š”, ํ•„๋“œ๋Š” ๋‹จ์ง€ ์†์„ฑ์˜ getter setter ๊ตฌํ˜„์„ ์œ„ํ•œ ์žฅ์น˜ ์ •๋„๋กœ๋งŒ ์ด์šฉํ•˜๊ณ  ์†์„ฑ์˜ setter์—์„œ ๊ฐ’ ๋ณ€๊ฒฝ๊ณผ PropertyChanged ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ฆ๊ฒจ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. msg ์†์„ฑ์— ๊ฐ’ ํ• ๋‹น(msg = string.Empty ๋“ฑ)
  2. msg setter ํ˜ธ์ถœ
  3. _txtInput ๊ฐ’ ๋ณ€๊ฒฝ
  4. msg์— ๋Œ€ํ•œ PropertyChanged ์ด๋ฒคํŠธ ๋ฐœ์ƒ
  5. msg์˜ Binding Target(TextBox.Text)์—์„œ msg์˜ ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด msg์˜ getter ํ˜ธ์ถœ
  6. getter์—์„œ _txtInput ๊ฐ’ ๋ฐ˜ํ™˜
  7. Binding Target(TextBox.Text)์—์„œ _txtInput ๊ฐ’์„ ๋ฐ˜์˜

์ฒ˜์Œ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ ๋œ ์ด์œ 

  1. Binding Source์ธ msg ์†์„ฑ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์„œ
  2. msg ์†์„ฑ์— ๋Œ€ํ•œ PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„์„œ

msg์˜ ๊ฐ’์ด null์ธ์ง€, empty์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. msg ์†์„ฑ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ(์ •ํ™•ํžˆ๋Š” setter๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ) PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ๋ฐ”์ธ๋”ฉ๋œ TextBox์—์„œ ์†์„ฑ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด ๋ณ€๊ฒฝ ๋ถ€๋ถ„์„ ์—…๋ฐ์ดํŠธ ํ•  ํ…๋ฐ, setter๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋‹ˆ ์—…๋ฐ์ดํŠธ ์—ญ์‹œ ๋˜์ง€ ์•Š๋Š” ๊ฑฐ์ฃ . ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ๋Š” BtnSendAll_Clilck ๋ฉ”์†Œ๋“œ์—์„œ msg1 = string.Empty โ† ์š” ๋ผ์ธ์„ ํ†ตํ•ด msg1์˜ setter๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์†์„ฑ ๊ฐ’(์ •ํ™•ํžˆ๋Š” getter์—์„œ ์ฐธ์กฐํ•˜๋Š” _txtInput ํ•„๋“œ์˜ ๊ฐ’)๋„ ๋ณ€๊ฒฝ๋˜๊ณ , PropertyChanged ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์†์„ฑ ๊ฐ’ ๋ณ€๊ฒฝ๋„ ์•Œ๋ฆฌ๋‹ˆ๊นŒ ์›ํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด ๊ตฌํ˜„๋œ ๊ฒƒ์ด๊ตฌ์š”.

๊ฒฐ๋ก 

  1. ์ฒซ ๋ฒˆ์งธ ์ƒ˜ํ”Œ์ฝ”๋“œ์—์„œ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค๊ฐ€ ๋น„์›Œ์ง€์ง€ ์•Š์€ ๊ฒƒ์€ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค์— ๋ฐ”์ธ๋”ฉ๋œ msg ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€๋„ ์•Š์•˜๊ณ , msg ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋„ ์•Š์•„์„œ ๊ทธ๋ ‡๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ์ƒ˜ํ”Œ์ฝ”๋“œ์—์„œ๋Š” BtnSendAll_Clilck ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ msg1 ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ๋„ ํ–ˆ๊ณ , ํ• ๋‹น ๊ณผ์ •์—์„œ PropertyChanged ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ด์„œ View์— ๋ฐ˜์˜๋œ ๊ฒƒ์ด๋‹ค.
  3. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‹œ์—๋Š” ์†์„ฑ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ , ๊ทธ ๋ฐฉ๋ฒ•์€ ๊ฐ€๊ธ‰์ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๊ฐ์•ˆํ•˜๋ฉด ์‚ฌ์‹ค์ƒ ๋ฐ˜๊ฐ•์ œ๋กœ) INotifyPropertyChanged ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ์—”ํ„ฐ ํ‚ค ์ž…๋ ฅ ์‹œ ์ „์†ก ๊ด€๋ จ ๋ถ€๋ถ„์€ wpf keydown event ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด ๋ณด์‹œ๋ฉด ๊ธˆ๋ฐฉ ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™๋„ค์š”. ์—„๊ฒฉํ•œ MVVM ํŒจํ„ด ์ ์šฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ฝ”๋“œ ๋น„ํ•˜์ธ๋“œ๋ฅผ ์ ์ ˆํžˆ ์ด์šฉํ•˜๋Š” ์„ ์—์„œ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
7๊ฐœ์˜ ์ข‹์•„์š”

์ž์„ธํ•œ ์„ค๋ช…๊ณผ ์นœ์ ˆํ•˜๊ฒŒ ๋‹ต๋ณ€์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๋‹ต๋ณ€์ฃผ์‹  ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ•˜๋‚˜์”ฉ ๋ฐฐ์›Œ๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~

2๊ฐœ์˜ ์ข‹์•„์š”