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를 활용하는 것이 유지보수에 훨씬 유리합니다.
