[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요 강의 너무 잘 듣고 있습니다. 강의를 쭉 따라오다가 글작성시 key를 리턴 받으려고 했는데 null 이 들어오길래 drift_database 파일로 와서 Future<int> 를 명시했는데요 (그전에는 요것을 제가 추가를 안해놓고 createdSchedule 부터 작성했었어요.) 그랬더니 아래와 같이 null 이 들어올 수 있다며 ? 를 붙이라고 에러가 나네요. 이것 처음에 디비 생성할 때부터 (Future<int>를 명시안해놓고 생성했기 때문에) 이미 잘못된 걸까요?
강사님 강의를 보고 최근에 프로젝트를 하다 궁금한게 생겨 질문 남기게 되었습니다. Product <-> Category Entity 다대다 매핑을 위해 product(OneToMany) <-> product_category(ManyToOne) <-> category(OneToMany) 위와 같은 테이블로 매핑한 상태이고 join 상속 전략으로 district_category 테이블도 생성 하였습니다. district_category를 쿼리 파라미터로 받고 해당 district_category를 갖고 있는 상품들을 검색하고 페이징을 하는 로직을 짠다고 했을때 두가지 방법이 생각났는데 둘 중 어느게 더 적합한지 모르겠습니다 검색어를 바탕으로 product_category에서 Product를 EntityGraph로 같이 찾은 후에 찾은 ProductCategory.getproduct() 와 같은 방식 SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return new ProductCategoryToProductPage(productCategoryRepository.findAllByCategory(pageable, category)); ProductCategoryRepository @EntityGraph(attributePaths = "product") Page<ProductCategory> findAllByCategory(Pageable pageable, Category category); ProductCategoryToProduct public ProductCategoryToProductPage(Page<ProductCategory> page) { this.content.addAll(page.getContent().stream() .map(ProductCategory::getProduct) .map(ProductListGetResponseDTO::new) .collect(toList())); this.totalPages = page.getTotalPages(); this.totalElements = page.getTotalElements(); this.pageNumber = page.getNumber() + 1; this.size = page.getSize(); } 발생 쿼리문 select districtca0_.category_id as category2_1_, districtca0_1_.parent_id as parent_i3_1_, districtca0_.district_enum as district1_2_ from district_category districtca0_ inner join category districtca0_1_ on districtca0_.category_id=districtca0_1_.category_id where districtca0_.district_enum=? select productcat0_.product_category_id as product_1_8_0_, product1_.product_id as product_1_7_1_, productcat0_.category_id as category2_8_0_, productcat0_.product_id as product_3_8_0_, product1_.created_date as created_2_7_1_, product1_.content_detail as content_3_7_1_, product1_.product_content as product_4_7_1_, product1_.product_name as product_5_7_1_, product1_.product_price as product_6_7_1_, product1_.product_status as product_7_7_1_, product1_.product_thumbnail as product_8_7_1_ from product_category productcat0_ left outer join product product1_ on productcat0_.product_id=product1_.product_id where productcat0_.category_id=? limit ? select count(productcat0_.product_category_id) as col_0_0_ from product_category productcat0_ where productcat0_.category_id=? 검색어를 바탕으로 product에서 직접 찾기 (데이터 뻥튀기의 문제는 쿼리dsl 이용 productId로 groupBy로 해결) 글 쓰고 생각해보니 A카테고리는 B라는 상품 안에서는 하나밖에 있을 수가 없으니 굳이 groupBy를 안써도 될거 같네요 SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return productRepository.findAllByCategory(pageable, category); ProductRepository @Override public Page<Product> findAllByCategory(Pageable pageable, Category category) { List<Product> content = queryFactory.selectFrom(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .groupBy(product.productId) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); Long total = queryFactory .select(Wildcard.count) .from(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .fetchOne(); return new PageImpl<>(content, pageable, total); } 발생 쿼리문 select districtca0_.category_id as category2_1_, districtca0_1_.parent_id as parent_i3_1_, districtca0_.district_enum as district1_2_ from district_category districtca0_ inner join category districtca0_1_ on districtca0_.category_id=districtca0_1_.category_id where districtca0_.district_enum=? select product0_.product_id as product_1_7_, product0_.created_date as created_2_7_, product0_.content_detail as content_3_7_, product0_.product_content as product_4_7_, product0_.product_name as product_5_7_, product0_.product_price as product_6_7_, product0_.product_status as product_7_7_, product0_.product_thumbnail as product_8_7_ from product product0_ inner join product_category productcat1_ on product0_.product_id=productcat1_.product_id where productcat1_.category_id=? group by product0_.product_id limit ? select count(*) as col_0_0_ from product product0_ inner join product_category productcat1_ on product0_.product_id=productcat1_.product_id where productcat1_.category_id=?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요 영한님, 강의 잘 듣고 있습니다! 강의에서 JPA가 생성해준 테이블을 그대로 쓰면 안되고, JPA가 쓴 DDL을 다듬어서 쓴다고 하셨는데 생각해보니 저는 토이프로젝트에서 항상 JPA가 만들어주는 그대로 썼던 것 같습니다. 그렇다면 지금 예제에서는 어떤 점을 보완하는게 필요할까요? 감사합니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요! 앱 만들어보고 싶어서 수강신청을 하게됐습니다. 반갑습니다ㅎㅎ 빌드 환경에서 궁금한게 있습니다...! Windows에서 작업한 프로젝트를 그대로 Ios에서 빌드용 프로젝트로 사용이 가능한가요? 혹시 IOS에서는 IOS 빌드 및 출시와 Android 빌드 및 출시 두 개 다 가능한가요? 만약에 2번 경우가 가능하면 아에 맥북을 사는 것도 고려를 해봐야할것같네요...ㅎㅎ 그럼 중급수업까지 잘 들어보겠습니다. 감사합니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
FutureBuider if문 해석 질문 FutureBuilder에서 if(snapshot.hasData && startTime == null){ } 이 부분이 이해가 가지 않습니다. 강의에서는 "데이터는 존재하지만 우리가 한번도 startTime을 설정하지 않았을 경우"라고 조건을 해석해주셨는데, 우리가 만약 스케줄 카드 내용을 수정하는 경우라면 분명 startTime(시작시간)라는 변수에 몇시인지 입력이 되어있는 상태일텐데 왜 startTime을 설정하지 않았을 경우를 고려해야 하는지 몇번을 돌려봐도 이해가 잘 안됩니다. initialValue 질문 initialValue에서 왜 기본값을 꼭 지정해주어야만 스케줄 카드 내용을 수정할 수 있는지 정확히 이해가 가지 않습니다. 만약 기본값이 안되어있다면 아예 카드 내용을 수정할 수 없는지 궁금합니다. widget. 질문 이부분은 전부터 계속 궁금했는데, 어떤 변수에는 widget을 붙이는 경우가 많던데 특별히 widget이 필요한 변수인지 확인할 수 있나요? 답변 부탁드립니다...
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요 선생님. 플러터 공부 중에 궁금한 것이 있어 문의드렸습니다. 부모 위젯에서 Voidcallback파라미터로 함수를 불러오고, 그 함수를 버튼 위젯의 onpressed에서 불러와서 활용할 수 있다는 것을 활용하여 자식 위젯에서의 함수와 함께 onpressed에서 부모위젯의 함수를 사용하고자 코드를 작성해보았습니다. 오류 없이 실행되긴 하지만, 부모위젯에서 가져온 voidcallback함수가 작동하지 않습니다. 어떻게 해야 버튼을 눌렀을 때, 자식 위젯에서의 함수와 부모위젯에서의 함수를 함께 실행할 수 있나요? 부모위젯과 자식 위젯 모두 Stateful함수이고, 부모위젯에서 가져온 함수는 이 함수이며, 자식위젯에서 함께 실행하고자 하는 함수는 위와 같습니다.
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
저 vs code를 사용중인데, 코팩님처럼 코드 자동완성을 하고 싶은데요... 방법을 모르겠어요... 이런저런 확장을 다 깔아봐도 잘 안돼요... Navigator.of(까지만 쳐도 context)똭 나오고 MaterialPageRoute( 까지만 치니까 안에 파라미터로 뭘 넣어야하는지 포맷까지 똭 나오는 그런 거... vs 코드는 안되는 건가요? ㅠㅠ 그냥 공부하는 거랑은 상관 없는 얘기긴 한데 은근히 불편해서... 답변해주시면 감사하겠습니다.. ^^ 기다릴게용 ㅎ
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
지금 flutter 3.7상태에서는 바로 Badge를 사용하지 못합니다 Flutter 3.7에서는 Badge 위젯이 Material 라이브러리에 도입되었으므로 모호한 가져오기를 피하려면 다음과 같이 패키지를 가져와야 합니다. import 'package:badges/badges.dart' as badges; 그런 다음 "Badge" 위젯 대신 "badges.Badge" 위젯을 사용합니다. 이 패키지의 모든 클래스에 대해 동일합니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요. 모바일 앱에서 블루투스로 헤드셋과 연결 후, 헤드셋 신호를 받아 스마트폰 내부의 음악을 실행하는 프로젝트를 하고 있습니다. 모바일 앱 쪽 담당이구요. 블루투스 신호는 잘 받아서, 이 신호가 play , pause, seek등은 구별할 수 있습니다. 다만, 고객사 요청사항은 특정음악을 실행하는 음악플레이어를 만들어 달라는게 아니라, 사용자가 방금 들었던 플레이어의 음악을 재생하거나, 사용한 음악플레이어가 없을때는 스마트폰 내부의 가장 최근 다운받은 음악을 실행시켜 달라는 것입니다. 그런데, pub.dev 검색해보면, 음악플레이어를 만드는 라이브러리는 많은데, 가장 최근에 오픈한 음악플레이어를 찾아서 재생하는 방법은 없는 것 같습니다. audio session 이 그역할을 할 것 같기도 한데, 정확하지는 않구요. 해결책을 찾고 싶어, 강사님 조언을 듣고자 질문 올립니다. <요약> flutter 앱에서 버튼을 클릭하면, 가장최근 실행된 음악플레이어 (유튜브, 유튜브뮤직, 멜론, 기본 플레이어 등) 를 실행시키고 음악을 재생하는 방법, 플레이어가 실행되지 않았다면, 가장 최근 다운받은 mp3 등의 음악파일을 실행하는 방법을 알고 싶습니다.
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
제가 생각한 벡엔드는 메인서버 데이터베이스에 모든 자료를 저장해 놓고 유저가 요청하는 경우에 필요한 자료를 전송하는 것이라고 생각했는데 sql 강의를 보니 사용자 앱에 자료가 저장되는 것 같아 헷갈리네요. getApplicationDocumansDirectory()라고 하는것을 볼때 사용자의 앱 내에 데이터를 저장하는 것 같은데 벡엔드 서버 구성은 따로 어떻게 되는건지 알고싶습니다
안녕하세요 나도코딩 선생님...ㅎ 몇 주전에 나도코딩 자바편 강의를 완강하고 다시 2회차로 강의를 듣는 중입니다...ㅎ 추상 클래스 (abstract class)와 인터페이스(interface) 관련 강의를 들으면서 각각의 특징들 및 차이점들에 대해서 다시 조금씩 알아가고 있는데... (예를 들면, 추상클래스는 abstract 키워드를 가지고, abstract메소드를 가지고 있어서 객체를 생성할 수 없는 반면, 인터페이스(interface)는 보통 -able 키워드, 변수 X, 생성자 X, 오로지 메소드만 있다 등) 이 둘, 그러니까 추상 클래스 (abstract class)와 인터페이스(interface)는 '어느 때 (또는 어느 시점)'에 활용하는게 가장 적절한지 디테일하게 알 수 없을까요? 항상 좋은 강의와 답변 감사합니다...ㅎ
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요! 중급 강의 따라가던 중에 궁금한 게 있어 질문드려요. Product_Card.dart 파일을 수정하실때, ProductCard 클래스에 RestaurantProductModel의 멤버들을 다 변수로 지정하셨잖아요? 그런데 그냥 RestaurantProductModel을 변수로 넣고 그냥 모델을 받아버리면 안되나요? class ProductCard extends StatelessWidget { final ProductModel model; const ProductCard({ required this.model, super.key, }); 이렇게 하고 디테일 스크린에서 ProductCard를 그냥 넘겨주는 식으로 해봤는데, 일단 동작하는 건 같더라구요. 그런데 이렇게 하지 않으신 데에는 무슨 다른 이유가 있으신건지 궁금합니다! 혹시 제 마음대로 했다가 나중에 문제가 생기진 않을까 걱정이 되어서... 답변기다리겠습니다. 감사합니다! ^^