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가 자동으로 업데이트되지 않기 때문에 사용자가 새로운 화면에 가서 다시 오면 반영된 값을 확인할 수 있습니다.
➡ 해결 방법: Provider
나 setState()
를 사용하여 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
와 같은 상태 관리 도구를 사용하여 안전하게 값 변경을 관리해야 합니다.
결론
전역 변수를 사용하면:
- UI가 자동으로 업데이트되지 않아 사용자가 새로고침해야 값이 반영됨.
- 어디서든 값이 변경될 수 있어 디버깅이 어려움.
- 비동기 작업이 겹칠 경우, 예측 불가능한 동작이 발생할 수 있음.
👉 전역 변수를 사용해야 한다면, ChangeNotifier
와 Provider
를 활용하는 것이 유지보수에 훨씬 유리합니다.