Swift/SwiftUI

[SwiftUI] EnvironmentObject

yeggrrr๐Ÿผ 2024. 10. 2. 16:04
728x90

๊ณต์‹๋ฌธ์„œ

EnvironmentObject
A Property wrapper type of an observable object that a parent or ancestor view supplies.

→ ๋ถ€๋ชจ ํ˜น์€ ์กฐ์ƒ ๋ทฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” observable object์˜ propery wrapper ํƒ€์ž…

OverView
An environment object invalidates the current view whenever the observable object that conforms to Observable Object changes.
environment object๋Š” observable object์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ˜„์žฌ ๋ทฐ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.
(์ด ๋ง์€ ํ˜„์žฌ ๋ทฐ์— ๋ณ€ํ™”๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ค€๋‹ค๋Š” ์˜๋ฏธ ๊ฐ™์•„์š”.)

If you declare a property as an environment object, be sure to set a corresponding model object on an ancestor view by calling its environmentObject( :) modifier.
๋งŒ์•ฝ ๋‹น์‹ ์ด environment object๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธํ•œ๋‹ค๋ฉด, environmentObject( :) ๋ชจ๋””ํŒŒ์ด์–ด๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์กฐ์ƒ ๋ทฐ(์ƒ์œ„ ๋ทฐ)์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
(environmentObject( :) - https://developer.apple.com/documentation/swiftui/view/environmentobject(_:))

Note
If your observable object conforms to the Observable protocol, use Environment instead of Environment Object and set the model object in an ancestor view by calling its environmnet( :) or environment( : : ) modifier.
๋งŒ์•ฝ ๋‹น์‹ ์˜ observable object๊ฐ€ Observable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, Environment Object ๋Œ€์‹  Environment๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , environment( :) ํ˜น์€ environment(: :) ๋ชจ๋””ํŒŒ์ด์–ด๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์กฐ์ƒ ๋ทฐ(์ƒ์œ„ ๋ทฐ)์—์„œ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


์œ„ ๋‚ด์šฉ์€ Swift ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. (๋ฒˆ์—ญ์ด ์กฐ๊ธˆ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ™„)


์ •๋ฆฌ

๊ทธ๋ž˜์„œ EnvironmentObject์ด ์–ด๋–ค ๋…€์„์ธ์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด!

์•ฑ์—์„œ ๋‹ค์–‘ํ•œ ๋ทฐ์—์„œ ๊ณต์œ ๋˜์–ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ์— EnvironmentObject๋ผ๋Š” property wrapper๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์ €๋Š” ์ด์ „์— ์ง€๋„ ์•ฑ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ํ˜„์žฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด EnvironmentOjbect๋ฅผ ํ™œ์šฉํ–ˆ์—ˆ์–ด์š”.)

๋ณดํ†ต SwiftUI์—์„œ ํ•˜๋‚˜์˜ ๋ทฐ์—์„œ ๋‹ค๋ฅธ ๋ทฐ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ, ๊ฐ’ ์ „๋‹ฌ ํ˜น์€ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ด์„œ ์ „๋‹ฌ ์ „๋‹ฌ ์ „๋‹ฌ.. ํ•˜๋‹ค๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง€๊ธฐ๋„ ํ•˜๊ณ , ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. 

์ด๋Ÿฐ ๊ฒฝ์šฐ! EnvironmentObject๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•  ํ•„์š” ์—†์ด, ์ƒ์œ„ ๋ทฐ์—์„œ ํ•œ ๋ฒˆ๋งŒ! @EnvironmentObject๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด, ํ•˜์œ„ ๋ทฐ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! (๋ณ„๋„์˜ ์ „๋‹ฌ ๊ณผ์ •X)

์ด๋ ‡๊ฒŒ EnvironmentObject๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋ฉด์„œ, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๋„ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.


"์Œ.. ๊ทธ๋Ÿฌ๋ฉด.. ๊ทธ๋ƒฅ EnvironmentObject๋ฅผ ๋‹ค ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋„ˆ๋ฌด ํŽธ๋ฆฌํ•œ๋ฐ???"๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ์ˆ˜ ์žˆ์„ํ…๋ฐ์š”!


๋˜ ๋‹ค๋ฅธ ์ธก๋ฉด์—์„œ ํ•œ ๋ฒˆ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!
(์›๋ž˜ ์žฅ์ ์ด ์žˆ์œผ๋ฉด, ๋‹จ์ ๋„ ์žˆ๊ธฐ ๋งˆ๋ จ์ž…๋‹ˆ๋‹ค..ใ…Žใ…Ž ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒ๋‹จํ•ด์„œ ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.)

์šฐ์„  EnvironmentObject๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ๋ณ€๊ฒฝ๋˜๋Š”์ง€, ์–ด๋–ค ๋ทฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ถ”์ ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ดœ์ฐฎ์„์ง€๋ชฐ๋ผ๋„, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์•…ํ•˜๋Š”๋ฐ ํž˜๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

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

๊ทธ๋ฆฌ๊ณ  ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ์žฅ๋‹จ์ ์ฒ˜๋Ÿผ @EnvironmentObject๋Š” ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๋‚จ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด,
์•ฑ์˜ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 


๋งˆ๋ฌด๋ฆฌ

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

๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ, ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ @EnvironmentObject๋กœ ์ „๋‹ฌํ•˜๊ณ ,
๊ทธ ์™ธ์—๋Š” @StateObject, @Binding, @ObservedObject ๋“ฑ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.โ˜บ๏ธ


 

728x90