[Flutter/Decoding Flutter] 위젯은 생명 주기를 가지고 있을까?(Life of a Widget?!)

작성 날짜:

최근 업데이트 날짜:

Decoding Flutter 유튜브 영상


위젯은 생명 주기를 가지고 있을까?

Android나 iOS를 접했던 사람이 Flutter를 배우게 되면, Android의 Activity나 iOS의 ViewController에 대해 이미 알고 있는 내용을 위젯에 적용하려고 한다. 이는 Flutter에서 Activity, ViewController와 제일 비슷한 것이 위젯이기 때문이다. Activity, ViewController는 생명 주기를 가지고 있다. 그렇다면 Flutter의 위젯 또한 생명 주기를 가지고 있을까?

이 부분을 이해하기 위해선 위젯이 무엇인지 정확히 알아야하고 Activity, ViewController와 어떻게 다른지를 이해해야 한다.

다단 케이크 예시

예시를 통해 설명해보겠다. 만약 다단 케이크를 만들려고 한다고 생각해보자. 한순간에 케이크를 완성할 수 없다. 레시피를 따라서 반죽을 하고 한층 한층을 구워서 쌓아야 한다. 케이크를 완성한 후에 보니, 레시피에 문제가 있다고 생각할 수 있다. 그러면 기존 레시피를 수정할 것이다. 이때 이미 완성한 케이크에 바꾼 레시피를 적용할 수는 없지만 다음에 만들 케이크는 바꾼 레시피대로 만들 수 있다.

왜 이런 얘기를 할까? 바로 Flutter 앱이 위에서 말하는 케이크에 해당하기 때문이다. 그리고 위젯은 레시피와 같다. 레시피를 사용하여 케이크를 만드는 것처럼 Flutter는 위젯을 사용하여 앱을 만든다.

이미 완성한 케이크에 수정한 레시피를 적용할 수 없다. 이미 완성된 케이크에 사용된 레시피는 변경할 수 없다고 표현할 수도 있겠다. 이와 마찬가지로 이미 만들어진 Flutter 앱의 위젯은 변경할 수 없다.

이벤트에 대한 반응

하지만 앱은 이벤트에 반응해야 하기 때문에 위젯을 변경하는 방법이 필요하다. 위젯은 한번 만들었으면 변경할 수 없는데 말이다.

Flutter는 케이크의 모든 부분을 다시 굽는 방법으로 이 문제를 해결한다. 앱에 변경 사항이 있을 때, 기존 위젯을 버리고 새로운 위젯 세트를 Flutter에게 제공하게 사용한다. 이는 매우 많은 작업이 필요할 것처럼 들리지만, Flutter는 위젯들 간의 관계와 위치가 어떻게 되는지, 상태에 기반하여 재빌드가 필요한지, 스크린 업데이트가 필요한지 등을 계속해서 트래킹하여 위젯 업데이트를 굉장히 효율적으로 처리할 수 있기 때문에 괜찮다.

그러면 여기까지 들었을 때, 위젯은 생명 주기를 가지고 있는 것일까? 그렇지 않다. 위젯은 한번 만들어지면 변하지 않고 그 후 버려지는 과정만 있기 때문에 생명 주기라고 할 것이 없다.

잠깐. 여기서 의문점이 생기는 사람들이 많을 것이다. ‘StatefulWidget에서 생명 주기 개념이 있지 않았나? initState()메소드도 있고 dispose() 메소드도 있잖아?’하고 생각할 수 있다.(사실 본인이 그렇게 생각했다ㅎㅎㅎ...)

위젯의 생명주기 vs 상태의 생명주기

두가지가 헷갈릴 수 있다. 하지만 엄밀히 따지면 여기서 다루는 것이 위젯의 생명 주기이고, StatefulWidget과 관련된 개념은 위젯이 아니라 상태(state)의 생명 주기이다.

앱에 변경 사항이 생겼을 때, 이전 위젯을 계속 사용하지 않고 폐기한 후에 build() 메소드를 호출하여 새로 만든다. 위젯에는 그저 위젯의 모양을 만들어주는 build() 메소드 하나만 있는 것이다. 따라서 위에서 말했듯이, 위젯은 단순히 화면에 무엇을 그리는가에 지나지 않고, 생명 주기를 갖지 않는다.

반대로 앱에 변경 사항이 생겼을 때, 상태는 폐기되지 않으며 계속 유지된다. 상태에는 createState(), setState(), dispose() 등 다양한 메소드가 있고, 각 메소드를 호출하는 다양한 생명 주기가 존재한다.

댓글남기기