[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요? 우선 알찬 강의를 제공해 주시고, 열심 성의껏 지식을 나눠주셔서 감사의 말씀 먼저 드립니다. 다름이 아니라, Provider와 Notifier의 관계를 제가 아직 다 이해를 못해서 그런건지, 오류는 아닙니다만, 혼란스러워서 질문을 드립니다. StateProvider 사용 시 StateNotifer를 상속한 사용자 정의 StateNotifier를 먼저 정의하고, 해당 사용자정의 StateNotifer를 사용하는 StateProvider를 선언한다고 이론강의에서 배웠는데, 아래 소스를 보면 선언을 사용자정의 StateNotifer를 네이밍해야 할거 같은데 StateNotifer를 상속한 Provider 라고 네이밍 해서 이게 맞는 표현일까? 아니면 예제와는 틀리게 사용된 경우일까? 혼란스러워 질문 드립니다. <pagination_provider.dart> class PaginationProvider<T extends IModelWithId, U extends IBasePaginationRepository<T>> extends StateNotifier<CursorPaginationBase> { 아래 소스도 위 Provider를 상속한 Notifer라고 되어 있어서 이 부분도 이론 예제에는 안나와 있는 경우인지 질문을 드립니다. <restaurant_rating_provider.dart> class RestaurantRatingStateNotifier extends PaginationProvider<RatingModel, RestaurantRatingRepository> { RestaurantRatingStateNotifier({ required super.repository, }); }
안녕하세요~ 강의 중 처음에 order 들을 조회하는 api 가 무한 루프를 도는 이유가 궁금해서 질문을 올리게 되었습니다 (6분 30초 ~ 7분 부분) 우선, Order > Member > Order 조회 의 순으로 일어나기 때문에 무한 루프가 발생한다고 설명해주셨습니다. 이 때, Order 는 member 가 Lazy 설정이 되어 있고, Member 에도 List<Order> 를 가져오는 것이 Lazy 로 설정이 되어 있습니다 (@OneToMany 이기 때문) . [모든 order 를 조회하라] 라는 로직에 member 를 join 해서 가져오기 대문에, Order 가 Member 를 조회해서 가져오는 부분은 이해를 하였습니다. 쿼리도 다음과 같이 나가더라구요! 2023-01-15 18:08:52.603 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select order0_.order_id as order_id1_6_, order0_.delivery_id as delivery4_6_, order0_.member_id as member_i5_6_, order0_.order_date as order_da2_6_, order0_.status as status3_6_ from orders order0_ inner join member member1_ on ( order0_.member_id=member1_.member_id ) 2023-01-15 18:08:52.713 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select member0_.member_id as member_i1_4_0_, member0_.city as city2_4_0_, member0_.street as street3_4_0_, member0_.name as name4_4_0_ from member member0_ where member0_.member_id=? 2023-01-15 18:08:52.722 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select orders0_.member_id as member_i5_6_0_, orders0_.order_id as order_id1_6_0_, orders0_.order_id as order_id1_6_1_, orders0_.delivery_id as delivery4_6_1_, orders0_.member_id as member_i5_6_1_, orders0_.order_date as order_da2_6_1_, orders0_.status as status3_6_1_ from orders orders0_ where orders0_.member_id=? 첫번째 쿼리로 join 을 하는데, <이후 호출>에 의하여 두, 세번째 쿼리가 나가는 것 같습니다. 이 때, 각각의 멤버의 정보를 불러오기 위하여 member 쿼리가 나가는 것은 이해가 되는데, orderItem 이 LAZY 임에도 쿼리가 또 나가는 이유가 궁금합니다. response 가 나가는 과정에서 Json 형성을 위해 ObjectMapper 가 getMember, getOrderItem 등을 수행하는 것으로 알고 있는데, 이 때 불러오기 때문일까요?? 2. ObjectMapper 가 무시할 수 있도록 다음과 같이 변경후 실행시켜 보았습니다. @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); 이렇게 될 시엔 다음과 같이 Serializable 관련 에러가 발생하는 것 같았습니다. 그랬더니 두번재 쿼리까지만 나가긴 하는데, 다음과 같은 에러가 발생합니다. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.example.actualjpa.domain.Order["member"]->com.example.actualjpa.domain.Member$HibernateProxy$jMkxupIu["hibernateLazyInitializer"]) 검색을 해보니 프록시 객체를 Serialize 하려고 했다는 에러가 발생하는 것 같은데, orders 에 프록시 값들이 들어있는게 맞을까요? 반대인 경우에는 DB 에 FK값이 있기 때문에 id 값만을 가지고 Proxy 객체를 형성한다는 점을 완전히 이해를 했었는데, 이와 같은 경우에는 각 ID 값이 DB에 없기 때문에, Member만 조회시 orders 내의 Order 들에 대한 프록시도 없고 아예 아무 정보도 없겠구나 라고 이해를 했었습니다. 즉, 레이지일 경우 Member만 조회시 orders 에 대한 정보는 Member 객체에 없다 라고 이해를 했었습니다. @JsonIgnore를 해서 조회같은걸 할 수 없도록 했음에도, 위와 같은 에러가 발생하는 이유가 어떤건지 알 수 있을까요?? ========================= 위 질문에 대한 수정사항: 제가 질문한 바로 뒷내용이 JsonIgnore 설정해주시고 같은 에러에 대해서 설명해주시는 부분 확인했습니다 ㅠㅠ 프록시 객체 때문에 발생하는 에러가 맞네요. 그래도 같은 질문을 드리고 싶은데, 1:N 관계에서 Proxy 객체에 대해서 조금 이해가 안되었습니다(JPA 강의 완강했습니다). Apple 과 Tree 라는 N:1 관계에서 살펴보면 (양방향 모두LAZY 설정시) , Apple Entity 내의 private Tree tree가 있을 것이고, APPLE DB에는 외래키값으로 tree_id 가 들어가있을 것이기 때문에 그 값을 토대로 프록시 객체를 형성해 놓는다는 사실은 잘 이해하였습니다. 하지만 그 반대일 경우 에 대해서 이해를 못한 것 같습니다 (JPA 강의에서도 반대에 대한 프록시 구성 설명은 없었던 것 같습니다 ㅠ). 반대의 경우 Tree DB 안에는 Apple 을 외래키값으로 가지고 있지 않은데, 어떻게 프록시 객체를 형성해 놓는 걸까요?? (프록시 객체를 형성해 놓기 때문에 위 2번과 같은 상황이 발생한 것으로 보입니다). 다음과 같은 예제를 설정해보았습니다. @Test @DisplayName("1:N에서 1이 N List를 조회시 :: LAZY LOADING 의 타입은 Proxy") void test2() { Tree findTree = em.find(Tree.class, tree.getId()); System.out.println("findTree.getApples().get(0).getClass() = " + findTree.getApples().get(0).getClass()); } 이 때, em.find 만 해서 tree 를 조회하였을 경우 쿼리가 Tree 만을 조회하도록 나가는 것은 확인했습니다. 하지만, 그 아래 get(0) 를 수행하는 순간 "Apple 테이블에서 Tree_ID={tree_id} 인 값을 찾아와라" 라고 쿼리 문이 나가는 것을 확인했습니다. (getClass 를 통해 프록시가 맞는지 확인하려 했으나, get() 을 하는 순간 select 가 나가서 확인하지 못했습니다) 즉, Apple 에서 Tree 프록시를 형성할 때는 Apple DB에 있는 외래키를 통해 Tree Proxy 에 PK 값을 넣어준 상태로 프록시를 형성하였는데, Tree 에서 Apple 들의 프록시를 형성할 때는 외래키가 없으므로, 그냥 자신의 PK 값을 통해 Apple 의 외래키 값을 넣어준 상태로 프록시를 형성해 둔다(??). 이렇게 정리되는게 맞는 걸까요? 질문이 너무 기네요.... 계속 붙이다 보니 .... 죄송합니다. 2번 질문은 그냥 아래 수정사항 이후 질문이라고 봐주시면 될 것 같습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요 수업 내용은 아니고 문법관련 질문입니다. 3분 15초 경 memberRowMapper()메서드를 생성하는데요. 여기서 return대상은 new RowMapper()로 클래스인 것으로 이해했습니다. 근데 그 후에 어째서 mapRow메서드를 다시 선언할 수 있는거죠? RowMapper가 클래스가 아닌건가요? 람다식으로 선언할 수 있는 거 보면 RowMapper()가 메서드일 수도 있는 거 같은데, 그렇다면 new키워드는 왜 쓰는 건가요? 죄송합니다. 제가 기본 문법이 많이 부족한 상태에서 수강하고 있어요. 제가 모르는 것이 무엇인지도 모르는 상태에서 질문을 드려서 질문이 굉장히 난잡하네요. 다시 정리하자면, RowMapper()클래스를 반환하는 코드에 어떻게 다른 메서드(mapRow())를 선언할 수 있는지 궁금합니다.
CRM ios app을 제작하였습니다. swift 언어를 사용하였고, storyboard 방식으로 제작하였습니다. 플러그인으로 onesignal(푸시알림 서비스)를 붙였고, 현재 애플 공식 개발자 계정이 존재합니다. CRM을 App Store가 아닌, 직원들에게 직접 설치해주려고 합니다. 어떤 방법을 사용해야 하는지 질문드립니다. *참고: 스타트업이라, Enterprise용 계정이 아닌 일반 개발자 계정입니다. 즉 직접 설치 방법 중Enterprise 방식은 사용할 수 없습니다. **참고2: Xcode로 build하여 아이폰에 설치해봤는데요, 개발자 모드 없이는 실행이 안됩니다. (다른 분들에게 항상 개발자 모드를 켜놓으라 할 수는 없어서...) 그래서 Xcode 빌드 외에 방법을 찾고 있습니다...
n=int(input()) a=list(map(int, input().split())) m=int(input()) b=list(map(int, input().split())) res=list(a+b) res.sort() print(res) for i in range(len(res)): print(res[i], end=' ') 이런식으로 문제를 풀어도 문제가 없을까요?
강의 교재에서 "CoffeeFactory 라는 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스인 LatteFactory 가 구체적인 내용을 결정하고 있습니다 . 참고로 이는 의존성 주입이라고도 볼 수 있습니다 . CoffeeFactory 에서 LatteFactory 의 인스턴스를 생성하는 것이 아닌 LatteFactory 에서 생성한 인스턴스를 CoffeeFactory 에 주입하고 있기 때문이죠 ." 위 문장에 대해 두 가지 의문점이 있습니다. CoffeeFactory 클래스와 LatteFactory가 상속 관계를 가진 상위/하위 클래스인가? CoffeeFactory는 그저 LatteFactory, EspressoFactory를 호출하는 역할의 클래스이고 extends를 통해 상속을 하고 있지 않다고 생각하는데 이 부분이 왜 상속 관계에 있는 것인지 이해가 안갔습니다. LatteFactory에서 생성한 인스턴스를 CoffeeFactory에 주입하고 있다? 해당 예시에서 의존성 주입은 의존성 주입자의 역할을 하고있는 CoffeeFactory 클래스가 main 함수와 하위 클래스( LatteFactory, EspressoFactory)와의 의존성을 느슨하게 만들고, 하위 클래스가 CoffeeFactory 클래스에 의존하게 만들면서 달성된다고 생각했습니다. 그런데 LatteFactory에서 생성한 인스턴스를 CoffeeFactory에 주입하기 때문에 의존성 주입이 달성된다는 문장이 이해가 안 갔습니다. +static 메서드를 사용하고 있기 때문에 인스턴스를 생성하지 않는 것으로 보이는데 '인스턴스'를 주입하고 있다는 문장도 잘 이해가 가지 않습니다. 긴 질문 읽어주셔서 감사합니다! 답변 기다리겠습니다 :)
선생님 7-A에서 경로를 계산할 때 순서는 상관이 없다고 하셨는데.. 각 경로 방향마다 가중치값이 다른데 어떻게 순서가 상관이 없나요?? 각 경로마다 모든 경우의 수를 계산해서 최솟값을 계산해야하는거아닌가요? ㅠㅠ 예를 들면 도시 A,B,C가 있다고 가정할 때 A B C A C B B A C B C A C A B C B A 각 경로 가중치 합이 다르지 않나요 ? 그래서 저는 왜 시작 정점을 하나로만 계산하는지도 잘 이해가 안갑니다 ㅠㅠ
안녕하세요! 좋은 강의 감사드립니다. 5-1 CNN코드에서 모델 정확도 구할 때 correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data[0].to(device), data[1].to(device) outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) # 개수 누적(총 개수) correct += (predicted == labels).sum().item() # 누적(맞으면 1, 틀리면 0으로 합산) print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total)) _, predicted = torch.max(outputs.data, 1) 에서 _ 는 무엇을 뜻하나요?? 그리고 max에서 max( outputs.data , 1) 에서 1은 무엇을 의미하나요?? 감사합니다!!
강의에서와 달리 SpeedCam.java의 public String name;을 지우지 않으니 실행 결과의 마지막 줄에서 "과속단속 카메라 : 사진을 촬영합니다" 가 아닌 "카메라 : 사진을 촬영합니다"가 나오는데, 왜 이런 결과가 나오는 것인지 궁금합니다. 제 생각으로는, SpeedCam.java의 public SpeedCam()에서 this.name = "과속단속 카메라"를 적어 놨으니 public String name;을 지우든 지우지 않든 "과속단속 카메라 : 사진을 촬영합니다" 가 나와야 할 것 같은데, public String name;을 지우지 않고 남겨 놓으니 SpeedCam()에서의 this.name이 무시가 되는 것 같아 그 이유가 궁금하여 질문드립니다. 감사합니다.
제로초 쌤 혹시 redux-toolkit 쓰는 법을 배우고 나서 노드버드도 같이하고 싶어서 구매한 뒤 살펴보니 redux-saga도 쓴다고 하셔서 듣고있습니다. 근데 redux-saga의 깃헙 파일은 어떤 폴더를 봐야하는지 안보이는데 혹시 어떤 파일을 보면 될까요..?!