UserDefaults는 iOS 앱에서 간단한 데이터를 영구적으로 저장할 수 있는 인터페이스로 값 쌍으로 데이터를 저장하며, 앱이 종료되어도 데이터가 유지한다.
⚠️ 주의: 실제 앱에서는 보안을 위해 민감한 정보(비밀번호 등)의 저장에 Keychain을 사용해야 한다.
UserDefaults를 관리할 매니저 클래스를 생성한다:
import Foundation
class UserDefaultsManager {
// 싱글톤 인스턴스
static let shared = UserDefaultsManager()
private let defaults = UserDefaults.standard
// Keys
private enum Keys {
static let isLoggedIn = "isLoggedIn"
static let userEmail = "userEmail"
static let userPassword = "userPassword" // 실제 앱에서는 암호를 UserDefaults에 저장하면 안됨
}
// 로그인 상태 저장
var isLoggedIn: Bool {
get {
return defaults.bool(forKey: Keys.isLoggedIn)
}
set {
defaults.set(newValue, forKey: Keys.isLoggedIn)
}
}
// 사용자 정보 저장
func saveUserCredentials(email: String, password: String) {
defaults.set(email, forKey: Keys.userEmail)
defaults.set(password, forKey: Keys.userPassword)
isLoggedIn = true
}
// 로그아웃
func logout() {
isLoggedIn = false
defaults.removeObject(forKey: Keys.userEmail)
defaults.removeObject(forKey: Keys.userPassword)
}
}
회원가입 화면에서 사용자 정보를 입력받고 저장하는 기능을 구현한다:
class SignUpView: UIViewController {
private let userDefaults = UserDefaultsManager.shared
@objc private func createAccountButtonTapped() {
guard let fullName = fullNameTextField.text, !fullName.isEmpty,
let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty else {
let alert = UIAlertController(
title: "에러",
message: "모든 필드를 입력해주세요.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "확인", style: .default))
present(alert, animated: true)
return
}
// UserDefaults에 저장
userDefaults.saveUserCredentials(email: email, password: password)
// 성공 알림 후 로그인 화면으로 이동
let alert = UIAlertController(
title: "성공",
message: "회원가입이 완료되었습니다.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "확인", style: .default) { _ in
self.navigationController?.popViewController(animated: true)
})
present(alert, animated: true)
}
}
저장된 사용자 정보를 확인하여 로그인을 처리한다:
class LoginView: UIViewController {
private let userDefaults = UserDefaultsManager.shared
@objc private func loginButtonTapped() {
guard let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty else {
let alert = UIAlertController(
title: "에러",
message: "이메일과 비밀번호를 입력해주세요.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "확인", style: .default))
present(alert, animated: true)
return
}
let savedEmail = UserDefaults.standard.string(forKey: "userEmail")
let savedPassword = UserDefaults.standard.string(forKey: "userPassword")
if email == savedEmail && password == savedPassword {
userDefaults.saveUserCredentials(email: email, password: password)
// 로그인 성공 시 메인 화면으로 이동
let mainVC = ViewController()
navigationController?.setViewControllers([mainVC], animated: true)
} else {
let alert = UIAlertController(
title: "로그인 실패",
message: "이메일 또는 비밀번호가 일치하지 않습니다.",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "확인", style: .default))
present(alert, animated: true)
}
}
}
앱 실행 시 로그인 상태를 확인하여 적절한 화면으로 이동한다:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession...) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
// 로그인 상태 확인
if UserDefaultsManager.shared.isLoggedIn {
// 이미 로그인된 상태면 메인 화면으로
let mainVC = ViewController()
window.rootViewController = UINavigationController(rootViewController: mainVC)
} else {
// 로그인이 필요한 상태면 로그인 화면으로
let loginVC = LoginView()
window.rootViewController = UINavigationController(rootViewController: loginVC)
}
self.window = window
window.makeKeyAndVisible()
}