Apple/WWDC

SwiftUI의 Observation 알아보기 (Discover Observation in SwiftUI) - WWDC23

lgvv 2026. 5. 16. 01:17

SwiftUI의 Observation 알아보기

 

SwiftUI에서 마법적인 기능에 대해서 소개할 것.

Observation은 SwiftUI의 뷰가 반응형으로 동작할 수 있도록 도와줌.

 

 

목차

  • What is Observation
  • SwiftUI property wrappers
    • 유용한 프로퍼티래퍼 알아볼 것
  • Advanced uses
    • Observable의 고급 사용 사례
  • ObservableObject와 새로운 @Observable 매크로로 코드를 업데이트 하는 예시

 

Observation은 프로퍼티의 변화를 추적하는 Swift의 신기능.

평범한 Swift의 타입을 매크로의 형태로 바꿔둠.

 

Observable을 추가하므로써 UI가 데이터 모델의 변화에 대응할 수 있음.

Swift의 새로운 매크로 시스템 덕분에 Swift 5.9에서는 모델이 더 단순해짐.

 

@Observable은 Swift 컴파일러에 명령을 내려서 우리가 작성한 코드를 확장된 Observable 타입으로 바꿔둠.

Observable 타입을 통해 SwiftUI 뷰를 작동시킬 수 있으며, 다른 프로퍼티래퍼가 없어도 됨.

 

SwiftUI는 body가 평가될 때 모든 프로퍼티의 모든 접근을 추적하고, 이 정보를 이용해 특정 인스턴스에서 프로퍼티에 다음 변화가 언제 일어날지를 예측함.

 

Observable의 장점은 모델에서 order가 변경되면 그 영역만 뷰가 무효화되며, donuts에는 영향을 주지 않음.

또한 연산 프로퍼티를 사용했을 때도 동일한 규칙으로 동작함.

 

 

 


@Observable 매크로를 사용하면 타입이 확장되어서 Observation을 지원할 수 있게 됨

SwiftUI는 프로퍼티 접근을 추적할 수 있고, Observation에서 다음 프로퍼티가 언제 변할지 관찰할 수 있음.

추적이 가능해지면 프로퍼티에 변화가 생겼을 때, UI를 업데이트 할 수 있음.

UI는 View의 body를 재계산만 하면됨.

 

이 부분에서 성능이 엄청나게 크게 향상되었음.

 

 

SwiftUI의 핵심적인 프로퍼티 래퍼 3개지는 State, Environment, Bindable이 있음.

SwiftUI Observable 타입과의 인터페이스에서 프로퍼티 래퍼가 필요 없이도 사용하는 예제는 설명해서, 이번에는 필요하지 않은 부분을 알아볼 것.

 


첫 번째로는 @State가 있음.

모델 안에 View 전용 상태를 저장해야 할 때 사용 @State 프로퍼티를 사용.

donutToAdd 프로퍼티는 뷰의 생명주기 동안에만 유지됨.

 

 

두 번째로는 Environment로 각 값을 어디서든 접근할 수 있도록 함.

여러 곳에서 접근 가능하도록 하여, Observable 타입이 Environment에 아주 잘 맞음.

접근을 기반으로 업데이트가 생성되기 때문.

 

 

 

@Bindable은 가장 최근에 추가된 프로퍼티 래퍼로 굉장히 가벼움.

해당 타입으로부터 바인딩이 생성되게 하는 기능만 존재.

 

 

SwiftUI에서 프로퍼티 래퍼를 사용할 때 이렇게 위와 같은 기준을 가지고 사용하면 됨.

 

 

SwiftUI는 필드에 일어나는 접근을 인스턴스마다 추적하기 때문에 배열이나 옵셔널 뿐만 아니라 Observable에 포함된 그 어떤 타입이라도 사용할 수 있음.

 

 

사용하는 프로퍼티가 업데이트 된다면 View도 업데이트 됨.

다만, 연산 프로퍼티에 저장 프로퍼티가 없다면 Observation에서 사용하기 전에 두 단계를 더 거쳐야 함.

관찰 대상이 된 프로퍼티가 Observable 타입에 저장된 구성에 의해 변경되지 않았을 때만 필요한 조치임.

 

이 경우에는 프로퍼티에 접근과 변경이 언제 이루어졌는지만 Observation에 전달되면 됨.

 

혹시라도 더 고급 기능이 필요한 경우에는 스스로 Observation을 만들어서 사용할 수 있음.

프로퍼티에 keyPath를 통해 언제 읽혔고, 언제 바뀌었는지만 통지해주면 되기 때문.

즉, 특정 경우에는 위의 이미지와 같이 접근 포인트를 수동으로 고칠 수 있다는 의미

 

 

SwiftUI는 구성의 변화를 바로 인식하는데, 프로퍼티 접근을 바탕으로 Observable 타입을 추적하기 때문

다른 저장 프로퍼티에서 연산 프로퍼티가 구성되어도 Observation이 잘 작동한다는 의미.

하지만 드물게 Observation이 작동하지 않는 경우에는 사용자가 직접 Observation을 사용해 수동으로 접근 및 변형 플래그 호출을 추가할 수 있음.

 

 

ObservableObject에서 @Observable로 넘어갈 때는 이렇게 넘어갈 수 있음.

 

또한 기존에는 View에 프로퍼티 래퍼가 많았음

@ObservedObject의 경우에는 일부는 사라지고 나머지는 바인딩되어 새로운 @Bindable로 변경되었음.

@EnvironmentObject 래퍼는 @Environment로 변경됨.

 

@ObservedObject에서 @Observable로 넘어가려면 대부분 기존 키워드를 삭제하거나 세 가지의 프로퍼티 래퍼로 단순화 하기만 하면 됨. (@State, @Environment, @Bindable)

 

 

 

 

 

 

 

(참고)

https://www.youtube.com/watch?v=W6FF70H_GwI