[Flutter] Hot Reload, Hot Restart

Angela Jeong·2024년 4월 30일

Hot Reload vs Hot Restart

핫 리로드, 핫 리스타트 기능은 앱의 변경되는 사항을 빠르게 반영하기 위해 지원하는 기능이다.


Hot Reload

  • 핫 리로드는 소스 코드의 변경 사항을 즉시 앱에 반영하되, 앱의 현재 상태를 유지하는 기능이다. (코드를 불러오고 위젯트리를 재빌드한다.)
  • 즉, 변수의 현재 값, 위젯 트리의 상태 등은 그대로 유지되면서 UI 변경 사항 또는 로직 변경 사항만 적용되는 것을 말한다.
  • 앱의 상태를 보전하기 때문에, main(), initState()를 재실행하지 않는다.

사용가능 예시)

  • UI의 디자인 변경, 로직 수정, 새로운 함수의 추가 등

단, Dialog 만들 땐 핫 리스타트/풀 리스타트를 하거나 Dialog를 끄고 핫 리로드!

나는 Dialog 만들때 핫 리로드를 하면 context 관련된 에러가 났다.
Dialog와 같은 모달은 특정 BuildContext를 사용하여 생성되는데 hot reload가 실행될 때, 위젯 트리를 재구성하면서 기존 dialog의 context가 더 이상 유효하지 않게 되거나 dialog에 연결된 위젯들이 예상과 다르게 초기화될 수 있다.

리스타트를 사용해야하거나 다이얼로그를 끈 후에 리로드를 해야하더라.


Hot Reload는 어떤 원리로 앱에 즉시 반영이 되는걸까?

Dart는 JIT 컴파일을 지원한다. 즉, 핫 리로드는 JIT 컴파일의 기능을 활용해 변경된 소스 코드만 컴파일하고 앱에 즉시 반영할 수 있게 되는 것이다.

*JIT(Just-In-Time) 컴파일: 코드의 변경 사항을 실시간으로 감지하고, 변경된 부분만을 동적으로 재컴파일하여 앱에 즉시 반영

*컴파일: 고급언어를 저급언어로 바꿔주는 과정
👉 컴파일이란?



Hot Restart

핫리스타트는 앱을 완전히 다시 시작하여 모든 상태를 초기화 하는 것이다. 앱의 모든 상태를 잃어버리고, 새로 시작하므로 main() 부터 호출된다.

사용 예시)

  • initState 메서드상에 변경
  • 폰트의 변경이나 추가
  • 제너릭과 열거형 클래스의 추가
  • 네이티브 코드변경
  • 앱 상태에 변경을 주는 코드 수정시

Full Restart

몇몇 특정 상황들에서는 Hot Restart로 수정사항이 앱에 반영되지 않으므로 앱을 완전히 끈 후에 다시 켜야 한다.

  • Kotlin, Java, C#, Swift 등의 네이티브 코드변경
  • 앱의 종료

0개의 댓글