묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
질문있습니다.
basket screen에서 appBar에 뒤로가기 기능을 입혀보려고 합니다. 다른 페이지들은 가능한데, 장바구니 페이지에서는 뒤로가기 기능이 안되더라고요, paginationListview로 씌우고 <BasketITemModel>를 넣으려고 해서 안되는 것 같은데요, 이게 가능하도록 하려면 어떻게 해야할까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
강의 정리 자료같은것도 제공되면 정말 지구 1등 플러터 강의가 될거같아요
플러터 기본편 완강하고 너무 만족해서 중급도 들으러왔어요+_+ 근데 강의 내용을 정리한 PDF자료가 있으면 어떨까 하는 생각이 자꾸 들어요.... 이런것도 있으면 정말 지구 1등의 플러터 강의가 될 것 같아요! ! 있어야 한다 이건 아니고 그냥 수강생 한명의 의견입니다..... - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
처음부터 듣지않고, 중급만 듣고 있는데 문제가 있습니다.
중급부터 듣기 시작하니, 강의중에 말씀하신 이미지 같은것들을 어디서 받을수 있을까요? 코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
orderProvider 관련 질문이 있습니다.
선생님 안녕하세요. 완강 후 코드 뜯어보면서 복습 중입니다:) 주문 탭 클릭 시 곧바로 주문한 최신 리스트를 볼 수 있게하는 방법을 고민하다가 orderProvider를 들여다 보았는데요.곰곰히 생각해보니 postOrder만 해서는 orderProvider(orderStateNotifier)의 상태가 업데이트가 안되는 거 아닌가 하는 생각이 들었습니다. 그래서 forceRefetch하는 것처럼, postOrder 함수 하단에 true 반환하기 전에 paginate()를 실행하여 주문 탭 클릭시 곧바로 최신 리스트 뜨도록 했습니다.Future<bool> postOrder() async{ try{ final uuid = Uuid(); final id = uuid.v4(); final state = ref.read(basketProvider); final resp = await repository.postOrder( body: PostOrderBody( id: id, products: state.map((e) => PostOrderBodyProduct(productId: e.product.id, count: e.count)).toList(), totalPrice: state.fold(0, (pre, next) => pre + (next.product.price * next.count)), createdAt: DateTime.now().toString())); paginate(); return true; } catch(e){ return false; } }이렇게 하는 게 옳은 방법일까요? 그리고 굳이 forceRefetch를 통해서만 주문탭이 업데이트되게 하신 이유가 있을까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
맥북에서 에뮬, 시뮬레이터 오류들
안녕하세요, 수업 잘 듣고 있습니다.다름이 아니라 이번에는 제가 근무지 이동때문에데스크탑(윈도우)이 아닌 맥북(m1)으로 코딩을 공부하는 중입니다. 현재 가장 최신인 giraffe버전인데, 맥북에서 시뮬레이터로 코딩하면 크롬에서 스웨거도 잘 뜨고, 자동로그인도 잘되어 splashscreen페이지에서 바로 rootTab으로 넘어갑니다. 그런데 그 외의 서버에서 보내오는 이미지나 텍스트 데이터들이 전혀 뜨지 않아 무한 로딩을 합니다ㅠ 그래서 에뮬레이터를 돌려보려고 하니 파일 경로중에 알맞지 않은 문자가 있다는데, 아무리 봐도 '_'(아래바) 제외하고는 전혀 특수문자나 공백은 없습니다.. 에뮬도 안켜지고, 시뮬레이션에 데이터도 안떠서 답답하네요; 도움 구할 곳이 없어 도움 구해봅니다 ㅠ올 한해도 고생 많으셨고, 해피 크리스마스 입니다^^
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
GoRouter Redirection관련 질문이 있습니다..
안녕하세요? 강사님,중급강의 섹션 13. [Go Router v7] GoRouter 이론 중 "Redirection" 파트에 관련된 질문인데요. 9_login_screen.dart 파일(LoginScreen 클래스)에 코딩된 "authState"는router.dart파일에 코딩된 "authState"와 어떤 관계(?)인지를 모르겠습니다. 무슨말인가 하면 authState 변수는 LoginScreen 클래스내에서 별도로 선언을 해주지도 않았는데도 setStat를 이용해서 값을 ture, false로 바꿀 수 있는 것도 이상하고,이렇게 LoginScreen 클래스에서 변경된 authState값이 router.dart파일에서 인식(?)이 되는것도 이상합니다. 제 질문이 조금 무식해 보이긴 한데...제 질문 의도는 파악하셨으리라 생각되어서 답변 좀 부탁드리겠습니다...
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
basketProvider에서 patchBasket 함수 호출 시 에러가 발생합니다
제 코드는 아래와 같고,import 'package:advanced_app/product/model/product_model.dart'; import 'package:advanced_app/user/model/patch_basket_model.dart'; import 'package:advanced_app/user/model/basket_item_model.dart'; import 'package:advanced_app/user/repository/user_me_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:collection/collection.dart'; final basketProvider = StateNotifierProvider<BasketProvider, List<BasketItemModel>>((ref) { final repository = ref.watch(userMeRepositoryProvider); return BasketProvider(repository: repository); }); class BasketProvider extends StateNotifier<List<BasketItemModel>>{ final UserMeRepository repository; BasketProvider({ required this.repository, }):super([]); Future<void> patchBasket () async { await repository.patchBasket( body: PatchBasketBody( basket: state.map( (e) => PatchBasketBodyBasket( productID: e.product.id, count: e.count)) .toList()) ); } Future<void> addToBasket({ required ProductModel product,}) async { // 1 아직 장바구니에 해당 상품이 없는 경우 -> 추가 // 2 동일한 상품이 있는 경우 -> count +1 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(exists){ state = state .map( (e) => e.product.id == product.id ? e.copyWith(count: e.count +1) : e ).toList(); }else{ state = [ ...state, BasketItemModel( product: product, count:1) ]; } await patchBasket(); } Future<void> removeFromBasket({ required ProductModel product, bool isDelete = false}) async{ // isDelete면 count와 상관없이 삭제 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(!exists){ return; } // 이제 무조건 있는 경우 final existingProduct = state.firstWhere((element) => element.product.id == product.id); // 1개 있는 경우 삭제 (해당하는 상품 빼고 리스트 만들어서 넣어 주는 방식) if (existingProduct.count == 1 || isDelete){ state = state .where((e) => e.product.id != product.id) .toList(); } else{ // 2개 이상 있는 경우 state = state .map((e) => e.product.id == product.id? e.copyWith( count: e.count -1) : e).toList(); } } }에러 로그는 아래와 같습니다. --------------[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast#0 $BasketItemModelFromJson (package:advancedapp/user/model/basket_item_model.g.dart:11:54)#1 new BasketItemModel.fromJson (package:advanced_app/user/model/basket_item_model.dart:25:14)#2 UserMeRepository.patchBasket.<anonymous closure> (package:advancedapp/user/repository/user_me_repository.g.dart:93:45)#3 MappedListIterable.elementAt (dart:_internal/iterable.dart:415:31)#4 ListIterator.moveNext (dart:_internal/iterable.dart:344:26)#5 new GrowableList.ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)#6 new GrowableList.of (dart:core-patch/growablearray.dart:150:28)#7 new List.of (dart:core-patch/array_patch.dart:47:28)#8 ListIterable.toList (dart:_internal/iterable.dart:214:7)#9 UserMeRepository.patchBasket (package:advancedapp/user/repository/user_me_repository.g.dart:94:10)Postman에서 get http://127.0.0.1:3000/user/me/basket 실행해 보면,[ { "count": 1 } ]처럼 product가 제대로 안들어가고 count 값만 들어가 있습니다. jsonSerializable 문제인가 싶어서 모델들 다 체크해봤는데... 코드 제너레이션도 정상적으로 되는데... 뭐가 문제일까요? 이것 때문에 3시간 넘게 씨름 중인데 도움 주시면 감사하겠습니다!
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
이미지 404에러가 발생했습니다~~
══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════ The following NetworkImageLoadException was thrown resolving an image codec: HTTP request failed, statusCode: 404, http://10.0.2.2:3000/img/%EB%96%A1%EB%B3%B6%EC%9D%B4/%EB%96%A1%EB%B3%B6%EC%9D%B4.jpg When the exception was thrown, this was the stack: #0 NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:135:9) <asynchronous suspension> Image provider: NetworkImage("http://10.0.2.2:3000/img/떡볶이/떡볶이.jpg", scale: 1.0) Image key: NetworkImage("http://10.0.2.2:3000/img/떡볶이/떡볶이.jpg", scale: 1.0) ════════════════════════════════════════════════════════════════════════════════════════════════════어떻게 해야할까요..?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
패스워드 RSA 암호화 문의
강의에서는 패스워드를 암호화하지 않고 그냥 보내는 방식으로 설명해주셨는데요.Flutter 에서 패스워드를 RSA 암호화하고 서버에서 복호화 처리하는 방법으로 실제 프로젝트에서는 사용할 거 같습니다.Flutter 에서 RSA 암호화 하는 예제 코드 좀 부탁드리겠습니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
ID, PW 전송시, Base64 인코딩을 사용하는 이유가 궁금합니다.
질문의 내용은 제목과 동일합니다.아래는 제가 궁금해서 찾아본 내용입니다. Base64 인코딩은 텍스트형태로 데이터를 전송할 때 사용한다고 하더군요.저희는 HTTP 통신을 하게 되는데, HTTP 통신에서는 이진데이터 전송이 불가하다고 합니다. (버전별로 다 그런지 찾아본것은 아님)그래서 pdf 나 이미지 같은 이진 바이너리 파일을 전송하기 위해 Base64 를 사용한다고 이해를 했습니다.코드 상에서 String 형태의 문자열은 이미 문자열 형태라고 하는데.. ID, PW 를 Base64 인코딩하시는 이유가 있을까요?찾아본 바로는, 있다면 시스템간의 호환성 문제일거라고 생각하는데, 호환성 문제라고 찾았본 케이스들은 너무 예전 시스템이라고하니 와닿지 않네요. 찾아본 내용들은 책이 아니라, 인터넷에서 검색한 내용들이라 틀렸을 수도 있습니다.실무에서는 일반적으로 ID/PW에 대해 Base64 인코딩을 사용하는 것인가요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안드로이드 스튜디오 실기기 연결 질문입니다.
안녕하세요~ 딜리버리앱을 수없이 반복하며 나날이 하나씩 더 배워가고 있습니다^^;오늘은 제 실제 Z폴드5 기기에서 USB연결하여 에뮬레이터 구동을 해보려고 했습니다.그런데 앱은 실행이 되는데, 로그인에서 루트탭 페이지로 영 이동이 안되고 로그인 버튼이 회색으로 되었다가 다시 일정 시간이 지나면 원래의 초록 로그인 버튼으로 변경되기만 합니다.동일한 코드로 안드로이드 스튜디오 상의 에뮬레이터 작동시키면 문제없이 로그인이 패스되고 홈페이지로 이동합니다.해결할 수 있는 방법이 없을까요? 제 폰에서도 자유롭게 작동해보고 싶습니다,추가로 apk 앱으로 빌드해서 폰에 깔아봤는데 동일하게 로그인페이지에서 변화가 없었습니다. 이것은 왜그럴까요?
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
401 에러
splash screen에서 await Storage.write 하여 accessToken 을 작성해주었으나 그대로 401 에러 발생합니다. 아래 사진은 data가 없다고 하여 그대로 진행하였으나, 401에러로 인해 화면에 아무것도 보이지 않는 상황입니다
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
ClipRRect - borderRadius 적용시 이미지 미노출
안녕하세요 강사님강의 너무잘보고 있습니다. 레스토랑 카드 만드는 중에 이미지를 둥글게 주는 옵션을 추가하면 아래 캡쳐본 처럼 이미지가 노출되지 않습니다.borderRadius: BorderRadius.circular(10.0), 반면에 아래 부분은 주석처리하면 이미지가 잘 노출되구요.. asset에 파일이 없는 문제는 아닐꺼같은데 혹시 어떻게 해결할수잇을까요? 일시적인 버그가 아닐까하여 재시작은 여러번 해보았습니다 borderRadius: BorderRadius.circular(10.0), import 'package:flutter/material.dart'; class RestaurantCard extends StatelessWidget { // 이미지 final Widget image; // 레스토랑 이름 final String name; // 레스토랑 태그 final List<String> tags; // 평점 갯수 final int ratingCount; // 배송 걸리는 시간 final int deliveryTime; // 배송 비용 final int deliveryFee; // 평균 평점 final double rating; const RestaurantCard({ required this.image, required this.name, required this.tags, required this.ratingCount, required this.deliveryTime, required this.deliveryFee, required this.rating, super.key }); @override Widget build(BuildContext context) { return Column( children: [ // image, ClipRRect( // borderRadius: BorderRadius.circular(10.0), child: image, ), const SizedBox(height: 16.0), Text( name ), ], ); } } 참고사항restaurant_screen.dartimport 'package:flutter/material.dart'; import 'package:untitled2/restaurant/component/restaurant_card.dart'; class RestaurantScreen extends StatelessWidget { const RestaurantScreen({super.key}); @override Widget build(BuildContext context) { return Container( child: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: RestaurantCard( image: Image.asset( 'asset/img/food/ddeok_bok_gi.jpg', fit: BoxFit.cover ), name: '불타는 떡볶이', tags: ['떡볶이', '치즈', '매운맛'], ratingCount: 100, deliveryTime: 15, deliveryFee: 2000, rating: 4.52, ), ), ), ); } } - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.코드팩토리 디스코드https://bit.ly/3HzRzUMFlutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다!
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Dio에러 질문입니다.
안녕하세요!처음부터 「ProductCard작업하기 」강의까지 수업을 잘듣다가 에뮬레이터 새로고침 하는 도중에 로딩에서 갑자기 멈춰버렸습니다. (현상황)에러를 찾아보던중에 예전 수업에서 build.gradle파일의 minSdkVersion 부분에 「18」로 변경하라고 말씀하셨던거 같은데 현재 파일을 확인해 보니 「flutter.minSdkVersion」로 다시 돌아왔습니다. 이부분을 다시 「18」로 수정하고 프로그램을 실행하면 다시 「flutter.minSdkVersion」로 돌아가는데 어떻게 해결해야 하나요..??그리고 제가 생각하는 에러의 원인은 위의내용이라고 생각하는데 혹시 다른 원인이 있다면 알려주실수 있을실까요?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
dependency 설치 관련 질문입니다.
현재 강의를 들으며 여러 dependency를 설치하면서 작업을 하고있습니다만, 강의에서 보여지는 버전으로 설치하는게 좋을지 현재 최신버전을 설치하는게 좋을지 궁금합니다.
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
플러터 글자색, 카드색 질문
어느날 플러터를 오랜만에 켰더니 ElevatedButton 안에 있는 글자색과 Card의 배경색이 조금 푸른색으로 변경이 되어있습니다 당황해서 찾아보니 해결법도 잘 나오지 않고 이런 경우가 있었는지 궁금하네요
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
restaurant_repository.dart 파일 에러 원인이 뭘까요?
안녕하세요. 플러터 초보 개발자 입니다.강의 내용 잘 따라오다가 아래 그림에서 에러가 발생합니다. lib/restaurant/repository/restaurant_repository.dart:33:33: Error: The parameter 'paginationParams' of the method 'RestaurantRepository.paginate' has type 'PaginationParams', which does not match the corresponding type, 'PaginationParams?', in the overridden method, 'IBasePaginationRepository.paginate'. - 'PaginationParams' is from 'package:rest/common/model/pagination_params.dart' ('lib/common/model/pagination_params.dart').Change to a supertype of 'PaginationParams?', or, for a covariant parameter, a subtype. @Queries() PaginationParams paginationParams = const PaginationParams(), ^lib/common/repository/base_pagination_repository.dart:7:31: Context: This is the overridden method ('paginate'). Future<CursorPagination<T>> paginate({ ^Target kernel_snapshot failed: Exception
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Http Status Error [401]에 관하여 - go_router : ^7.0.1 사용
go_router 7.0.1 버전을 사용하여 강의를 진행 중에 있습니다.RefreshToken과 AccessToken은 Storage에서 지워진 상태입니다.해당 상태에서 두개의 토큰이 null로 확인되면 dio.dart에서 dioError를 호출하고 reject하는 부분까지는 확인을 했습니다. 그런데 여기서 SplashScreen으로 이동을 하지 않고 Home화면에서 데이터를 가져오지못했다는 메시지만 띄웁니다.로그 화면에도 보면 프로그램 실행 시 /restaurant을 호출하게 되는데 제가 코드에서 처리를 잘 못한건지 잘 모르겠습니다.제가 생각하기에는 /restaurant가 호출되기 전에 /user/me가 먼저 호출 되어, 토큰 값을 체크하고 그 다음에 토큰 값의 유무에 따라 화면이 전환이 되어야 된다고 생각이 드는데 제가 잘못 이해하고 있는가요? 코드는 git에 올려두었습니다.https://github.com/bluelf1004/study.git
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Provider 와 StateProvider의 사용에 관해.
강의 잘 듣고 있습니다. 한 가지 의문이 있어 글 올립니다. 강의 내용 중 provider.dart에서 final filterShoppingListProvider = Provider<List<ShoppingListItem>>((ref) { } 부분에서 final filterShoppingListProvider = StateProvider<List<ShoppingListItem>>((ref) { } 로 사용하면 어떻게 다를까요? Provider 안에 속한 Provider를 인지하기 위해 꼭 Provider를 사용한다는 걸까요?... 1회성은 StateProvider를 쓴다는 식으로 이해하면 되겠습니까?
-
해결됨[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
너무 어렵습니다 ㅜㅜ
작업기억이란게 한계가 있는데oop를 통한 상속의 상속의 인터페이스 물리고 물리고 물리고 물리는 제네릭타입 등단편적으로 보면 이해할수없고 모든 그림을 이해하고있어야 그나마 따라갈수 있는부분이라고 생각됩니다.그런데 20시간의 긴 강의이다보니 전체 배경을 모두 기억할수가 없는데요.클래스 이름도 너무 길고 비슷하게 레스토랑레파지토리프로바이더 이런식으로 되서 가독성이 너무 떨어져서 초보자 입장에서는 이해하기가 더욱힘듭니다.. 제생각에는 강의를 시작하기전에 해당 챕터의 핵심 플로우를 먼저 집고 넘어가고 너무 길거나 비슷한 클래스 이름들은 유니크하게 했으면 어떨까하는 아쉬움이 남습니다. 제가 멍청한건지 모르겠지만.. 코팩님 강의가 너무 유익해서 다음강의도 볼 의향이 있는데 혹시 다음강의를 찍게되신다면 저같은 사람도 배려해주셨으면 해서 이렇게 글 남겨드립니다.. 아 그리구 깃허브에서 rest 레파지토리를 클론해서 실행해보니 페이지네이션한 코드가 잘못된건지 서버에 애초에 데이터가 부족한건지 중복데이터를 가져오는것이 많은데요 페이지네이션은 문제 없는것 맞나요 ??