โœ๏ธ TIL

[ TIL ] ์•„ํ‚คํ…์ฒ˜(Architecture)์™€ ๋””์ž์ธ ํŒจํ„ด / 24๋…„ 4์›” 30์ผ

EarthSea 2024. 4. 30. 20:28

์ถœ์ฒ˜ : ํ•€ํ„ฐ๋ ˆ์ŠคํŠธ

์˜ค๋Š˜์€ ์•„ํ‚คํ…์ฒ˜์™€ ๋””์ž์ธํŒจํ„ด์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ‰์†Œ์— ์•„ํ‚คํ…์ฒ˜์™€ ๋””์ž์ธํŒจํ„ด ์šฉ์–ด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ฐœ๋…์ด ์žกํ˜€์žˆ์ง€ ์•Š์•˜๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ,

์˜ค๋Š˜ ๋น„๋กœ์†Œ ๋‘ ๊ฐ€์ง€์˜ ๊ฐœ๋…์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด์„œ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”!โœจ

 

 

์•„ํ‚คํ…์ฒ˜

์ œ๊ฐ€ ์ดํ•ดํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์‹œ์Šคํ…œ์˜ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ(๋ชจ์Šต)๋ฅผ ์ •ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์‹œ์Šคํ…œ ์•ˆ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์–ด๋–ค ์‹์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์œ„์น˜ํ•  ๊ฒƒ์ธ์ง€, ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์„ ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•  ๋•Œ ์ง€์นจ์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์ด๋‚˜ ์„ฑ๋Šฅ, ๋ณด์•ˆ, ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ™์€ ํ•ด๊ฒฐ์ฑ…๊นŒ์ง€ ์ œ๊ณตํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์ €๋Š” ์ด๋•Œ๊นŒ์ง€ MVCํŒจํ„ด์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ด์„œ ์•ฑ์„ ๊ฐœ๋ฐœํ•ด ์™”๋˜ ๊ฒƒ ๊ฐ™์•„์š”! ์˜ค๋Š˜์€ MVVM ์•„ํ‚คํ…์ฒ˜๊นŒ์ง€ ๋ฐฐ์›Œ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

 

MVC ์•„ํ‚คํ…์ฒ˜

MVC ์•„ํ‚คํ…์ฒ˜๋Š” Model, View, Controller์˜ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜์˜ˆ์š”. Controller๊ฐ€ Model๊ณผ View์˜ ์ค‘๊ฐ„๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ด์ฃผ๋ฉด์„œ Model๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๊ณ , View์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์—ญํ• ๋“ค์— ๋Œ€ํ•ด์„œ ๋ด…์‹œ๋‹ค.

 

Model

Model์€ ๋ฐ์ดํ„ฐ์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์ฃผ๋กœ ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค ๊ตฌ์กฐ๋กœ ๋‚˜ํƒ€๋‚ด์–ด์ง€๊ณ , ์ฝ”์–ด๋ฐ์ดํ„ฐ๋‚˜ API ํ†ต์‹ ์„ ํ†ตํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ๋•Œ๋„ ์ด Model์ด ๊ด€์—ฌํ•ฉ๋‹ˆ๋‹ค.

 

View

View๋Š” UI๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ input์„ ๋ฐ›์•„์„œ Controller์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

Controller

Controller๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ Model๊ณผ View์™€์˜ ์ง•๊ฒ€๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜๋ฉด์„œ ๋‘ ๊ตฌ์กฐ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—์„œ Controller์—๊ฒŒ ๋ฐ›์€ input๊ฐ’์„ Model์—๊ฒŒ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”! Swift์—์„œ๋Š” ViewController๊ฐ€ ์ด Controller์˜ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

MVC ํŒจํ„ด์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

์šฐ์„  ์žฅ์ ์€ Cocoa ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ํ˜ธํ™˜์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”! ๋˜ํ•œ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ผ ์ฒ˜์Œ ์ ‘ํ•˜๊ธฐ์—๋„ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค๋Š” ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋‹จ์ ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ์ˆ˜๋ก ViewController๊ฐ€ ๋งŽ์ด ๋ฌด๊ฑฐ์›Œ์ง‘๋‹ˆ๋‹ค. View๋‚˜ Model์— ๋น„ํ•ด ViewController์˜ ์—ญํ• ์ด ๋งŽ์•„์ ธ์„œ ๋ณต์žกํ•ด์ง€๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

 

 

 

 

MVVM ์•„ํ‚คํ…์ฒ˜

