현재 2주간 해결이 되지 않아 시작조차 못하고 있어 질문드립니다ㅠㅠ 에러명 : "Emulator: Pixel 2 API 30 - Emulator terminated with exit code -1073741515" 아래는 제가 이때까지 시도했던 조치 방안들 입니다.. 조치 방안 Path 설정 (사용자명은 블러처리 되어있으나 영문입니다.) - Sdk, avd, flutter Path 설정 - 변수 3가지 추가(구글링 중 해당 내용이 있어 추가해보았습니다..) SDK Tools 설치 - CPU가 AMD Ryzen 5 7500F로 SDK Tools에서 "Android Emulator Hypervisor Driver for AMD Processors (installer)"를 찾아봤으나 없음 Hypervisor 체크박스 - BIOS에서 SVM 모드 활성화(Enabled) - 아래 Windows 기능 켜기/끄기 → Windows 하이퍼바이저 플랫폼, 가상머신 플랫폼(구글링 시, 체크박스 on/off에 대한 말이 달라 체크박스 on/off 둘다 시도 해봄) 이 외에도 Android Studio 재설치, Flutter doctor 확인 후 필요 프로그램 재설치, 환경변수 Path 재설정.. 심지어 포맷까지 하고 모든 파일을 재설치 해보았음에도 해결되지 않고 있습니다.. 혹시 해결방법을 알고 계시다면 조언 부탁드리겠습니다ㅠㅠ
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. section10의 code4/Code10-4에서 보면 코드가 아래와 같이 되는데 package section10.code4 import kotlinx.coroutines.* fun main() = runBlocking<Unit> { val startTime = System.currentTimeMillis() repeat(10) { repeatTime -> launch { Thread.sleep(1000L) // 1초 동안 스레드 블로킹(코루틴의 스레드 점유 유지) println("[${Thread.currentThread().name}] 작업 실행 ") println("[${getElapsedTime(startTime)}] 코루틴${repeatTime} 실행 완료") } } } fun getElapsedTime(startTime: Long): String = "지난 시간: ${System.currentTimeMillis() - startTime}ms" 보통 이런 코드는 이렇게 멀티스레드로 처리하지 않나요..? import java.util.concurrent.Callable import java.util.concurrent.Executors fun main() { val startTime = System.currentTimeMillis() val es = Executors.newFixedThreadPool(10) val callTasks = mutableListOf<Callable<Int>>() repeat(10) { repeatTime -> val callTask = Callable { println("[${Thread.currentThread().name}] 작업 실행 ") return@Callable repeatTime } callTasks.add(callTask) } val results = es.invokeAll(callTasks) // 결과 출력 results.forEach { future -> println("Result: ${future.get()}") } println("[${getElapsedTime(startTime)}] 실행 완료") es.close() } fun getElapsedTime(startTime: Long): String = "지난 시간: ${System.currentTimeMillis() - startTime}ms" 음.. 그리고 스레드 1개를 만들어서 run을 시키면 1MB정도의 메모리 비용이 발생하고 context switch도 일어나지만, 코루틴은 훨씬 더 값싸다고 알고있습니다 추가로 아직 r2dbc처럼 비동기 트랜잭션 처리 등.. 이게 지원이 좀 미약하다고 알고있습니다. 서버의 작업은 대체로 CPU를 사용하는 부분이 그렇게 많이 없고 DB에 쓰고 값을 가져오는 동기화 코드, 순차처리 작업이 많은걸로 알고 있습니다. 그럼 언제 멀티스레드를 사용하는게 좋고, 언제 코루틴을 사용하는게 좋을까요?
현재 google ads 파악하면서 광고를 하나 둘씩 만들고 있습니다. 하나의 캠페인에 여러개의 그룹을 설정한다는 건 어떤 의미인지 이제 알고 있습니다. 다만 한 앱에 여러 캠페인을 운영하신 다는 게 어떤 의미인지 잘 이해가 가지 않아 여쭙고 싶습니다. 예를 들어 다른 광고 문구나 에셋을 테스트 해보고 싶을 때 다른 광고그룹을 하나의 캠페인에 추가하는 식으로 가능한 것 같은데요 강의에서 하나의 앱에 최대 20개의 캠페인도 운영하신다고 하셨는데 구글 애즈 이제 입문하는 입장에서 봤을 땐 "여러 광고를 실험하고 싶으면 더 많은 그룹을 적용하면 되는 거 아닌가?" 라는 생각이 듭니다. 아직까지 저는 캠페인은 타겟(웹, iOS, android)이나 예산 등을 설정하는 단위로 알고 있거든요. 혹시 광고 그룹을 더 추가하는 게 아니라 캠페인을 더 추가하시는 게 어떤 의미인지, 어떤 이유로 그러시는지 궁금합니다!
안녕하세요. 강사님 강사님 덕분에 코루틴에 대한 이해도가 많이 높아져서, 최근 코루틴을 활용한 비동기 서버 구현에 대해서 재밌게 개발을 하고 있습니다. (코루틴이 재미는 있는데, 비동기라는 개념 때문에 너무 어려워서 머리가 아프네요 😢 ) spring webflux와 코루틴을 활용한 서버 개발을 하다보니, 자연스럽게 suspend 키워드가 많이 사용되고 일시 중단 함수에 대해서 조금 더 높은 이해도가 필요해서 이에 대해서 몇가지 질문을 하려고 합니다. 1.저는 강사님의 일시 중단 함수 관련 강의를 듣고 일시 중단 함수란 그냥 일시 중단 지점을 포함할 수 있는 특이한 함수 , suspend 함수에서 코루틴을 사용하기 위해서는 coroutineScope을 사용하자 이렇게 이해를 했어서 다음과 같이 코드를 짰습니다. class SuspendRequestTest { @Test fun suspendRequestTest() = runBlocking { val startTime = System.currentTimeMillis() // 시작 시간 기록 println("suspendRequest start") anotherSuspendFunction1() // suspend function 1 호출 anotherSuspendFunction2() // suspend function 2 호출 println("suspendRequest end") val endTime = System.currentTimeMillis() // 종료 시간 기록 println("suspendRequest elapsed time: ${endTime - startTime} ms") // 경과 시간 출력 } private suspend fun anotherSuspendFunction1() = coroutineScope { println("anotherSuspendFunction1 start") launch { println("anotherSuspendFunction1 extra logic start") delay(1000) println("anotherSuspendFunction1 extra logic end") } println("anotherSuspendFunction1 end") } private suspend fun anotherSuspendFunction2() = coroutineScope { println("anotherSuspendFunction2 start") launch { println("anotherSuspendFunction2 extra logic start") delay(1000) println("anotherSuspendFunction2 extra logic end") } println("anotherSuspendFunction2 end") } } // 실행 로그 suspendRequest start anotherSuspendFunction1 start anotherSuspendFunction1 end anotherSuspendFunction1 extra logic start anotherSuspendFunction1 extra logic end anotherSuspendFunction2 start anotherSuspendFunction2 end anotherSuspendFunction2 extra logic start anotherSuspendFunction2 extra logic end suspendRequest end suspendRequest elapsed time: 2037 ms 제 예상대로라면 1초가 살짝 넘는 시간으로 작업이 완료되어야 하는데, 해당 작업은 2초가 걸리는 작업이었습니다. (로그도 항상 1번이 먼저 나타납니다.) 1-1) 혹시 coroutineScope 은 내부의 코드가 완료되기 전까지는 다음으로 넘어가지 않는 Blocking 속성을 가지는 함수일까요 ? 1-2) supervisorScope 도 coroutineScope 처럼 내부의 코드가 완료되기 전에는 다음으로 넘어가지 않는다고 알면 될까요? 1-3) 일시 중단 함수가 여러 일시 중단 함수들을 내부 로직으로 가지는 경우, 순차적으로 각각의 일시 중단 함수가 끝나야지만 다음 일시 중단 함수가 실행되는 걸까요 ? 2.제가 실제 코루틴 사용 사례 및 코드를 많이 보지 못해서, 어떻게 쓰는게 좋은 케이스 인지 이해도가 낮은 것 같습니다. 보통 coroutineScope 혹은 supervisorScope 함수들은 어떤 경우에 어떤 목적을 위해 주로 쓰이는 걸까요 ?? coroutineScope 의 속성이나 특징에 관해서 추가적으로 제가 알아야 하거나 참고하면 좋을 자료가 있을까요?? 😊
isActive라는 확장 프로퍼티를 이용해서 일시 중단 시점을 만들지 않고도 확인할 수 있다는 내용은 이해했습니다. 다만 본 강의의 예시에서는 while문을 통해서 계속해서 isActive를 확인해서 취소된 걸 곧바로 알 수 있었지만, 만약 실무에서 coroutine내에 어떤 로직들이 길게 적혀 있다면, 한 줄 한줄 마다 if 문을 통해 isActive를 확인해야 하는 코드가 들어가야 하는 걸까요? 아니면 조금 비효율적인 것을 감안하고 yield 같은 함수를 중간 중간에 넣어두어야 하는 걸까요?
섹션14페이징기능_1게시글 목록 화면에 페이징 적용_feed_repository.dart 에서 에러가 발생했습니다 그런데 예전에 좋아요에서 원본코드 (feed_repository.dart) getFeedList()부분 QuerySnapshot<Map<String, dynamic>> snapshot = await firebaseFirestore.collection('feeds').where('uid', isEqualTo: uid).orderBy('createAt', descending: true).get(); 문제가 발생되어 다음과 같이 수정하여 동작아였으나 14페이징기능_게시글 목록 화면에 페이징 적용 하면서 어떻게 해야할지요 Query<Map<String, dynamic>> query = await firebaseFirestore.collection('feeds').orderBy('createAt', descending: true); if (uid != null) {query = query.where('uid', isEqualTo: uid); } QuerySnapshot<Map<String, dynamic>> snapshot = await query.get();
안녕하세요 강사님, 강의 잘 들었습니다 개인적으로 코루틴에 관해서 정말 많이 배웠습니다. 모든 걸 다 소화하지는 못했지만, 필요할 때마다 돌아와서 정독하면 충분히 필요한 부분을 얻어갈 수 있다는 생각이 드네요. 좋은 강의 감사드립니다. 몇가지 궁금한 부분이 있어 질문드립니다. 사내에서 사용하는 기술스택이 spring web mvc + JPA + feignClient인데 혹시 이와 유사한 환경에서 코루틴을 적용해보신 경험이 있으실까요? 특히 제가 기대했던 부분은 IO작업에 관해 요청을 보내고 스레드를 점유하지 않음으로써 리소스를 효율적으로 사용하는 것(즉 처리량을 증가시키는 것)을 기대했었는데 아무래도 JPA나 feignClient나 응답이 올때까지 대기하는 구조로 되어 있더라구요ㅠㅠ.. 드라마틱한 성과를 기대하기는 조금 힘들어보이긴하네요 혹시 관련해서 유사한 경험이 있으신지 싶어서 의견을 묻고자 여쭤봅니다. 코루틴을 사용중인 환경에서 rps가 급증하면 어떤식으로 흘러갈지 궁금합니다. 스레드가 고갈될 것 같은데, 자연스럽게 dispatcherIO등의 스레드가 새로 생성되나요? - 그렇다고 하면 메모리가 고갈될 것 같은데, 코루틴을 사용할때는 결과적으로 메모리 기준으로 스케일아웃을 걸어야할지? 등이 궁금하네요.
안녕하세요! 강의 잘 듣고 있습니다. 앱을 개발하시면서 필요하다면 로그인 기능이 필요할텐데 일반 사용자들이 로그인/회원가입 기능에 큰 거부감은 없었을까요? iOS 같은 경우에는 CloudKit 등을 활용해서 별도 회원 구조에 대한 구현 없이도 사용자의 앱 데이터를 유지할 수 있었는데 서버 기반으로 구현하다보면 데이터 유지를 위해 불가피하게 회원 기능이 필요할 것 같아서 조금 고민이 되네요. 또한 회원 기능 추가 시에 개인정보나 법적인 문제들에 대한 문제는 없으셨는지도 궁금합니다. 혹시 대답이 가능하시다면 회원 기능을 제공하는 비중이 어느정도인지도 궁금합니다. 감사합니다!
Firebase나 Supabase Aws amplify 같이 백엔드를 쉽게 처리할 수 있는 프레임워크들에 대해서 어떻게 생각하시는지 궁금했는데 아예 언급을 안하시네요. 위와 같은 프레임워크들을 사용해 백엔드를 처리하고 프론트를 개발해 서비스하는 조합에 대해서는 어떻게 생각하시는지 궁금합니다
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 마크다운, 단축키를 이용해서 편리하게 글을 작성할 수 있어요. 먼저 유사한 질문이 있었는지 검색해보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.