1. 데이터에 직접 접근해서 상태변화 시킬 수 있고 -> 닉네임 변경
-프리크롤링 문제가 있다. 한 위젯 때문제 중간 위젯들 쭉쭉타고가서 다 변화시켜야 하는데
프로바이더 쓰면 딱 그위젯만 변화시킬 수 있다.
2. 전역적인 상태관리가 가능하다는거다 -> 일기수, 친구수 등등
ㅡㅡㅡㅡㅡㅡ
그러면 프로바이더는 왜 쓰는거야? 따로 상태관리 기법을 쓰는 이유가 있어?
프로바이더(Provider)와 같은 상태 관리 라이브러리를 사용하는 이유는 앱이 복잡해질수록 StatefulWidget만으로는 효율적인 상태 관리가 어려워지기 때문입니다. 주요 이유들을 설명해 드리겠습니다:
프로바이더와 상태 관리 라이브러리를 사용하는 이유
- 깊은 위젯 트리에서의 데이터 전달 문제 해결:
- StatefulWidget만 사용하면 깊은 위젯 트리에서 데이터를 전달하기 위해 모든 중간 위젯을 통해 속성(props)을 전달해야 합니다(prop drilling).
- Provider는 위젯 트리 어디서나 필요한 곳에서 직접 데이터에 접근할 수 있게 해줍니다.
- 상태 관리 로직과 UI의 분리:
- StatefulWidget에서는 UI와 상태 관리 로직이 같은 클래스에 존재합니다.
- Provider를 사용하면 비즈니스 로직을 별도의 모델로 분리하여 코드를 더 깔끔하게 유지할 수 있습니다.
- 효율적인 리빌드:
- StatefulWidget에서 setState()를 호출하면 전체 위젯이 다시 빌드됩니다.
- Provider는 특정 데이터를 사용하는 위젯만 선택적으로 리빌드할 수 있어 성능이 향상됩니다.
- 전역 상태 관리:
- 앱 전체에서 접근해야 하는 데이터(사용자 정보, 앱 설정 등)를 관리하기 위해 필요합니다.
- StatefulWidget으로는 이런 전역 상태를 관리하기 어렵습니다.
- 상태 보존과 복원:
- Provider는 위젯이 트리에서 제거되어도 상태를 유지할 수 있게 해줍니다.
- 페이지 이동 후 돌아왔을 때 상태가 유지되어야 하는 경우 유용합니다.
- 복잡한 상태 관리 패턴 구현:
- 비동기 작업 처리, 데이터 캐싱, 에러 처리 등 복잡한 상태 관리 패턴을 쉽게 구현할 수 있습니다.
로바이더를 쓰는 가장큰 두가지 이유는 필요한 데이터에 직접 접근해서 변화시키는거와 전역관리가된다는거야?
네, 정확합니다! 프로바이더(Provider)를 사용하는 가장 큰 두 가지 이유는 바로 그것입니다:
프로바이더 사용의 두 가지 핵심 이유
1. 필요한 데이터에 직접 접근
- 프롭 드릴링(Prop Drilling) 문제 해결: 데이터를 여러 위젯 계층을 통해 전달할 필요 없이, 필요한 위젯에서 직접 데이터에 접근할 수 있습니다.
- 코드 간결성: 데이터 전달을 위한 불필요한 코드가 줄어들어 더 깔끔하고 읽기 쉬운 코드를 작성할 수 있습니다.
- 유지보수성 향상: 앱 구조가 변경되더라도 데이터 흐름을 크게 수정할 필요가 없습니다.
2. 전역 상태 관리
- 일관된 상태: 앱 전체에서 동일한 데이터에 접근하고 수정할 수 있습니다.
- 상태 지속성: 위젯이 트리에서 제거되어도 상태가 유지됩니다.
- 중앙 집중식 관리: 상태 관리 로직을 한 곳에서 관리하여 코드 중복을 줄이고 버그 발생 가능성을 감소시킵니다.
이러한 이유들로 인해 앱이 복잡해지고 규모가 커질수록 Provider와 같은 상태 관리 라이브러리의 필요성이 더욱 커집니다. 작은 앱에서는 StatefulWidget만으로도 충분할 수 있지만, 복잡한 앱에서는 이러한 상태 관리 솔루션이 개발 효율성과 앱 성능에 큰 차이를 만들어냅니다.
ㅡㅡㅡㅡㅡㅡ
데이터에 직접 접근한다는 뜻.
데이터에 직접 접근한다는 소리가 무슨 소린지 잘 이해가 안되네
프롭 드릴링(Prop Drilling) 문제와 직접 데이터 접근에 대해 더 쉽게 설명해 드리겠습니다.
프롭 드릴링 문제란?
프롭 드릴링은 데이터를 위젯 트리의 깊은 곳에 있는 위젯으로 전달하기 위해, 중간에 있는 모든 위젯을 통해 계속해서 데이터를 전달해야 하는 상황을 말합니다.
예시로 이해하기
다음과 같은 위젯 구조가 있다고 가정해 보겠습니다:
App
└── HomePage
└── MainContent
└── ProductSection
└── ProductList
└── ProductItem
└── BuyButton
사용자 정보(예: 로그인 상태)가 App 위젯에서 관리되고, 이 정보가 BuyButton에서 필요하다면:
프롭 드릴링 방식:
// App 위젯에서
HomePage(isLoggedIn: isLoggedIn)
// HomePage 위젯에서
MainContent(isLoggedIn: isLoggedIn)
// MainContent 위젯에서
ProductSection(isLoggedIn: isLoggedIn)
// ProductSection 위젯에서
ProductList(isLoggedIn: isLoggedIn)
// ProductList 위젯에서
ProductItem(isLoggedIn: isLoggedIn)
// ProductItem 위젯에서
BuyButton(isLoggedIn: isLoggedIn)
중간 위젯들(HomePage, MainContent, ProductSection, ProductList, ProductItem)은 실제로 isLoggedIn 데이터를 사용하지 않음에도 불구하고, 단지 아래 위젯으로 전달하기 위해 이 데이터를 받고 다시 전달해야 합니다.
프로바이더를 통한 직접 데이터 접근
프로바이더를 사용하면 데이터가 필요한 위젯이 중간 위젯들을 거치지 않고 직접 데이터에 접근할 수 있습니다.
프로바이더 방식:
// App 위젯에서 프로바이더 설정
ChangeNotifierProvider(
create: (_) => AuthModel(), // isLoggedIn 상태를 포함하는 모델
child: MaterialApp(...),
)
// 다른 중간 위젯들은 데이터를 전달할 필요 없음
// BuyButton 위젯에서 직접 데이터 접근
class BuyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 필요한 위젯에서 직접 데이터 사용
final isLoggedIn = context.watch<AuthModel>().isLoggedIn;
return ElevatedButton(
onPressed: isLoggedIn ? () => buyProduct() : () => loginFirst(),
child: Text('구매하기'),
);
}
}
이처럼 프로바이더를 사용하면:
- 중간 위젯들은 데이터 전달에 관여할 필요가 없음
- 데이터가 필요한 위젯만 해당 데이터에 직접 접근
- 위젯 구조가 변경되어도 데이터 흐름을 수정할 필요 없음
이것이 "직접 데이터 접근"의 의미입니다. 중간 단계를 거치지 않고, 필요한 위젯이 데이터 저장소(프로바이더)에 직접 연결되어 데이터를 읽거나 수정할 수 있는 것입니다.
'코딩 > 개념' 카테고리의 다른 글
블럭에서 스트림기반, 단방향처리에 관해서 (0) | 2025.04.12 |
---|---|
프로바이더 보다 블럭을 쓰는 이유 (1) | 2025.04.12 |
상태관리관점의 StatelessWidget vs StatefulWidget (0) | 2025.04.12 |
StatelessWidget vs StatefulWidget (1) | 2025.04.11 |
기술 스택이란 (1) | 2025.04.11 |