iOS 개발을 하다 보면 특정 객체의 프로퍼티 값이 변경될 때 이를 실시간으로 감지하고 대응해야 하는 상황이 빈번하게 발생한다.
이러한 요구사항을 해결하기 위해 Apple은 Key-Value Observing (KVO)이라는 강력한 메커니즘을 제공한다.
KVO는 Objective-C 시절부터 Cocoa 프레임워크의 핵심적인 부분이었으며, Swift에서도 여전히 중요한 역할을 수행한다.
KVO는 객체의 프로퍼티 변경 사항을 다른 객체에 알리기 위한 디자인 패턴이다.
상태 변화를 추적하기 위해 별도의 프로토콜을 구현하거나 Delegate를 설정할 필요 없이, 시스템 수준에서 프로퍼티의 변화를 관찰할 수 있게 해준다.
KVO는 Key-Value Coding (KVC)을 기반으로 동작한다. 관찰 대상이 되는 객체의 프로퍼티가 변경되면, 시스템은 해당 객체에 등록된 관찰자(Observer)들에게 알림을 보낸다.
Swift는 정적 언어이기 때문에, 런타임에 프로퍼티를 감시하는 KVO를 사용하려면 몇 가지 제약 사항이 따른다.
관찰 대상 객체는 반드시 NSObject를 상속받아야 한다.
관찰하고자 하는 프로퍼티에는 @objc 어트리뷰트와 dynamic 수정자를 붙여야 한다.
dynamic은 해당 프로퍼티에 대한 접근을 Objective-C 런타임의 동적 디스패치 방식으로 처리하도록 강제한다.
iOS 11 이후부터는 클로저 기반의 새로운 KVO API가 도입되어 관리가 훨씬 수월해졌다.
NSKeyValueObservation 객체를 통해 관찰 수명을 관리한다.
관찰자가 해제될 때 자동으로 관찰이 중단되므로 메모리 누수 위험이 줄어들었다.
KVO는 주로 우리가 직접 수정할 수 없는 외부 라이브러리나 프레임워크의 객체(예: AVPlayer, WKWebView 등)를 감시할 때 매우 유용하다.
@Published나 @State 같은 데이터 바인딩 형식이 KVO의 역할을 대체하고 있다.KVO는 객체의 프로퍼티 변경을 감시하고 알림을 받는 메커니즘이다.
Swift에서 사용하려면 NSObject 상속과 @objc dynamic 설정이 필수적이다.
시스템 라이브러리 객체의 상태를 추적할 때 가장 효과적인 도구이다.
성능과 안정성을 위해 필요한 곳에만 선별적으로 사용해야 한다.