Flutter Global Variable Problem

Why Using Global Variables Makes Maintenance Difficult

전역 변수를 사용하면 유지보수가 어려워지는 이유를 몇 가지 예제와 함께 설명해 드릴게요.


1. 여러 위젯에서 값 변경 시 동기화 문제

전역 변수를 사용할 경우, 여러 위젯에서 값을 변경할 때 UI가 자동으로 업데이트되지 않을 수 있습니다.

예제: 전역 변수를 사용한 카운터

import 'package:flutter/material.dart';

class MainApp {
  static int cnt = 0;
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstScreen(),
    );
  }
}

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('첫 번째 화면')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('전역 변수 값: ${MainApp.cnt}', style: TextStyle(fontSize: 24)),
            ElevatedButton(
              onPressed: () {
                MainApp.cnt++;
                // UI가 자동 갱신되지 않음!
              },
              child: Text('증가'),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondScreen()),
                );
              },
              child: Text('다음 화면으로 이동'),
            ),
          ],
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('두 번째 화면')),
      body: Center(
        child: Text('전역 변수 값: ${MainApp.cnt}', style: TextStyle(fontSize: 24)),
      ),
    );
  }
}

문제점:

  • FirstScreen에서 버튼을 눌러 MainApp.cnt 값을 변경했지만, SecondScreen으로 이동해도 값이 즉시 반영되지 않습니다.
  • UI가 자동으로 업데이트되지 않기 때문에 사용자가 새로운 화면에 가서 다시 오면 반영된 값을 확인할 수 있습니다.

해결 방법: ProvidersetState()를 사용하여 UI 갱신이 필요합니다.


2. 전역 변수의 값이 예측하기 어려움

전역 변수를 사용하면 코드의 어느 위치에서든 값을 변경할 수 있기 때문에 디버깅이 어렵습니다.

예제: 여러 위젯에서 값을 변경하는 경우

class MainApp {
  static int cnt = 0;
}
  • FirstScreen에서 MainApp.cnt++;
  • SecondScreen에서 MainApp.cnt--;
  • ThirdScreen에서 MainApp.cnt = 100;

문제점:

  • 값이 어디서, 어떻게 변경되었는지 추적하기 어렵습니다.
  • 유지보수가 어려워지고, 디버깅할 때 예상치 못한 동작을 유발할 수 있습니다.

해결 방법: ChangeNotifier를 사용하면 상태 변화를 추적하기 쉽습니다.


3. 멀티 스레딩(비동기 작업)에서 상태 관리 문제

전역 변수를 사용하면 여러 비동기 작업이 동시에 실행될 때, 예상치 못한 동작이 발생할 수 있습니다.

예제: 비동기 작업에서 전역 변수 사용

class MainApp {
  static int cnt = 0;
}

void increaseCounter() async {
  await Future.delayed(Duration(seconds: 2));
  MainApp.cnt += 1;
}
  • 여러 개의 increaseCounter()가 동시에 실행되면, 예상하지 못한 값으로 변경될 수 있습니다.

문제점:

  • 비동기 작업이 여러 개 실행되면 MainApp.cnt의 값이 예측하기 어렵습니다.
  • 값이 덮어씌워지거나, 최신 상태를 유지하지 못할 수 있습니다.

해결 방법: Provider 또는 Riverpod와 같은 상태 관리 도구를 사용하여 안전하게 값 변경을 관리해야 합니다.


결론

전역 변수를 사용하면:

  1. UI가 자동으로 업데이트되지 않아 사용자가 새로고침해야 값이 반영됨.
  2. 어디서든 값이 변경될 수 있어 디버깅이 어려움.
  3. 비동기 작업이 겹칠 경우, 예측 불가능한 동작이 발생할 수 있음.

👉 전역 변수를 사용해야 한다면, ChangeNotifierProvider를 활용하는 것이 유지보수에 훨씬 유리합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *