묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨2시간으로 끝내는 코루틴
한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때
fun main(): Unit = runBlocking { val job1 = async { apiCall1() } val job2 = async { apiCall2(job1.await()) } printWithThread(job2.await()) } suspend fun apiCall1(): Int { delay(1_000L) return 1 } suspend fun apiCall2(num: Int): Int { delay(1_000L) return num + 2 }위와 같은 코드에서, 코루틴을 사용해도 apiCall1() 의 반환값이 apiCall2()의 인자로 사용되기 때문에, apiCall1()이 완료된 후에 apiCall2()가 실행되는 것은 이해했습니다. 그리고 코루틴을 사용할 때의 이점이 마치 한줄한줄 동기식 코드를 작성할 때처럼 비동기 코드를 사용할 수 있다. 로 이해했습니다.그럼 위와 같은 상황에서는 굳이 코루틴을 사용하지 않고, 아래와 같이 동기적으로 코드를 작성해도 같은 것일까요? (두 apiCall1,2를 사용하는 외부 메서드가 없을 때)fun main() { val job1 = apiCall1() val job2 = apiCall2(job1) printWithThread(job2) } fun apiCall1(): Int { delay(1_000L) return 1 } fun apiCall2(num: Int): Int { delay(1_000L) return num + 2 }비동기 처리가 처음이다 보니 직관적으로 잘 와닿지 않는 부분이 많아 자꾸 질문드리네요 ㅜㅜ 죄송합니다.
-
해결됨2시간으로 끝내는 코루틴
delay 함수에 대해 질문이 있습니다
강의 듣던 와중 delay에 대한 궁금증이 생겨서 질문드립니다.만약 한 코루틴에서 delay로 시간을 전부 보낸 후에는 작업 중인 다른 코루틴에게서 제어권을 뺏어오게 되나요?아래와 같은 예시에서fun main(): Unit = runBlocking { val job1 = launch { delay(100) printWithThread("Job 1") } val job2 = launch { // 대충 0.1초보다 더 걸리는 로직 } }위와 같은 상황에서는job1에서 delay로 0.1초 기다림과 동시에 job2에게 넘겨줌job2 실행중job1에서 기다리기로 약속한 0.1초 지남하지만 job2 아직 실행중이 상황에서는 job2의 로직이 전부 끝난 후에 job1에게 제어권을 넘겨주게 되는 걸까요?
-
해결됨2시간으로 끝내는 코루틴
runBlocking을 사용하는 경우가 있을까요?
안녕하세요, 좋은 강의 잘 듣고 있습니다.runBlocking 설명하시면서, runBlocking은 자신의 코루틴이 모두 실행될 때까지 Thread를 Blocking 시킨다. 그래서 main 함수 최초 진입점이나, 테스트 코드 맨처음에 작성하는 것이 좋다. 라고 말씀해 주셨습니다.그런데 그럼 테스트 코드 전체 또는 main 함수 전체를 코루틴으로 작성할 경우에만 사용이 되는 걸까요? 테스트 코드 이외에는 실제 로직에서 어떤 경우에 사용이 될지 궁금합니다.아직 강의 초반부라서 이해가 부족한 것인가 싶기도 하지만 실시간으로 궁금해서 여쭤봅니다.
-
미해결코틀린 고급편
DSL 만들기
안녕하세요 강사님. 내용을 몇번 더 봐야 더 잘 알겠지만막히는 부분이 있어서 질문올립니다. 18강 내용중에서 service(name = "db") { image { "mysql" } env("USER").`is`("myuser") env("PASSWORD").`is`("mypassword") port(host = 9999, container = 3306)} env("USER").`is`("myuser") 이 DSL은 어떻게 만들수 있을지 감이 오지 않습니다. ㅜㅜ
-
미해결코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
build.gradle.kts 변경시 오류가 발생합니다.
안녕하세요. build.gradle.kts 로 변경하고 내용을 입력했는대 오류가 발생해서 질문드립니다.해당 파일에 전체 빨간줄이 그어지며 there are no configurations available kotlin 라는 메시지가 뜨는대요 실행자체는 되는대 문제는 util 파일 변경 강의를 수강하려고 convert to kotlin 을 누르니까 kotlin 설정이 안되어 있다고 나오면서 변환이 되지 않습니다. 제가 인텔리제이 2020년 버전을 사용중인대 kotlin버전이 최대 1.6까지 설치가 되더라고요 kts 파일안에는 1.9.20버전이던대 이것때문에 인식을 못하는걸까요? ㅠㅠ1.6으로 kotlin 버전값을 바까도 인식을 못하는대 도움이 필요합니다. 이렇게 뜨고요... 물론 cache clean restart랑... gradle 폴더 지우고 실행해도 마찬가지내요...회사 컴퓨터에 설치된 intellij 버전도 동일해서 해밨는대 증상은 동일하고요...
-
미해결코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
서비스, 컨트롤러 질문입니다.
1. 컨트롤러를 변환후 test실행했는데요.com.makers.princemaker.exception.PrinceMakerException: 해당되는 왕자님이 안계십니다.at com.makers.princemaker.controller.PrinceMakerController.getPrinces(PrinceMakerController.kt:31) ~[main/:na] 31번째 라인 소스입니다.@get:GetMapping("/princes") val princes: List<PrinceDto> get() = princeMakerService.allPrince 오류메세지를 자세히 보니 수업시간에 말씀하신부분인거 같은데 정확하게 어딘지 못찾겠네요... ERROR 68014 --- [ Test worker] c.m.p.e.PrinceMakerExceptionHandler : url: /create-prince, message: Validation failed for argument [0] in public com.makers.princemaker.dto.CreatePrince$Response com.makers.princemaker.controller.PrinceMakerController.createPrince(com.makers.princemaker.dto.CreatePrince$Request): [Field error in object 'request' on field 'experienceYears': rejected value [null]; codes [NotNull.request.experienceYears,NotNull.experienceYears,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [request.experienceYears,experienceYears]; arguments []; default message [experienceYears]]; default message [must not be null]] 컨트롤러 변환이후 서비스에서 WoundedPrinceRepository해당 파라미터가 not-null인데 null로 설정되어있다고 오류메시지가 나와서 서비스 상단 생성자 부분을 아래와 같이 수정했더니 오류가 사라졌는데 맞게 수정한걸까요?class PrinceMakerService ( private val princeRepository: PrinceRepository, private val woundedPrinceRepository: WoundedPrinceRepository? )
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
강의 잘듣고 디테일을 좀 수정해보고 싶은게 있어서 힌트좀 주시면 감사하겠습니다
1. ContentListActivity 관련해서 응용해보고 싶은게 있습니다! val database = Firebase.database val category = intent.getStringExtra("category") // 받은 카테고리 val 값 when (category) { "category1" -> { myRef = database.getReference("contents") } "category2" -> { myRef = database.getReference("contents2") } "category3" -> { myRef = database.getReference("contents3") } "category4" -> { myRef = database.getReference("contents4") } "category5" -> { myRef = database.getReference("contents5") } "category6" -> { myRef = database.getReference("contents6") } "category7" -> { myRef = database.getReference("contents7") } "category8" -> { myRef = database.getReference("contents8") } }이런식으로 강의내용에 추가해서 카테고리를 여러개 추가했는데요tip의 category1 이미지가 ALL입니다. 그래서 ALL에는 category2 부터 category8까지의 이미지가 모두 랜더링 됐으면 합니다. getReference에는 복수의 path를 넣을수 없게끔 되어있고 독스에 가서 읽어봐도 관련된 내용은 찾지못해서 어떻게 하는게 좋을지 잘 모르겠어서 글을 남깁니다.2. 댓글쓸때 title, time 만 랜더링되게끔 만들고싶은데 content도 같이 랜더링됩니다. 이걸 어떻게 해야 삭제할수있을까요?
-
해결됨아이비의 안드로이드 드릴
[실습] 7. 추상클래스와 인터페이스 에서 stepCount에 대한 질문이 있습니다.
해결완료 질문입니다.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
확장 함수의 오버라이드에 대해서 궁금한 점이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 예로 들어주신 Train, Srt 클래스에 존재하는 isExpensive() 확장 함수에 대해서 의문이 생겼습니다.코틀린의 경우 오버라이드의 경우 override 키워드를 사용해서 정의를 한다고 강의에서 배웠는데요, Srt의 isExpensive() 함수를 함수 오버라이딩이라고 볼 수 있는지 궁금합니다.궁금해서 찾아본 결과 오버라이딩의 경우 상속 관계가 핵심이고, 상위 클래스의 함수를 하위 클래스가 재정의 하는 것이라고 표현할 수 있을 것 같습니다.Train과 Srt의 확장 함수는 각 클래스에 정의가 되어 있긴 하지만, 내부에서도 상속 관계가 되어 오버라이딩에 대한 바인딩이 처리되어 있을까? 하는 의문이 들었습니다.확장 함수의 오버라이딩이 어떻게 진행되는지 궁금합니다..!
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
변수 초기화 위치
안녕하세요 강의도중 질문이 있습니다 loginActivity에서 login버튼 클릭시setOnClickListener안에서 email과 password값을 선언 및 초기화를 하면 정상적으로 화면 전환이되는데 setOnClickListener 윗줄에서 email과 password를 선언 및 초기화한 후에 해당 변수값을 가지고 auth.signInWithEmailAndPassword(email, password)이렇게 매개변수에 넣어주면 mainActivity로 이동하지않고 introActivity로 이동하더라구요 제가볼땐 변수의 초기화 위치가 클릭리스너 안이냐 바깥이냐는 크게 영향이 없을것같은데.. 이유가 뭔지 알수있을가요??
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
firebase SDK를 추가를 위한 Classpath 코드구문
파이어베이스를 안드로이드와 연동하는 과정중에 firebase SDK를 추가 하고자합니다. 하지만 강의에서 나온 firebase SDK를 추가를 위한 Classpath 코드구문이 없습니다..이럴땐 어떻게 해야 하나요??
-
미해결입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기
[실습]Thymeleaf- 부트스트랩 템플릿 - 자료가 달라요 ...
안녕하세요 틈틈히 공부 하고 있는데 여기까지 왔네요..이해를 못하는 부분이 좀있어서 첨 부터 다시 보고 여기 까지 왔는데 모르는부분은 인터넷에서 확인하고 알아갔는데 강의 내용에서 알려주신 자료와 강의 하신 자료가 다른거 같아서 이렇게 글 남기네요 Personal - Free Bootstrap Template - Start Bootstrap에서 받은 자료을 받아서 압축 풀면 ======================================== 위처럼 나타납니다. 강의 내용에서 자료를 받은 내용은 이렇더라구요=============================제자료는 강사님의 자료 처럼 Vendor이 없어요...강의 노트를 확인하면 [링크에서 템플릿 파일 다운로드 후 압축을 해제하고, 파일과 폴더를 각각 아래 경로에 추가합니다. 디렉토리가 없다면 만듭니다]라고 적혀 있어서 위 처럼 폴더를 만들긴 했지만 vendor폴더가 없어요 강사님의 git에 있는 벤드를 가져와서 붙여도 되나요?? 그러면 강의 내용을 앞서 가는거 같아서 하다가 말았어요...Vendor 폴더 그냥 폴더만 만들고 계속 강의 들어도 되나요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
Person을 입력하니 오류가 뜨는 이유가 무엇인가요?
화면처럼 Person에 오류가 뜹니다
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
firebase auth
auth객체 생성하고 createUserWithEmailAndPassword 메소드 실행할때 에러가 발생했습니다에러현상은 intro layout에서 회원가입 클릭시 앱이 팅기면서 꺼지고로그를 살펴보면 FATAL EXCEPTION: main Process: com.example.datingapp, PID: 18621 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.datingapp/com.example.datingapp.auth.SignUpActivity}: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.example.datingapp. Make sure to call FirebaseApp.initializeApp(Context) first.at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4111) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4277) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loopOnce(Looper.java:226)at android.os.Looper.loop(Looper.java:313)at android.app.ActivityThread.main(ActivityThread.java:8751)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this processcom.example.datingapp. Make sure to call FirebaseApp.initializeApp(Context) first.at com.google.firebase.FirebaseApp.getInstance(FirebaseApp.java:179)at com.google.firebase.auth.FirebaseAuth.getInstance(com.google.firebase:firebase-auth@@22.1.2:1)at com.google.firebase.auth.ktx.AuthKt.getAuth(com.google.firebase:firebase-auth-ktx@@22.1.2:8)at com.example.datingapp.auth.SignUpActivity.onCreate(SignUpActivity.kt:23)at android.app.Activity.performCreate(Activity.java:8290)at android.app.Activity.performCreate(Activity.java:8270)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4085)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4277) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8751) at java.lang.reflect.Method.invoke(NativeMethod) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) 이렇게 발생하고 있습니다 전체코드는 https://github.com/jsistop16/dating-app여기에 push해놓았습니다
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
splash manifest 설정시 에러
안녕하세요 e: This version (1.4.4) of the Compose Compiler requires Kotlin version 1.8.10 but you appear to be using Kotlin version 1.9.0 which is not known to be compatible. Please consult the Compose-Kotlin compatibility map located at https://developer.android.com/jetpack/androidx/releases/compose-kotlin to choose a compatible version pair (or suppressKotlinVersionCompatibilityCheck but don't say I didn't warn you!). 스플래시 화면 만들고 컴파일 돌리면 이런 에러가 발생하는데구글링해서 build.gradle에서 버전을 수정해봐도 계속 같은 에러가 발생합니다...
-
해결됨[입문] 누구나 배울 수 있는 코틀린(Kotlin)
JVM을 19가 아닌 22로 해도 되나요?
JVM을 19로 하려고 했는데 다운이 안되서 22로 해도 될까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
디바이스 에뮬레이터 질문
안녕하세요 bts 앱 듣고있는데 디바이스 에뮬레이터 실행하여 run app을 누르면 Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.res.ParseLibraryResourcesTask$ParseResourcesRunnable 가 나오면서 진행이 되지 않아 질문드립니다.
-
미해결코틀린 문법부터 실무까지 (자바 to 코틀린 실무)
실습. dto 변환해보기
변환도중 85line에서 NullPointException 오류메시지가 나와서 *.http테스트가 안됩니다. 85line 코드는 assertEquals(7, response.getExperienceYears().intValue()); 이고 아래와 같이 오류메세지가 나옵니다.Method invocation 'intValue' may produce 'NullPointerException' CreatePrince.kt에서 @NotNull @Min(0) val experienceYears: Int? = null,null 허용을 해줬는데 NPE를 뱉어서 문의드립니다
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
그래들 디펜더시 버전 명시
안녕하세요, 궁금한 게 있어 질문드립니다!현재 강의까지 그래들에 3개의 디펜던시를 추가해주었는데요, 기존 자바-스프링부트 환경에서는 디펜던시에 라이브러리 버전을 명시하지 않아도 스프링부트가 내부적으로 호환되는 버전을 찾아 사용하는 것으로 알고 있습니다.반면, 코틀린-스프링부트에서 디펜던시를 사용할 때 세 경우 모두 버전까지 명시해 사용했는데요, 혹시 코틀린을 사용할 땐 매번 이렇게 최신의 안정화된 버전을 찾아 사용해야 하는 것인지 궁금합니다.또한 검색해보니 groovy gradle 대신 사용하는 kotlin-dsl이라는 것도 봤는데요, 혹시 고급편에 이 내용이 포함되어 있을지도 궁금합니다.항상 정성들인 답변 감사합니다.
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Open 키워드를 사용해야 하는 이유
안녕하세요 강사님 덕분에 편히 배우고 있습니다.다름이 아니라 이번 강의 초반에 @Transactional 어노테이션을 사용할 시 open 키워드를 클래스와 매서드에 다 사용해주어야 하고, 만약 이게 싫다면 플러그인을 적용해야 한다고 말씀하셨는데요,찾아보니 코틀린에서는 기본적으로 모든 클래스가 최종 클래스고, 그렇기 때문에 상속이 되지 않아 open 키워드를 사용해 상속 가능성을 열어두어야 한다는 것 같더라구요.그런데 왜 이게 @Transactional 어노테이션을 사용할 때도 해당되는 내용인지 잘 모르겠습니다. 프록시 객체가 생성되기 때문인 걸까요?제가 코틀린 기본 강의를 들었음에도 잘 기억이 나질 않아 질문드립니다. 항상 감사드립니다.