MVVM ์•„ํ‚คํ…์ฒ˜๋Š” Model View ViewModel๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค MVVM ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์ „๊นŒ์ง€๋Š” MVVM์ด๋ผ์„œ 4๊ฐœ์˜ ๊ตฌ์กฐ๋กœ ๋ถ„๋ฆฌ๊ฐ€ ๋œ ์•„ํ‚คํ…์ฒ˜์ธ์ค„ ์•Œ์•˜์–ด์š”!ใ…‹ใ…‹ ํ•˜์ง€๋งŒ ์˜ค๋Š˜ VM์ด ํ•˜๋‚˜์˜ ๊ตฌ์กฐ์˜€๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. UI์™€ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ ๊ตฌ์กฐ์ด๋”๋ผ๊ณ ์š”! ์ฒ˜์Œ์—” ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ๋ณดํ†ต UILabel์˜ ํ…์ŠคํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ViewController์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ( ํ…์ŠคํŠธ์— ๋“ค์–ด๊ฐˆ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค๋˜์ง€, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๋นผ์˜จ๋‹ค๋˜์ง€ ) ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ( ๊ทธ ๊ฐ’์„ Label์˜ text์— ์ง€์ • )์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ž์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค๋กœ ๋–ผ์–ด๋‚ด์„œ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

 

Model

๋ชจ๋ธ์˜ ์œ„์˜ MVC ํŒจํ„ด์˜ Model๊ณผ ๊ฐ™์€ ์—ญํ• ์ž…๋‹ˆ๋‹ค.

 

ViewModel

ViewModel์€ Model๊ณผ View์˜ ์ค‘๊ฐ„ ์ง•๊ฒ€๋‹ค๋ฆฌ ์—ญํ• ๋กœ View์—์„œ ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. MVC์—์„œ๋Š” View๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ Controller์—๊ฒŒ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด, MVVM์—์„œ๋Š” ์ด ViewModel์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅด ๋ฐ›์•„์„œ Model์—๊ฒŒ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. View์— ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋ธ์„ ์ž‘์„ฑํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

View

View๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ์™€ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค! ViewModel์—์„œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

 

MVVM์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

MVVM์˜ ์žฅ์ ์€ ์•„์ง ์‚ฌ์šฉํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ, View์™€ View๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋‹ค ๋ณด๋‹ˆ ์—ญํ• ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค. MVC์™€๋Š” ๋‹ฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ํŽธํ•ฉ๋‹ˆ๋‹ค.

 

๋‹จ์ ์€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. MVC ํŒจํ„ด์€ ์ง๊ด€์ ์ด๋ผ ์•„~ ์ด๊ฒŒ Model, View, Controller์ด๊ตฌ๋‚˜ ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜!๋ผ๊ณ  ์ƒ๊ฐ์ด ๋˜๋Š”๋ฐ, ์ง์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„์ง€์–ด์„œ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ ViewModel์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„์„ ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”!

 

 

 

๋””์ž์ธ ํŒจํ„ด

๋””์ž์ธ ํŒจํ„ด์€ ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด๋ฅผ ๋””์ž์ธํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ๋ชจ๋“ˆ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋ฐฐ์šด ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ๋Š” Delegate Pattern, Observer Pattern, Singleton Pattern ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ •์ฒ˜๊ธฐ ์‹œํ—˜์น  ๋•Œ ์™ธ์› ๋˜ ๋””์ž์ธ ํŒจํ„ด..ใ…‹ใ…‹ ๊ทธ๋•Œ๋Š” ์ •๋ง ์šฉ์–ด๋ž‘ ์–ด๋–ค ๊ตฌ์กฐ์ธ์ง€๋งŒ ๋‹ฌ๋‹ฌ ์™ธ์› ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ง์ ‘ ์จ๋ณด๋ฉด์„œ Swift๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ˆ๊น ํ™•! ์™€๋‹ฟ๋”๋ผ๊ณ ์š”~! ์ƒ๊ตฌํ–‰/์ถ”๋นŒํŒฉํ”„์‹ฑ/์–ด๋ธŒ์ปด๋ฐํผํ”Œํ”„ ์ด๋ ‡๊ฒŒ ์™ธ์› ์—ˆ๋Š”๋ฐ..ใ…‹ใ…‹ใ…‹ใ…‹

์ž์„ธํ•œ ๋””์ž์ธ ํŒจํ„ด ํฌ์ŠคํŒ…์€ ํ•ด๋‹น ์˜ˆ์‹œ๋“ค์„ ์ง์ ‘ ์จ๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ข€ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค์‹œ ํฌ์ŠคํŒ…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์•„ํ‚คํ…์ฒ˜์™€ ๋””์ž์ธํŒจํ„ด์˜ ์ฐจ์ด

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

 

 

 

 

๋Œ“๊ธ€์ˆ˜4