애플리케이션을 개발하다 보면 모든 입력 필드마다 동일한 유효성 검사 코드를 반복해서 작성하게 되는 경우가 많습니다. 사용자 회원가입 화면, 로그인 화면 또는 기타 여러 화면에서 이름, 이메일, 비밀번호, 전화번호 등을 검증할 때가 대표적인 예입니다.
입력 필드마다 같은 코드를 매번 작성하다 보면 지루할 뿐만 아니라 실수를 유발하기 쉽습니다. 좋은 설계 관점에서도 각 필드마다 개별적으로 검증 로직을 작성하는 것은 권장되지 않으며, 대신 범용(generic)으로 재사용 가능한 검증 함수를 작성하는 것이 바람직합니다.
이 글에서는 입력 텍스트 필드를 검증하는 범용 유효성 검사 라이브러리를 만드는 방법을 단계별로 알아보겠습니다.
범용 검증 라이브러리의 장점
- 모든 기능에서 재사용 가능한 코드 확보
- 사람의 실수로 인한 오류 발생 가능성 감소
- 빠른 설정과 손쉬운 프로젝트 연동
- 함수 하나만 수정하면 전체에 즉시 반영됨
프로젝트 구성
검증 라이브러리와 이를 활용하는 데모 앱을 함께 만들어 보겠습니다. 데모 앱에서는 총 4개의 입력 필드(이름, 이메일, 비밀번호, 전화번호)를 라이브러리로 검증합니다. 라이브러리는 필요에 따라 언제든 확장할 수 있도록 범용적으로 설계합니다.
1단계 — Xcode 프로젝트 생성
Xcode를 열고 Single View Application 템플릿으로 새 프로젝트를 생성한 뒤, 프로젝트 이름을 Validation으로 지정합니다.
2단계 — 검증 클래스 파일 추가
File → New → File → Swift File 순서로 새 Swift 파일을 추가하고, 파일명을 Validation.swift로 저장합니다.
3단계 — UI 구성
Main.storyboard를 열고 아래와 같이 UI를 배치합니다. 텍스트 필드 4개와 버튼 1개를 추가하면 됩니다.

