[swift] SwiftGen을 활용한 사용자 인증 기능

이번 포스팅에서는 Swift 프로젝트에서 사용자 인증 기능을 구현하는 방법에 대해 알아보겠습니다. SwiftGen 이라는 도구를 사용하여 리소스 파일에 대한 타입 세이프한 접근을 가능하게 하고, 인증 화면에서 이메일과 비밀번호를 입력 받아 서버로 전송하는 예제를 작성하겠습니다.

SwiftGen 소개

SwiftGen은 iOS/macOS 프로젝트에서 리소스 파일 (이미지, 색상, 문자열 등)에 접근할 때 발생할 수 있는 오타나 타입 불일치 등의 문제를 방지하기 위한 도구입니다. SwiftGen을 사용하면 리소스 파일의 이름을 직접 작성하는 대신 코드에서 타입으로 접근할 수 있어 안정성을 높일 수 있습니다.

설치

  1. SwiftGen을 설치하기 위해, Cocoapods를 사용한다면 Podfile에 다음과 같은 라인을 추가합니다.
pod 'SwiftGen'
  1. 터미널에서 pod install 명령어를 실행하여 SwiftGen을 설치합니다.

사용 방법

  1. SwiftGen을 설치하면, 프로젝트에 .xcassets, .strings 와 같은 리소스 파일들을 기반으로 코드 생성을 도와주는 스크립트 파일이 생성됩니다. 이 스크립트 파일은 Run Script Phase 에서 실행됩니다.

  2. 프로젝트 설정에서 Build Phases 탭을 선택하고, + 버튼을 클릭하여 New Run Script Phase를 추가합니다.

  3. Shell에서 /bin/sh 를 선택하고, 아래의 스크립트를 추가합니다.

if which swiftgen >/dev/null; then
  echo "Using SwiftGen"
  swiftgen
else
  echo "SwiftGen not found, download it from https://github.com/SwiftGen/SwiftGen"
fi
  1. 이제 프로젝트를 빌드하면 SwiftGen이 리소스 파일을 기반으로 코드를 생성합니다.

예제: 사용자 인증 기능 구현하기

이제 SwiftGen을 사용하여 사용자 인증 기능을 구현하는 예제를 작성해보겠습니다.

  1. 프로젝트에서 Assets.xcassets 에서 loginButton 이라는 이름으로 UIButton을 추가합니다.
  2. 이메일과 비밀번호를 입력받을 UITextField를 추가합니다.
  3. UITextFieldDelegate를 사용하여 리턴키를 누를 경우 키보드를 닫고, 다음 UITextField로 포커스를 이동하도록 구현합니다.
  4. loginButton이 클릭되었을 때, 입력된 이메일과 비밀번호를 서버로 전송하는 로직을 작성합니다.
import UIKit

class LoginViewController: UIViewController {

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var loginButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func loginButtonTapped(_ sender: UIButton) {
        guard let email = emailTextField.text, let password = passwordTextField.text else {
            return
        }

        // TODO: 서버로 이메일과 비밀번호 전송
    }
}

extension LoginViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        switch textField {
        case emailTextField:
            passwordTextField.becomeFirstResponder()
        case passwordTextField:
            textField.resignFirstResponder()
        default:
            break
        }

        return true
    }
}

위 예제에서는 emailTextFieldpasswordTextField 를 IBOutlet으로 연결하고, loginButtonTapped 메소드에서 이메일과 비밀번호 값을 가져와 서버로 전송하는 로직을 작성했습니다. 또한, textFieldShouldReturn 메소드에서 리턴키가 눌렸을 때 다음 TextField로 포커스를 이동하도록 구현했습니다.

이제 SwiftGen을 사용하여 loginButton을 타입으로 접근해보겠습니다.

import UIKit
import SwiftGen

class LoginViewController: UIViewController {

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var loginButton: UIButton!

    // SwiftGen을 사용하여 loginButton에 접근
    @IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setImage(Asset.loginButton.image, for: .normal)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func loginButtonTapped(_ sender: UIButton) {
        guard let email = emailTextField.text, let password = passwordTextField.text else {
            return
        }

        // TODO: 서버로 이메일과 비밀번호 전송
    }
}

...

위 예제에서는 Asset 타입을 사용하여 loginButton에 이미지를 설정하는 방법을 보여주었습니다. 이렇게 하면 오타나 타입 불일치 문제를 방지할 수 있습니다.

결론

이번 포스팅에서는 SwiftGen을 활용하여 사용자 인증 기능을 구현하는 방법을 알아보았습니다. SwiftGen을 사용하여 리소스 파일에 타입 세이프한 접근을 가능하게 하면 개발 과정에서 발생할 수 있는 오류를 사전에 방지할 수 있습니다. 사용자 인증 기능을 구현하는 예제를 통해 SwiftGen의 사용 방법을 익혀보세요.