[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요 redirect 이용해서 구현하는 것에 질문이 있어요 예를 들면 1) 어떤 상세 페이지에서 컨텐츠 보고 있었음 2) 토큰만료 되서 로그인 페이지로 감 3) 재로그인하고 아까 상세 페이지로 복귀 또는 1) 로그아웃했음 (auth state 에 따라 redirect함) 2) 뒤로 가기가 있는 로그인 페이지로 이동 3) 뒤로가기 하고 싶으나 (context.pop할 페이지가 없다고 나옴) 이런 시나리오라 할 떄 go router 같은 경우 redirect 으로 로그인 페이지로 보내게 되면 context.pop할때 뒤로갈 페이지가 없다고 되는데 이런경우는 어떻게 다뤄야할까요? 당장 생각되는건 redirect 되는 페이지들이 context.go 처럼 작동되어서 context.push 같이 redirect 될 수 있도록 조절이 가능하면 좋을 것 같다는 생각이 드는데 방법이 있는지 궁금해요. 만약에 위 해결 방법이 없다면 수동적으로라도 redirect 을 사용 안하고 auth state 별로 라우팅을 명시해주는게 나을까요..? 아래는 구현한 코드 예제입니다 final goRouterProvider = Provider<GoRouter>((ref) { final authProvider = AuthNotifier(ref: ref); return GoRouter( navigatorKey: MyApp.navigatorKey, debugLogDiagnostics: false, initialLocation: RouterPathEnum.SPLASH.path, redirect: authProvider.redirectLogic, refreshListenable: authProvider, routes: [ ...RouterPathEnum.values .map( (value) => transitionRoute( path: value.path, routerEnum: value, duration: const Duration(milliseconds: 500), ), ) .toList(), ...goDynamicRouteList, /// -- Deep Link Page -- ], ); }); class AuthNotifier extends ChangeNotifier { final Ref ref; AuthNotifier({required this.ref}) { //LoginPlatformEnum 상태 listen -> 상태가 변경되면 notifyListeners() 호출 ref.listen<LoginPlatformEnum?>( authViewModelProvider, (previous, next) { if (previous != next) { notifyListeners(); } }, ); } String? redirectLogic(_, GoRouterState state) { final authState = ref.read(authViewModelProvider); /// 로그인 여부 final authenticated = authState; /// 로그인 하려는 경우 final authenticating = (state.matchedLocation == RouterPathEnum.LOGIN.path) || (state.matchedLocation == RouterPathEnum.SIGNUP.path) || (state.matchedLocation == RouterPathEnum.PASSWORD_RESET.path); final isSplash = (state.matchedLocation == RouterPathEnum.SPLASH.path); log('authenticated.value: $authenticated authenticating: $authenticating'); if (isSplash) return null; /** * authenticated - 로그인이 안된 경우 (LoginPlatformEnum.none) * 로그인을 시도하는 케이스 : 원하는 페이지로 이동 * 그 외 케이스 : 로그인 페이지 이동 */ if (authenticated == LoginPlatformEnum.NONE) { return authenticating ? null : RouterPathEnum.LOGIN.path; } /** * authenticated - 로그인 성공한 경우 * 로그인하려는 페이지 or splash -> total main 페이지로 이동 * 그 외 케이스 : 원하는 페이지로 이동 */ return (authenticating) ? RouterPathEnum.TOTAL_MAIN.path : null; } }
강사님, nums 1234로 만들수 있는 모든 순열을 반환하시오 문제에서 질문이 있습니다. curr = []라고 지정하지 않았는데 어디에서 갑자기 curr이 빈리스트로 자동적으로 생성된건가요? curr이랑 nums 개수 같으면 answer에 순열 추가되고 함수종료되는건 알겠는데 curr가 [1, 2, 3, 4]일때 재귀함수 종료되고 다음 curr.pop()로 넘어가서 [1, 2, 3]이 되는거까진 이해갔습니다. 넘어가는 순간 또 재귀함수가 종료되서 curr.pop()이 되서 [1, 2]가 되는건 알겠는데 갑자기 3, 4만 빠진 여기에서 멈추게 되는 것이 이해가 가지 않습니다. 여기에서 멈춰서 다시 4, 3으로 진행되는게 이해가 안가서요ㅠㅠ 1, 2도 전부 이전의 재귀함수가 종료된 것이니 pop이 되어야 되는거 아닌가요?ㅠㅠ for문 안의 재귀함수가 종료될시 어디로 돌아가는지가 약한거 같은데 이부분 공부하는 방법이 있으까요?
https://www.acmicpc.net/group/board/view/20223/37592 코드가 불완전해서 채점에 아직 돌리지 않아서 백준 글쓰기 링크를 올렸습니다..! 막 dfs,bfs를 배우기 시작했는데 최소거리를 구할땐 bfs를 써야 한다고 선생님 강의에서 배웠습니다. 호기심으로 dfs를 시도했는데 출력이 아무것도 나오지 않습니다.. 어떤 부분을 고쳐야 할까요? 하루종일 했는데 답이 나오지 않습니다 ㅠㅠ 2-A (2178 - 미로찾기) 문제입니다. 선생님의 완벽한 dfs 코드가 있으면 보여주시면 더욱 감사하겠습니다..! 보고 배우고싶습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. TCP는 3 way handshake로 stateful인데 TCP 기반으로 작동하는 HTTP가 왜 stateless인지 모르겠습니다 stateful로 작동하는 TCP 위에서 HTTP가 어떻게 stateless로 작동한다는 것인지 이해가지 않습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 큰돌님. cin을 사용해서 숫자를 입력받으면 우선 문자열로 처리된 후에 int로 변환이 되는건가요? 왜냐하면 해당 문제의 코드에서 string형 변수인 s에다가 숫자를 받았는데 이 부분 때문에 고민을 많이했거든요. string형에다가 숫자를 못받을거라고 생각해서.. 또 교안에서 getline을 설명할 때도 숫자를 입력받은 후 '\n'을 없애기 위해 bufferflush를 사용했었는데 이것 또한 문자열로 인식하기 때문인가 싶어서요.
안녕하세요 세션 타임아웃 설정 파트를 공부하다 궁금한 점이 생겨 질문드립니다. 강의에서는 HTTP는 비연결성이어서 서버 입장에서는 사용자가 웹 브라우저를 종료한 것인지 알기 어려움으로 세션 종료시점을 정해줘야 한다고 이해했는데요 그런데 일반적으로 네이버 같은 특정 사이트에 로그인하고 브라우저를 껐다 바로 켜면 로그아웃이 되어있는데 이런 경우엔 어떤 매커니즘으로 세션 데이터가 삭제되는지 궁금해 질문드립니다
cors, gitignore, env가 모두 작동하지 않습니다. 1) cors와 env에 대하여 'npm install cors, npm install dotenv'를 통해 설치를 완료했고 up to date, audited 599 packages in 2s 122 packages are looking for funding run npm fund for details found 0 vulnerabilities 라고 잘 설치된 것을 확인했습니다. 그리고 //server.js const express = require('express'); const app = express(); const test = require('./Router/test'); const cors = require('cors'); app.use(cors()); require('dotenv').config(); console.log("테스트: "+process.env.NEXT_PUBLIC_TEST); 라고 코드를 작성했는데, 플러그인 덕분인지 코드를 작성했을 때는 제대로 NEXT_PUBLIC_TEST에 해당하는 값이 미리보기로 뜨다가(사진 첨부), 막상 실행하면 "테스트: undefined"라고 뜹니다. 마찬가지로 cors도 제대로 설치하고 react의 response = await fetch('/backEndProc', { method: 'POST', body: formData, }); 라는 코드에 알맞게 app.post('/backEndProc', 라고 코드를 작성했음에도 " POST http://localhost:3000/backEndProc 404 (Not Found) MakePage.jsx:130 Error: Syntax" 오류가 발생했습니다. 2) gitignore에 대하여 깃이그노어에는 다음 코드가 들어있습니다. "node_modules .env" 원래 node_modules에 대하여 gitignore가 잘 작동했는데, npm install cors 이후로 갑자기 node_modules가 gitignore되지 않고, 또 .env에 대해서도 gitignore되지 않습니다. (.env와 gitignore은 같은 디렉터리에 있습니다) 도움을 주시면 정말정말 감사하겠습니다...........ㅠㅠㅠㅠㅠ 며칠째 골머리만 앓고 있습니다...
안녕하세요! 간단한 질문이 될 수도 있지만 궁금해서 남깁니다! 강사님의 L3 계층 관련 강의 챕터를 다 보았는데요! 영상 속에서 패킷의 생성-전달 과정을 택배 상황에 비유해서 들어주셨는데요! 여기서 '택배 기사가 GW며 GW가 라우팅을 한다' 라고 하셨는데, 그러면 GW 호스트 = 라우터 인 것 맞을까요?? 생각해보면 호스트에는 엔드포인트와 스위치 호스트로 나누어지고, 라우터는 스위치 호스트에 해당할 것 같은데, 이 사고 과정이 맞는지 여쭤봅니다!
안녕하세요 태그매니저에서 변수, 트리거, 태그 지정을 하고 미리보기를 누른 후 문제가 없으면 제출을 하는데, 제출을 할 때, 변수/트리거/태그 별로 각각 다 한 번씩 제출버튼을 눌러줘야 하나요? 아니면 변수, 트리거 지정 그리고 태그까지 끝났을 때 태그 제출버튼만 누르면 모든 것이 다 일괄 제출이 될까요?
막힌 부분의 시간(예를들면 3:24)과 안 되는 부분과 현상을 자세히 써주셔야 해결이 빠릅니다. - 3:24, 여기서 막혔어요 (X) - 3:24, 영상에서는 원형인데 저는 타원형으로 만들어져요. (O) - 3:24, 베벨과 익스투르드까지는 적용이 되는데 미러 모디파이어는 반응이 없어요. (O) 문제되는 물체를 선택한 상황에서 일부가 아닌 전체 스크린샷 사진을 첨부해주시면 훨씬 좋습니다. - 아웃라이너나 프로펄티스도 문제 상황 파악에 도움이 되므로 함께 찍어주세요. 15:11 부분에서 나이프로 컷하는데 저는 계속 뒷면이 같이 컷이 안되고 앞면만 컷이 되는데 왜그런건가요?
안녕하세요. 새강의 없이 혼자 좀 해오고 있는데 DB 연동하는 부분은 좀 감이 안 잡히네요. AuthorizationFilter에서 처리될 때 RequestMatcherDelegatingAuthorizationManager에 위임되고 거기에 있는 this.mappings에 SecurityConfig에서 설정한 requestMatcher가 초기화되어 있더라고요. 다이나믹하게 this.mappings에 제가 디비에서 가져온 데이터를 넣으면 좋은데 이 방법이 맞는지도 모르겠고 감을 못 잡겠네요ㅠ힌트라도 주실 수 있나요? 현재 강의에서 사용하는 방법의 일부처럼 새로운 필터를 넣어야 하는 걸까요..
강의에서 for을 쓸때 for (선언;조건;증감) {수행할 명령}이라고 하셨는데 조건이 충족되면, 증감을 먼저 하는겁니까? 아님 수행할 명령을 먼저합니까? 사실 continue 강의에서, 에서 원래 for(int i)가 1이 되어야 하는데, 보시는 것처럼 0으로 해놨더니 20번 손님까지 찾아야 되는데 19번까지만 출력되더라고요 궁금해서 물어봅니다. 두 질문 모두 볼드체 처리를 해서 둘다 답변 해주셨으면 합니다.
김영한님 "자바 ORM 표준 JPA 프로그래밍 - 기본편" 마지막 섹션 내용을 공부하다 에러를 못 고치고 질문 올립니다. 하이버네이트 버전은 6.2.9.FInal 이고 부트버전은 3.2.3입니다 @Entity @Setter @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Product { @Id @GeneratedValue private Long id; private String name; private int price; private int stockAmount; public Product(String name, int price, int stockAmount) { this.name = name; this.price = price; this.stockAmount = stockAmount; } } Product의 price가 double 타입이면 에러가 안 나는데 int면 아래 jpql실행시 에러가 납니다. @Test void 벌크연산106p(){ Product p1 = new Product("새우깡", 1000, 5); Product p2 = new Product("양파깡", 2000, 5); Product p3 = new Product("고래밥", 5000, 15); em.persist(p1); em.persist(p2); em.persist(p3); String jpql = "update Product p " + " set p.price = p.price*1.1 " + " where p.stockAmount<:stockAmount"; int resultCount = em.createQuery(jpql) .setParameter("stockAmount", 10) .executeUpdate(); System.out.println(resultCount + "개 상품 가격 수정"); } 에러 메세지는 다음과 같습니다. java.lang.IllegalArgumentException: org.hibernate.query.SemanticException: The assignment expression type [java.lang.Float] did not match the assignment path type [java.lang.Integer] for the path [p.price] [update Product p set p.price = p.price*1.1 where p.stockAmount<:stockAmount] jpql내에 p.price*1.1을 정수로 형변환해서 할당하면 될 것같아, (int)(p.price*1.1)로 바꿔도 에러나네요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의에서 '"성능의 경우 조회에서 문제가 생기고, 생성이랑 수정은 성능 문제가 잘 발생하지 않는다"고 한 부분에서 궁금증이 생겼습니다! 업데이트의 경우 JPQL을 사용한 쿼리문을 통해 수정하는 방법이 있고, 엔티티를 싹 불러와서 dirty-cheking을 이용하는 방법이 있는걸로 알고 있습니다. 제 생각에는 뭔가 엔티티를 싹 불러오는 후자의 방법이 더 느릴거 같은데, 왜 후자를 그냥 쓰면 된다고 하신 이유가 궁금합니다! 또 두 방식 중 어떤 상황에 무엇을 써야하는 지 기준이 있다면, 알려주시면 감사하겠습니다!
1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 위 테이블을 보면 Order는 Member, Delivery, OrderItem과 양방향 연관관계이므로 Order 클래스에 연관관계 편의 메소드를 작성했으며, Categroy는 category_item과 양방향 연관관계이므로Category 클래스에 연관관계 편의 메소드를 작성한 것으로 이해했습니다. 그럼 만약ORDERS와 ORDER_ITEM , ITEM 모두가 양방향 연관관계즉, 모든 테이블이 양방향 연관관계라면,어느 클래스에서 연관관계를 작성하면 될까요? 비즈니스적으로 몰리는 엔티티에 작성하면 되는지,아님 애초에 이런 상황이 발생하지 않도록 ORDER_ITEM 과 같은 테이블을 추가해서 단방향 연관관계를 만드는 게 더 좋을까요?