기본 정보
RealmManager 모듈은 Realm DB와의 상호작용하는 로직을 담고 있는 객체로, Realm DB와 상호작용하기 위해 필요한 객체를 초기화하고, Realm DB에 대한 CRUD 로직을 담고 있습니다.
이 객체를 활용해서 앱 내의 주요 데이터인 운동 데이터가 Realm 저장 및 업데이트되고, 보존되었다가 최종적으로 다시 iOS앱으로 전송됩니다.
RealmManager 파일은 Realm 폴더 내에 위치하고 있습니다.
주요 로직 명세
객체 개요
RealmManager 는 앱 실행 시 인스턴스가 하나만 초기화되어 앱이 종료될 때까지 사용되는 싱글톤 객체입니다.
Realm DB와 소통하기 위해서는 Realm 인스턴스가 필요합니다. 이 객체를 초기화하는 init함수가 실행될 때, 객체의 변수에 Realm 인스턴스를 할당해서 앱이 종료될 때 까지 계속 활용하는 형태로 적용되어 있습니다.
// 외부에서 shared라는 변수를 통해 동일한 인스턴스에 접근해서 사용하는 싱글톤 객체입니다.
class RealmManager: ObservableObject {
static let shared = RealmManager()
// Realm 인스턴스 담기 위한 변수
private(set) var localRealm: Realm?
// 객체의 init함수 실행 시 Realm DB 인스턴스 생성하는 openRealm() 함수 실행
private init() {
openRealm()
}
// Realm DB 인스턴스 생성하는 openRealm() 함수
func openRealm() {
do {
let config = Realm.Configuration(deleteRealmIfMigrationNeeded: true)
Realm.Configuration.defaultConfiguration = config
localRealm = try Realm()
} catch {
print("Realm 초기화 실패: \(error.localizedDescription)")
}
}
}
JavaScript
복사
주요 메서드 명세
RealmManager 는 DB에 대해서 CRUD를 수행하는 함수 위주로 구성되어 있습니다. 함수 수가 많기 때문에 개별 함수에 대해서 설명하기 보다는 함수들에 공통적으로 적용되어 있는 사항과 어떤 구조로 함수들이 묶여있는지를 위주로 작성하였습니다.
공통적으로 적용되는 사항
함수들에서 공통적으로 등장하는 localRealm 변수는 RealmMananger 객체 초기화 시 생성한 Realm 인스턴스를 담고 있는 변수입니다. 이 변수에 담겨있는 인스턴스를 활용해서 모든 DB에 대한 업데이트 및 삭제 작업이 수행되어야 합니다.
•
관련 코드 예시
func addDayExerciseInformation(dayExerciseInformationFromApp: DayExerciseInformation) {
// localRealm 변수는 Realm? 타입의 옵셔널 타입 값이기 때문에,
// 옵셔널 값을 해제하는 처리가 필요합니다. 아래의 if let 부분이
// 옵셔널을 해제하고, 이어지는 코드 블록 안에서 localRealm이라는 이름으로
// Realm 인스턴스에 접근할 수 있도록 해주는 코드입니다.
if let localRealm = localRealm {
// Realm 인스턴스를 통한 처리가 실패하는 케이스를 고려해 do-catch 문을
// 이용해 에러처리가 되어야 합니다.
do {
// Realm 인스턴스에 데이터를 추가하거나 삭제할 때는
// 인스턴스의 write 안에서 작업이 수행되어야 합니다.
try localRealm.write {
localRealm.add(dayExerciseInformationFromApp)
}
} catch {
print("DayExerciseInformation 추가 실패: \(error.localizedDescription)")
}
}
}
JavaScript
복사
메서드를 분리한 기준 및 구조
Realm DB 관련 데이터를 처리하는 메서드를 RealmManager 파일 하나에 다 생성하면 파일이 너무 길어져 이해하기 힘들 듯 하여, 이를 분리하였습니다.
RealmManager 객체를 확장해서 용도별로 별도 파일에 관련된 함수들을 모아서 작성하는 형식으로 처리되어 있습니다. 개별 파일들은 Realm/RealmExtensions 디렉토리에 위치해 있습니다.
각 파일 별 내용
•
Realm+WorkoutTimer
◦
Realm DB에 저장된 운동 타이머 관련 데이터(WorkoutTimer 타입으로 Realm에 저장된 값)를 처리하는 함수의 모음입니다.
•
Realm+SetCRUD
◦
Realm DB에 저장된 운동 기록 관련 데이터 ( DayExerciseInformation 타입으로 저장된 운동 기록 데이터) 중 일부인 운동별 세트 정보를 처리하는 함수의 모음입니다.
•
Realm+ApplicationContext
◦
applicationContext 형식으로 iOS앱으로부터 수신한 데이터를 변환하고, Realm DB에 저장하는 과정에서 필요한 함수의 모음입니다.
•
Realm+ExerciseLibrary
◦
Realm DB에 저장된 운동 라이브러리 데이터 ( ExerciseLibrary 타입으로 Realm에 저장된 값)에 존재하는 운동을 운동 기록 데이터에 추가/삭제하는 함수의 모음입니다.
•
Realm+ExerciseSettings
◦
Realm DB에 저장된 운동 기록 관련 데이터 ( DayExerciseInformation 타입으로 저장된 운동 기록 데이터 ) 중 운동별 설정 항목들을 변경하는 함수의 모음입니다.

