iOS / Key-Value Observing (KVO)

iOS 앱개발 공부

목록 보기
25/30

✒️ 도입

iOS 개발을 하다 보면 특정 객체의 프로퍼티 값이 변경될 때 이를 실시간으로 감지하고 대응해야 하는 상황이 빈번하게 발생한다.
이러한 요구사항을 해결하기 위해 Apple은 Key-Value Observing (KVO)이라는 강력한 메커니즘을 제공한다.
KVO는 Objective-C 시절부터 Cocoa 프레임워크의 핵심적인 부분이었으며, Swift에서도 여전히 중요한 역할을 수행한다.

✅ Key-Value Observing이란 무엇인가?

KVO는 객체의 프로퍼티 변경 사항을 다른 객체에 알리기 위한 디자인 패턴이다.
상태 변화를 추적하기 위해 별도의 프로토콜을 구현하거나 Delegate를 설정할 필요 없이, 시스템 수준에서 프로퍼티의 변화를 관찰할 수 있게 해준다.

1) KVO의 동작 원리

KVO는 Key-Value Coding (KVC)을 기반으로 동작한다. 관찰 대상이 되는 객체의 프로퍼티가 변경되면, 시스템은 해당 객체에 등록된 관찰자(Observer)들에게 알림을 보낸다.

2) Swift에서 KVO 사용을 위한 조건

Swift는 정적 언어이기 때문에, 런타임에 프로퍼티를 감시하는 KVO를 사용하려면 몇 가지 제약 사항이 따른다.
관찰 대상 객체는 반드시 NSObject를 상속받아야 한다.
관찰하고자 하는 프로퍼티에는 @objc 어트리뷰트와 dynamic 수정자를 붙여야 한다.
dynamic은 해당 프로퍼티에 대한 접근을 Objective-C 런타임의 동적 디스패치 방식으로 처리하도록 강제한다.

3) 현대적인 Swift KVO 구현

iOS 11 이후부터는 클로저 기반의 새로운 KVO API가 도입되어 관리가 훨씬 수월해졌다.
NSKeyValueObservation 객체를 통해 관찰 수명을 관리한다.
관찰자가 해제될 때 자동으로 관찰이 중단되므로 메모리 누수 위험이 줄어들었다.

4) KVO를 사용하는 이유와 주의점

KVO는 주로 우리가 직접 수정할 수 없는 외부 라이브러리나 프레임워크의 객체(예: AVPlayer, WKWebView 등)를 감시할 때 매우 유용하다.

장점

  • 자동화: 값의 변경을 수동으로 알릴 필요가 없다.
  • 유연성: 소스 코드가 없는 객체의 내부 상태도 감찰할 수 있다.

단점 및 주의사항

  • 강한 결합: 프로퍼티 이름을 문자열로 참조(KVC)하거나 KeyPath를 사용하므로, 프로퍼티 이름이 바뀌면 런타임 에러가 발생할 가능성이 있다.
  • 성능 부하: Objective-C 런타임을 거쳐야 하므로 과도한 사용은 성능에 영향을 줄 수 있다.
  • SwiftUI와의 관계: 최신 프레임워크인 SwiftUI에서는 @Published@State 같은 데이터 바인딩 형식이 KVO의 역할을 대체하고 있다.

💡 요약

KVO는 객체의 프로퍼티 변경을 감시하고 알림을 받는 메커니즘이다.
Swift에서 사용하려면 NSObject 상속과 @objc dynamic 설정이 필수적이다.
시스템 라이브러리 객체의 상태를 추적할 때 가장 효과적인 도구이다.
성능과 안정성을 위해 필요한 곳에만 선별적으로 사용해야 한다.

참조: Apple Developer Documentation - KVO

profile
이유있는 코드를 쓰자!!

0개의 댓글