-
Hot reload는 상태를 보존하지만 모든 변경을 반영하지 않습니다AI Agent/flutter 2026. 7. 3. 21:00728x90반응형

고쳐도 안 바뀌던 화면, restart 한 번에 끝난 추적 기본 언어를 영어로 세팅하는 로직을 고쳤는데, 저장(hot reload)을 눌러도 화면은 계속 한국어였습니다.
코드를 다시 읽어봤습니다.
조건도 맞고, 값도 맞고, 오타도 없었습니다.
그런데 화면은 요지부동이었습니다.
저는 제 코드가 틀렸다고 확신하고, 없는 버그를 한 시간쯤 쫓았습니다.print를 여기저기 박고, 조건을 뒤집어 보고, 심지어 라이브러리를 의심했습니다.
그러다 아무 이유 없이 앱을 껐다 켰는데(hot restart), 화면이 영어로 바뀌어 있었습니다.
코드는 한 글자도 안 건드렸는데 말입니다.이 순간이 제일 당황스러웠습니다.
버그를 잡은 게 아니라, 아무것도 안 했는데 버그가 사라졌으니까요.
보통은 "뭘 고쳐서 됐지"를 되짚는데, 이번엔 되짚을 수정이 없었습니다.
화면 하단에 뜨는 작은 안내를 그제야 봤습니다.
hot reload와 hot restart가 다른 버튼이라는 걸, 저는 그날까지 거의 구분 없이 눌러왔던 겁니다.상태 보존이라는 기능의 뒷면
hot reload는 실행 중인 앱의 상태를 최대한 살려둔 채로 바뀐 코드만 갈아 끼우는 도구입니다.
이게 빠른 개발의 핵심입니다.
화면 열어둔 자리 그대로, 스크롤 위치 그대로, 위젯만 새 코드로 다시 그려주니까요.그런데 "상태를 살려둔다"는 말에는 조건이 붙습니다.
이미 한 번 실행돼서 값이 굳어버린 코드는 다시 돌지 않습니다.
hot reload는 build 메서드를 다시 부르는 데에는 능하지만, 앱이 시작할 때 딱 한 번 도는 초기화 코드는 건드리지 않습니다.
제 언어 설정은 앱 부팅 시점에 전역에서 한 번 결정되고 끝나는 값이었습니다.
build는 아무리 다시 돌아도, 그 굳은 값을 다시 읽을 뿐이었습니다.돌이켜보면 hot reload가 게을러서 그런 게 아니라, 원래 그렇게 설계된 겁니다.
앱이 켜질 때마다 초기화를 처음부터 다시 돌리면, 열어둔 화면도 입력하던 폼도 다 날아갑니다.
그럼 hot reload의 존재 이유가 없어지죠.
상태를 지키려고 일부러 초기화를 안 건드리는 건데, 저는 그 배려를 버그로 오해한 겁니다.다시 안 도는 코드들의 목록
한 번 데고 나니 어떤 코드가 hot reload에서 조용히 무시되는지 정리가 됐습니다.
initState안에서 만든 값,main()에서 세팅하는 전역 설정,late final로 한 번만 계산되는 필드, 네이티브 쪽 설정, build_runner가 뽑아낸 생성 코드.
공통점은 "생애 한 번만 실행되도록 짜인 자리"라는 겁니다.class _HomeState extends State<Home> { late final _bootTime = DateTime.now(); // State가 살아 있으면 다시 안 구해집니다 @override void initState() { super.initState(); _resolveLocale(); // 이 화면이 처음 만들어질 때만 돕니다 } @override Widget build(BuildContext context) => Text('booted: $_bootTime'); }_bootTime을 다른 값으로 바꿔도, 그 State 객체가 트리에 살아 있는 한 새로 계산되지 않습니다.
hot reload가 State를 보존하기 때문입니다.
화면이 안 바뀌는 게 정상이었던 거죠.이 목록을 알고 나니, 반대로 hot reload가 잘 먹는 코드가 뭔지도 또렷해졌습니다.
build 메서드 안에서 위젯을 어떻게 배치하고 색을 어떻게 주는지, 그런 건 저장하자마자 바로 반영됩니다.
매번 다시 그려지는 자리니까요.
그래서 UI 모양을 다듬는 작업은 hot reload가 마법처럼 빠르고, 초기화 로직을 만지는 작업은 restart를 껴야 확인이 됩니다.
같은 파일 안이라도 어느 줄을 만지느냐에 따라 반영 방식이 달랐던 겁니다.화면이 안 바뀔 때 의심할 순서
그날 이후 저는 순서를 하나 바꿨습니다.
코드를 고쳤는데 화면이 그대로면, 예전엔 코드부터 의심했지만 이제는 "이거 initState나 전역 초기화 아니야?"를 먼저 봅니다.
맞으면 그냥 hot restart를 한 번 눌러봅니다.
restart는 앱을 처음부터 다시 켜니까 초기화 코드도 전부 다시 돕니다.
그 한 번으로 사라지는 버그라면, 애초에 버그가 아니었던 겁니다.이 구분이 은근히 시간을 아껴줍니다.
코드가 안 바뀐 게 아니라 화면이 옛 상태를 붙들고 있는 거라면, 아무리 print를 박아도 원인이 안 나옵니다.
print를 새로 넣는 것 자체는 build 밖 변경이 아니라 반영되긴 하는데, 정작 보고 싶은 초기화 값은 이미 굳어 있어서 로그가 예전 값만 계속 찍습니다.
그럼 저는 로그를 의심하다 또 시간을 씁니다.
restart 한 번이면 끝날 일을요.솔직히 이건 알고 나면 허무한 축에 듭니다.
한 시간을 태운 게 조금 아깝긴 한데(변명하자면 그날 좀 피곤했습니다), 대신 이제는 "고쳤는데 안 바뀐다"는 상황에서 코드를 의심하기 전에 도구를 먼저 의심합니다.
다음에 또 화면이 요지부동이면, 저는 아마 print를 박기 전에 restart를 한 번 눌러볼 겁니다.원문 기준
원문 기준: https://docs.flutter.dev/tools/hot-reload
확인일: 2026-07-01.
hot reload 지원 범위는 툴 업데이트로 바뀔 수 있어서, 올리기 전에 문서 표를 다시 확인합니다.728x90반응형'AI Agent > flutter' 카테고리의 다른 글
Flutter 모델 생성 코드는 소스가 아니라 산출물입니다 (0) 2026.07.04 context는 전역 변수가 아니라 트리 안의 위치입니다 (0) 2026.07.04 Flutter 터치는 콜백이 아니라 Gesture Arena에서 결정됩니다 (0) 2026.07.03 Flutter 성능은 16ms 프레임 예산을 쓰는 방식입니다 (0) 2026.07.03 Flutter 에러는 try/catch 하나로 잡히지 않습니다 (0) 2026.07.02