반응형

SwiftUI에서 많이 하는 실수 - AppStorage / SceneStorage를 남용해 예기치 않은 상태 유지가 발생하는 실수

 

@AppStorage와 @SceneStorage는 간단한 값을 UserDefaults/Scene에 자동 저장해주는 편리한 도구입니다.
하지만 모든 상태를 AppStorage에 넣어 버리면,
앱 재실행 후에도 남아 있으면 곤란한 값까지 계속 유지되어 이상한 버그가 생깁니다.


1. 문제 원인

  • “앱 종료 후에도 유지되면 좋겠지”라는 막연한 발상
  • 로그인 토큰/민감 정보까지 AppStorage에 그대로 저장
  • 단순 UI 토글 상태와 도메인 상태를 구분하지 않음

2. 나타나는 증상

  • 앱을 지웠다 다시 설치하기 전까지 특정 상태가 계속 남아 있음
  • 개발 중에 값이 꼬여, 초기화가 잘 안 되는 느낌을 받음
  • 프라이버시/보안상 문제 (예: 최근 검색, 민감 설정 etc.)

3. 잘못된 코드 예시

struct SettingsView: View {
    // ❌ 단순 화면 토글도 전부 AppStorage
    @AppStorage("isOnboardingShown") var isOnboardingShown: Bool = false
    @AppStorage("selectedTab") var selectedTab: Int = 0
    @AppStorage("tempInput") var tempInput: String = ""

    var body: some View {
        // ...
    }
}

또는:

@AppStorage("accessToken") var accessToken: String = "" // ❌ 민감 정보

4. 올바른 코드 예시

4-1. 정말 “앱 전체 라이프사이클 동안 유지되어야 하는 설정”에만 사용

struct SettingsView: View {
    @AppStorage("isDarkMode") var isDarkMode: Bool = false
    @AppStorage("preferredLanguage") var preferredLanguage: String = "ko"

    var body: some View {
        Toggle("다크 모드", isOn: $isDarkMode)
        // ...
    }
}

4-2. 일시적인 UI 상태는 @State / @StateObject 사용

struct SearchView: View {
    @State private var query: String = ""       // ✅ 앱 종료 시 사라져도 되는 값
    @StateObject private var viewModel = SearchViewModel()

    var body: some View {
        TextField("검색", text: $query)
        // ...
    }
}

민감 정보는 Keychain/보안 저장소 사용이 더 적절합니다.


5. 정리 및 팁

  • AppStorage/SceneStorage는 “사용자가 앱을 다시 켰을 때도 남아 있기를 기대하는 설정값” 위주로 사용합니다.
  • 검색어, 필터, 일시적인 UI 상태, 접근 토큰 등의 값은
    각각 ViewModel/Keychain/도메인 저장소 등에 맞게 분리 관리하는 것이 좋습니다.
반응형
Posted by 까칠코더
,