책검색 앱 실습 강의 수강
data/model, data/repository, ui/pages(home/detail), widgets로 분리
Riverpod 추가 + ProviderScope 적용
AppBar에 TextField 검색창, 검색 아이콘 버튼
TextEditingController 사용 + dispose()로 정리
화면 탭 시 unfocus()로 키보드 닫기(UX)
GridView.builder + SliverGridDelegateWithFixedCrossAxisCount로 격자 레이아웃
이미지 탭 시 showModalBottomSheet 띄우기
BottomSheet 코드는 home_bottom_sheet.dart로 분리
flutter_inappwebview로 InAppWebView 띄워서 책 링크 페이지 표시
API Key 발급, ClientId/Secret은 노출 금지
Thunder Client로 요청 테스트
Book.fromJson / toJson
모델 변환 테스트
http 패키지로 GET 요청
try-catch로 예외 처리, statusCode == 200일 때만 파싱
HomeState(books)
search() 호출 시 repository 결과로 state 갱신
HomePage를 ConsumerStatefulWidget으로 변경
ref.watch(homeViewModelProvider)로 books 구독
ref.read(homeViewModelProvider.notifier).search(text)로 검색 실행
BottomSheet/DetailPage에 Book 전달해서 데이터 표시
DetailPage는 추가 상태 업데이트가 없어서 ViewModel 불필요 → 삭제