[swift] RxCocoa를 이용한 로그인, 회원가입 로직 구현 방법

이번 글에서는 Swift에서 RxCocoa를 이용하여 로그인과 회원가입 로직을 구현하는 방법에 대해 설명하겠습니다. RxCocoa는 ReactiveX의 기능을 Swift에 적용한 라이브러리로써, 함수형 및 반응형 프로그래밍 패러다임을 적용할 수 있습니다.

로그인 로직 구현하기

첫 번째로, 로그인 로직부터 구현해보겠습니다. RxCocoa에서 TextField를 사용하여 사용자로부터 아이디와 비밀번호를 입력받고, 버튼을 클릭하면 로그인을 수행하는 과정을 구현해보겠습니다.

import UIKit
import RxCocoa
import RxSwift

class LoginViewController: UIViewController {
    
    @IBOutlet weak var idTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var loginButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let idObservable = idTextField.rx.text.orEmpty.asObservable()
        let passwordObservable = passwordTextField.rx.text.orEmpty.asObservable()
        
        let loginEnabled = Observable.combineLatest(idObservable, passwordObservable)
            .map { id, password in
                return id.count >= 5 && password.count >= 8
            }
        
        loginEnabled
            .subscribe(onNext: { isEnabled in
                self.loginButton.isEnabled = isEnabled
            })
            .disposed(by: disposeBag)
        
        loginButton.rx.tap
            .subscribe(onNext: { [weak self] in
                self?.performLogin()
            })
            .disposed(by: disposeBag)
    }
    
    func performLogin() {
        // 로그인 로직 수행
    }
    
}

위의 코드에서는 먼저 idTextField와 passwordTextField의 text를 Observable로 변환합니다. 그리고 combineLatest 연산자를 이용하여 두 Observable의 값을 조합하여 새로운 Observable인 loginEnabled를 만듭니다. 이 Observable은 아이디의 길이가 5 이상이고 비밀번호의 길이가 8 이상일 경우에만 true를 방출합니다.

loginEnabled Observable의 변화를 구독하여 로그인 버튼의 isEnabled 속성을 업데이트합니다. 또한, loginButton의 tap 이벤트를 구독하여 performLogin 메소드를 호출합니다.

회원가입 로직 구현하기

이제 회원가입 로직을 구현해보겠습니다. 위에서 구현한 로그인 로직과 비슷한 방식으로 TextField와 Button을 조합하여 회원가입을 수행하는 로직을 구현할 수 있습니다.

import UIKit
import RxCocoa
import RxSwift

class SignupViewController: UIViewController {
    
    @IBOutlet weak var idTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var confirmPasswordTextField: UITextField!
    @IBOutlet weak var signupButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let idObservable = idTextField.rx.text.orEmpty.asObservable()
        let passwordObservable = passwordTextField.rx.text.orEmpty.asObservable()
        let confirmPasswordObservable = confirmPasswordTextField.rx.text.orEmpty.asObservable()
        
        let signupEnabled = Observable.combineLatest(idObservable, passwordObservable, confirmPasswordObservable)
            .map { id, password, confirmPassword in
                return id.count >= 5 && password.count >= 8 && password == confirmPassword
            }
        
        signupEnabled
            .subscribe(onNext: { isEnabled in
                self.signupButton.isEnabled = isEnabled
            })
            .disposed(by: disposeBag)
        
        signupButton.rx.tap
            .subscribe(onNext: { [weak self] in
                self?.performSignup()
            })
            .disposed(by: disposeBag)
    }
    
    func performSignup() {
        // 회원가입 로직 수행
    }
    
}

위의 코드에서도 마찬가지로 TextField의 text를 Observable로 변환하고, combineLatest 연산자를 이용하여 조건을 비교하여 signupEnabled Observable을 만듭니다. 이 Observable은 아이디의 길이가 5 이상이며 비밀번호의 길이가 8 이상이고, 비밀번호와 확인 비밀번호가 일치할 경우에만 true를 방출합니다.

signupEnabled Observable의 변화를 구독하여 회원가입 버튼의 isEnabled 속성을 업데이트하고, signupButton의 tap 이벤트를 구독하여 performSignup 메소드를 호출합니다.

마무리

위에서는 RxCocoa를 이용하여 로그인과 회원가입 로직을 구현하는 방법을 알아보았습니다. 이처럼 RxCocoa를 사용하면 함수형 및 반응형 프로그래밍의 장점을 활용하여 앱 개발을 보다 간결하고 효율적으로 할 수 있습니다.

더 자세한 내용은 RxCocoa 공식 문서를 참고하시기 바랍니다.