사용자가 모든 필드를 입력한 후 Validate 버튼을 누르면 전체 필드를 검증하고, 잘못 입력된 항목을 출력합니다. 모든 값이 올바르면 "모든 필드가 올바릅니다"라는 메시지를 출력하도록 구현합니다.
4단계 — IBOutlet과 IBAction 연결
버튼에는 @IBAction을, 입력 필드에는 @IBOutlet을 각각 연결합니다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet var validateNameTxtFld: UITextField!
@IBOutlet var validateEmailTxtFld: UITextField!
@IBOutlet var validatePasswordTxtFld: UITextField!
@IBOutlet var validatePhoneTxtFld: UITextField!
@IBAction func validateBtn(_ sender: Any) {
}
}5단계 — Validation.swift에 검증 로직 작성
Validation.swift 파일을 열고 아래 코드를 그대로 붙여넣습니다. 정규식(Regex) 패턴을 활용해 이름, 전화번호, 이메일, 비밀번호를 검증하는 구조입니다.
import Foundation
class Validation {
public func validateName(name: String) -> Bool {
// 최소 3자, 최대 18자 — 필요에 따라 자유롭게 수정 가능
let nameRegex = "^\\w{3,18}$"
let trimmedString = name.trimmingCharacters(in: .whitespaces)
let validateName = NSPredicate(format: "SELF MATCHES %@", nameRegex)
let isValidateName = validateName.evaluate(with: trimmedString)
return isValidateName
}
public func validaPhoneNumber(phoneNumber: String) -> Bool {
let phoneNumberRegex = "^[6-9]\\d{9}$"
let trimmedString = phoneNumber.trimmingCharacters(in: .whitespaces)
let validatePhone = NSPredicate(format: "SELF MATCHES %@", phoneNumberRegex)
let isValidPhone = validatePhone.evaluate(with: trimmedString)
return isValidPhone
}
public func validateEmailId(emailID: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let trimmedString = emailID.trimmingCharacters(in: .whitespaces)
let validateEmail = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let isValidateEmail = validateEmail.evaluate(with: trimmedString)
return isValidateEmail
}
public func validatePassword(password: String) -> Bool {
// 최소 8자, 영문자 1개 이상 + 숫자 1개 이상 포함
let passRegEx = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8}$"
let trimmedString = password.trimmingCharacters(in: .whitespaces)
let validatePassord = NSPredicate(format:"SELF MATCHES %@", passRegEx)
let isvalidatePass = validatePassord.evaluate(with: trimmedString)
return isvalidatePass
}
public func validateAnyOtherTextField(otherField: String) -> Bool {
let otherRegexString = "Your regex String"
let trimmedString = otherField.trimmingCharacters(in: .whitespaces)
let validateOtherString = NSPredicate(format: "SELF MATCHES %@", otherRegexString)
let isValidateOtherString = validateOtherString.evaluate(with: trimmedString)
return isValidateOtherString
}
}각 입력 항목의 요구 사항에 맞게 Regex 문자열은 언제든 수정할 수 있습니다. 예를 들어 전화번호 정규식은 국가별 번호 체계에 맞춰 조정하면 됩니다.
6단계 — ViewController에서 Validation 객체 생성 및 옵셔널 처리
ViewController.swift를 열고 Validation 클래스의 인스턴스를 생성합니다.
var validation = Validation()
이후 guard 문을 사용해 입력 필드의 텍스트 값을 안전하게 언래핑(unwrapping)합니다.
guard let name = validateNameTxtFld.text, let email = validateEmailTxtFld.text, let password = validatePasswordTxtFld.text,
let phone = validatePhoneTxtFld.text else {
return
}7단계 — 각 필드에 대한 검증 함수 호출
이제 각 필드마다 검증 함수를 호출합니다. 결과가 false이면 해당 메시지를 출력하고 함수를 종료(return)합니다.
let isValidateName = self.validation.validateName(name: name)
if (isValidateName == false) {
print("잘못된 이름 형식입니다")
return
}
let isValidateEmail = self.validation.validateEmailId(emailID: email)
if (isValidateEmail == false){
print("잘못된 이메일 형식입니다")
return
}
let isValidatePass = self.validation.validatePassword(password: password)
if (isValidatePass == false) {
print("잘못된 비밀번호 형식입니다")
return
}
let isValidatePhone = self.validation.validaPhoneNumber(phoneNumber: phone)
if (isValidatePhone == false) {
print("잘못된 전화번호 형식입니다")
return
}8단계 — 모든 검증 통과 시 처리
모든 필드가 올바르면 성공 메시지를 출력합니다.
if (isValidateName == true || isValidateEmail == true || isValidatePass == true || isValidatePhone == true) {
print("모든 필드가 올바릅니다")
}완성된 ViewController.swift 전체 코드
import UIKit
class ViewController: UIViewController {
var validation = Validation()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet var validateNameTxtFld: UITextField!
@IBOutlet var validateEmailTxtFld: UITextField!
@IBOutlet var validatePasswordTxtFld: UITextField!
@IBOutlet var validatePhoneTxtFld: UITextField!
@IBAction func validateBtn(_ sender: Any) {
guard let name = validateNameTxtFld.text, let email = validateEmailTxtFld.text, let password = validatePasswordTxtFld.text,
let phone = validatePhoneTxtFld.text else {
return
}
let isValidateName = self.validation.validateName(name: name)
if (isValidateName == false) {
print("잘못된 이름 형식입니다")
return
}
let isValidateEmail = self.validation.validateEmailId(emailID: email)
if (isValidateEmail == false) {
print("잘못된 이메일 형식입니다")
return
}
let isValidatePass = self.validation.validatePassword(password: password)
if (isValidatePass == false) {
print("잘못된 비밀번호 형식입니다")
return
}
let isValidatePhone = self.validation.validaPhoneNumber(phoneNumber: phone)
if (isValidatePhone == false) {
print("잘못된 전화번호 형식입니다")
return
}
if (isValidateName == true || isValidateEmail == true || isValidatePass == true || isValidatePhone == true) {
print("모든 필드가 올바릅니다")
}
}
}이것으로 완성입니다! 이렇게 만든 Validation 클래스는 다른 프로젝트에서도 그대로 가져다 쓸 수 있으며, 새로운 검증 규칙이 필요하면 정규식만 교체하거나 함수를 추가하는 방식으로 손쉽게 확장할 수 있습니다.