[swift] RxSwift에서의 유효성 검사 방법

RxSwift는 리액티브 프로그래밍을 위한 강력한 도구이며, 데이터 유효성을 검사하는데도 사용할 수 있습니다. 데이터 유효성을 확인하는 것은 사용자 입력이나 네트워크 응답과 같은 외부 요인으로부터 오는 오류를 방지하기 위해 필수적입니다. 이번 포스트에서는 RxSwift를 사용하여 데이터 유효성을 검사하는 방법에 대해 알아보겠습니다.

1. 유효성 검사 유틸리티 클래스 작성

먼저, 유효성 검사에 필요한 유틸리티 클래스를 작성해야 합니다. 예를 들어, 사용자 이름이나 이메일 주소와 같은 특정 필드가 유효성을 확인해야 하는 경우, 해당 필드에 대한 유효성 검사를 수행하는 함수를 포함한 유틸리티 클래스를 작성해야 합니다.

import RxSwift

class ValidationUtils {
  static func validateUsername(_ username: String) -> Observable<Bool> {
    // 유효성 검사 로직 적용
    let isValid = username.count >= 6 && username.count <= 20
    return Observable.just(isValid)
  }
  
  static func validateEmail(_ email: String) -> Observable<Bool> {
    // 유효성 검사 로직 적용
    let isValid = email.contains("@")
    return Observable.just(isValid)
  }
  
  // 추가 필드에 대한 유효성 검사 함수 작성
}

2. 유효성 검사 적용

유효성 검사를 수행해야 하는 데이터에 Observable을 적용하여 유효성 검사를 수행할 수 있습니다. 이를 통해 데이터가 유효한지 여부를 관찰하고, 필요한 액션을 수행할 수 있습니다. 예를 들어, 사용자 이름과 이메일 주소가 모두 유효한지 확인하고, “회원 가입” 버튼을 활성화하는 경우를 살펴보겠습니다.

import RxSwift

class ViewModel {
  let disposeBag = DisposeBag()
  
  let username = BehaviorSubject<String>(value: "")
  let email = BehaviorSubject<String>(value: "")
  
  var isButtonEnabled: Observable<Bool> {
    return Observable.combineLatest(validateUsername(), validateEmail()) { usernameValid, emailValid in
      return usernameValid && emailValid
    }
  }
  
  func validateUsername() -> Observable<Bool> {
    return username.flatMapLatest { username in
      return ValidationUtils.validateUsername(username)
    }
  }
  
  func validateEmail() -> Observable<Bool> {
    return email.flatMapLatest { email in
      return ValidationUtils.validateEmail(email)
    }
  }
}

위의 코드에서 ViewModel 클래스는 사용자 이름과 이메일 주소에 대한 BehaviorSubject를 가지고 있습니다. 사용자 이름과 이메일 주소의 유효성을 검사하기 위해 validateUsername()validateEmail() 함수를 사용합니다. isButtonEnabled 속성은 두 유효성 검사 결과를 결합하여 “회원 가입” 버튼의 활성화 여부를 결정합니다.

3. UI와의 연결

마지막으로, 유효성 검사 결과를 UI와 연결하여 실시간으로 검사 결과를 표시할 수 있습니다. 예를 들어, “회원 가입” 버튼의 활성화 여부를 바인딩하는 방법을 살펴보겠습니다.

import RxSwift
import RxCocoa

class SignupViewController: UIViewController {
  let disposeBag = DisposeBag()
  
  @IBOutlet weak var usernameTextField: UITextField!
  @IBOutlet weak var emailTextField: UITextField!
  @IBOutlet weak var signupButton: UIButton!
  
  let viewModel = ViewModel()
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    bindViewModel()
  }
  
  func bindViewModel() {
    usernameTextField.rx.text.orEmpty
      .bind(to: viewModel.username)
      .disposed(by: disposeBag)
    
    emailTextField.rx.text.orEmpty
      .bind(to: viewModel.email)
      .disposed(by: disposeBag)
    
    viewModel.isButtonEnabled
      .bind(to: signupButton.rx.isEnabled)
      .disposed(by: disposeBag)
  }
}

위의 코드에서 SignupViewController 클래스는 사용자 이름과 이메일을 입력하는 텍스트 필드와 “회원 가입” 버튼을 가지고 있습니다. bindViewModel() 함수에서는 입력 필드의 값을 ViewModelBehaviorSubject에 바인딩하고, isButtonEnabledsignupButtonisEnabled로 바인딩합니다.

이제 사용자는 유효한 사용자 이름과 이메일을 입력하면 “회원 가입” 버튼이 활성화되고, 유효하지 않은 경우 비활성화됩니다.

결론

이렇게 RxSwift를 사용하여 데이터 유효성을 검사할 수 있습니다. RxSwift를 사용하면 데이터 유효성을 쉽고 간단하게 처리할 수 있으며, 실시간으로 유효성 검사 결과를 UI에 반영할 수 있습니다. RxSwift를 사용하여 앱의 유효성 검사 로직을 작성하면 코드의 가독성과 유지보수성을 높일 수 있습니다.

참고 자료