애플워치 앱 코드에서 잠재적으로 Crash를 유발할만한 부분들에 대해 정리하였습니다.
•
Realm 객체 인스턴스 사용 시 스레드 관련 문제가 발생할 가능성이 있음
◦
Realm 은 하나의 스레드에서 생성된 Realm 인스턴스에 다른 스레드에서 접근하면 에러가 발생합니다. 현재 애플워치 앱에서는 하나의 Realm 인스턴스를 만들어서 모든 함수에서 이를 공유하는 형태로 구현되어 있습니다. 이런 구조에서는 자칫 해당 인스턴스를 다른 스레드에서 접근하는 로직이 실행되면 crash가 발생할 수 있어 Realm DB에 write를 수행하는 함수 안에서 매번 Realm 인스턴스를 생성해서 스레드 관련 이슈가 발생할 가능성을 줄이는 작업이 필요합니다.
◦
코드 예시
아래 코드가 현재 Realm 인스턴스가 초기화하는 부분입니다. 싱글톤 객체인 RealmManager 안에서 객체가 init 될 때 openRealm 함수가 실행되어 객체 프로퍼티 localRealm 에 Realm 객체 인스턴스를 저장하고, 이후 Realm 관련 작업을 할 때 계속 재사용하는 구조로 구현되어 있습니다. localRealm 이 초기화된 스레드가 아닌 스레드에서 이 localRealm 에 저장된 인스턴스에 접근 시 에러가 발생할 수 있습니다.
•
null일 가능성이 있는 변수를 null이 아닐것이라고 가정해서 사용하는 코드가 있음
◦
Swift에서 optional이라는, null일 수 있는 타입의 값을 사용하기 위해서는 이 값이 null이 아닌지 확인하는 처리가 필요합니다. 코드에서 이 확인과정 없이 null 이 아닐 것이라고 가정해서 처리한 부분에서 값이 null인 경우 에러가 발생할 소지가 있어 수정이 필요합니다.
◦
코드 예시
아래 코드에서 null일 수 있는 타입의 값에 접근할 때 as! String 이라고 변수를 강제로 null이 아닌 String 타입의 값이라고 가정해서 처리되어 있습니다. 이 부분은 해당 값이 null이거나, Strinig 타입 값이 아닌 경우 에러가 발생합니다.
•
Realm 관련 작업 시 crash가 발생할 소지가 있는 코드에 대해서 에러 핸들링이 안되어 있는 부분들이 있음
◦
Realm DB에서 값을 read하는 코드도 상황에 따라서 실패할 수 있는 코드인데 crash를 방지할 수 있는 try-catch와 같은 코드 블록으로 처리되지 않은 부분이 있습니다. Realm 관련 CRUD를 처리하는 작업을 모두 에러를 핸들링할 수 있는 코드 블록으로 감싸는 처리가 필요합니다.
◦
코드 예시
아래 코드에서 61번째 줄부터 63번째 줄의 코드는 Realm 인스턴스를 활용해서 DB값을 read하는 코드입니다. 해당 부분도 DB관련 처리가 에러가 발생할 수 있는데, 이에 대해서 핸들링이 안되어 있어 crash를 유발할 수 있습니다.


