춘기IT/춘기개발

Flutter: GetX 상태관리

화춘기 2025. 7. 3. 17:55

Flutter 개발을 하다 보면 점점 복잡한 상태 관리, 라우팅, 의존성 주입 등의 이슈들이 발생합니다.

이러한 문제를 간단한 문법으로 해결해 주는 라이브러리가 GetX입니다.

GetX에 대해 알아보겠습니다.

 

🚀 GetX

- GetX는 Flutter에서 가볍고 빠른 상태관리 도구 중 하나로,

   단순한 상태관리부터 라우팅, 의존성 주입까지 가능한 솔루션입니다.

 

  • 간단한 API: 간단하고 직관적인 API 제공 → 학습 곡선을 줄이고 빠른 개발을 가능하게 함 / 상태 관리를 위해 복잡한 코드를 작성할 필요가 없음
  • 성능 최적화: 리액티브 프로그래밍을 지원하여 상태 변화 시에만 UI를 갱신 → 불필요한 리빌드 최소화 / 애플리케이션 성능 최적화
  • 의존성 주입: 의존성 주입 기능 제공으로 객체의 생명주기 관리할 수 있음 → 의존성 관리와 객체 재사용성을 높여줌
  • 라우팅 관리: 내장된 라우팅 기능을 통해 간편하게 내비게이션을 관리할 수 있음 → 코드의 가독성을 높이고 네비게이션을 보다 쉽게 처리할 수 있게 함

🚀 GetX 장점

장점 설명
퍼포먼스 불필요한 rebuild 최소화 (Obx, GetBuilder 분리 렌더링)
코드량 감소 별도의 Provider, InheritedWidget 없이 상태관리 가능
통합 기능 상태 + 라우팅 + 의존성 주입까지 한번에 해결
러닝커브 낮음 문법이 매우 직관적 (초보자도 빠르게 적용 가능)

 

🚀 GetX의 3대 핵심 기능

기능 설명
State Management 반응형 상태관리 (.obs, update(), GetBuilder)
Route Management 간단한 라우팅, 네임드 라우트 지원
Dependency Injection 전역 컨트롤러 관리, 서비스 주입 간편

 

🔧 GetX 설치

//Terminal 입력

flutter pub add get
//pubspec.yaml 확인

get: ^4.6.6

 

ㄴ pubspec.yaml 파일에서 위와 같이 보인다면 정상적으로 GetX가 설치된 것입니다.

 

🔧 GetX에서 Controller

- GetX에서 중앙 집중 상태는 컨트롤러(Controller)를 통해 관리됩니다.

   이 컨트롤러는 앱 전체에서 접근 가능한 전역 상태 객체이며,

   필요에 따라 최상위 위젯에서 Get.put()으로 등록하거나, 이후 특정 시점에 Get.lazyPut() 등을 통해 주입할 수 있습니다.
  즉, 위젯 트리 하위에 직접 속한다기보다는 독립적으로 주입되어 앱 전역에서 재사용되는 상태 객체라고 이해하면 됩니다.

 

🔧 컨트롤러 등록

- 컨트롤러를 등록하기 위해서는 컨트롤러를 만들어줘야 합니다.

   ㄴ 상태 컨트롤러 명명은 매우 중요하므로 어떤 상태를 관리할지 고려해서 명명하시기 바랍니다.

       ㄴ 예) 상품관리컨트롤러: product_controller.dart

// 1.product_controller.dart 생성 > class ProductController {}

// 2.GetxController 상속

import 'package:get/get.dart';

class ProductController extends GetxController{}

 

ㄴ 이렇게 작성하면, 상태 관리를 할 수 있는 클래스가 되었습니다.

//의존성 주입 (↑상태 관리를 어디서든지 접근 가능하도록 등록)
//main.dart 파일 > build 함수 내 작성

Get.put(ProductController());

 

 

⚙️ GetX 상태관리 방식 3가지

방식 설명 특징
Obx 반응형 변수 (.obs)를 이용 가장 간단하고 직관적
GetBuilder 명시적으로 update() 호출 퍼포먼스 최적화 유리
GetX 컨트롤러 타입을 명시 타입 안전, Rx 가능
// GetBuilder 사용 예시

GetBuilder<CounterController>(
  builder: (controller) => Text('${controller.count}'),
);

 

 

⚙️ 간단한 라우팅 관리

Get.to(DetailPage());          // 다음 페이지 이동
Get.back();                    // 이전 페이지로 돌아가기
Get.offAllNamed('/home');      // 모든 스택 제거하고 이동
// main.dart에서 라우트 등록

GetMaterialApp(
  initialRoute: '/',
  getPages: [
    GetPage(name: '/', page: () => HomePage()),
    GetPage(name: '/detail', page: () => DetailPage()),
  ],
);

 

 

⚙️ 의존성 주입

// Controller 등록

Get.put(CartController());       // 일반적인 주입
Get.lazyPut(() => CartController());  // 필요할 때 생성
Get.find<CartController>();     // 이미 등록된 컨트롤러 가져오기
//의존성 영구적 유지 설정

Get.put(ProductController(), permanent: true);

 

 

🚀 GetX 단점

단점 설명
구조적 제약 적음 너무 자유롭다보니 대형 프로젝트에서 설계가 무너지기 쉬움
예측 불가능성 무분별한 전역 변수 사용 시 디버깅 어려움
테스트성 Bloc/Riverpod에 비해 테스트 구조 설계가 명확하지 않음

 

이러한 이유로 GetX는 소규모 앱이나 MVP 개발에는 최적이나

대규모 앱에서는 아키텍처 설계와 함께 신중히 사용하는 것이 좋습니다.