묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
TransactionMessage 질문
안녕하세요.TransactionMessage 부분에서time을 기본값 LocalDateTime.now()로 설정하실 때 val -> var로 변경하시는 것을 봤습니다.실무에서 코틀린에서 기본값을 선언할때 관례적으로 var로 하는지 궁금합니다.(코틀린으로 서버를 개발해본적이 없어서 기초적인 질문 드려서 죄송합니다..)감사합니다.
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
CompletableFuture 질문
안녕하세요.KafkaProducer future.whenComplete에서throw 하는 코드를 보고 질문 드립니다.코드를 보니까 CompletableFuture로 구현되어 있던데transactional.run 안에서 예외를 잡을 수가 있는지 궁금합니다.코드만 보기로는 whenComplete가 비동기로 동작해서 저기서 예외를 던진다고 누가 받는지 잘 모르겠습니다.제가 스프링 비동기를 구현해보지 않아서 질문드립니다.감사합니다.
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
스프링 빈 질문
안녕하세요.궁금한 점이 있어 질문드립니다.코드를 보면 @Component private class Advice: Runner ...이렇게 내부 클래스가 Private으로 되어 있는데 private으로 선언된 클래스도 component scan 대상이 되나요? 만약 1번에서 안된다면 인자로 받은 Runner가 프록시 빈으로 생성이 안될 것 같은데, 그렇다면 프록시가 제대로 동작하는게 맞는지 궁금합니다. private val advice : Runner = Advice()코드를 보면 만약 빈으로 생성된 인자를 넣지 않는다면 기본 Advice() 를 생성해서 넣는다고 보이는데 이렇게 된다면 Advice 프록시가 자동으로 생성되지 않는다고 생각되고 그렇다면 aop가 작동되지 않을것 같은데 맞는지 궁금합니다.(그래서 기본값을 넣지 않는게 맞지 않나 궁금합니다.) 감사합니다.
-
해결됨코틀린 코루틴 완전 정복
코루틴과 JVM이 끝나는 조건에 대해 문의 드립니다.
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다.- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 어렵게 느껴졌던 Structured Concurrency에 대해 강의를 듣고 많이 이해하고 배워 갑니다. 자바에서는 데몬이 아닌 자식 쓰레드가 끝나지 않으면 메인 쓰레드가 끝났더라도 JVM이 종료가 되지 않는 걸로 알고 있습니다. 따라서 아래 자바 코드는 th01을 join()으로 기다리지 않더라도 JVM은 끝나지 않습니다.public class scratch02 { public static void main(String[] args) throws Exception { Thread th01 = new Thread(()-> { while(true) { System.out.println("I'm working"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); th01.start(); System.out.println("End of the main thread"); } } 그런데 코루틴의 경우 Main Job과 별도의 Root Job으로 수행되는 코루틴의 경우에 아무리 동작 중이더라도 Main Job이 끝나 버리면 JVM이 종료 되어버리죠. 자바나 코틀린이나 같은 JVM에서 동작할 텐데 이런 차이는 왜 발생하는 걸까요? 즉, 같은 질문이긴 한데 코루틴은 어떻게 Main Thread가 종료 될 때 다른 코루틴이나 쓰레드의 종료를 기다리지 않고 JVM을 종료 할수 있게 되는 것인가요?
-
해결됨코틀린 코루틴 완전 정복
Job() 생성후 complete을 불러 주어야 하는 경우가 헷깔립니다.
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다.- 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요.Job() 생성시에 어떤 경우는 compete을 호출해 주어야 하고 어떤 경우는 아닌 것 같은데 그 상황이 헷깔려서 문의 드립니다. 강의에서는 다음과 같이 설명 합니다.launch나 async 함수를 통해 생성한 job객체는 모든 코드가 실행 되면 자동 완료 되지만 job 생성 함수를 통해 생성한 job 객체는 자동으로 실행 완료 되지 않습니다. 아래 코드에서는 launch 안에서 생성함수를 통해 생성한 job 객체는 자동 완료 되지 않는 것으로 보입니다.fun main() = runBlocking<Unit> { launch(CoroutineName("Coroutine1")) { launch(CoroutineName("Coroutine2") + Job(parent = this.coroutineContext[Job])) { delay(100L) println("[${Thread.currentThread().name}] 코루틴 실행") } } } 하지만 아래 코드에서는 똑같이 생성함수를 통해 생성된 job 객체인데도 자동 완료 되는 이유는 무엇인가요? fun main() = runBlocking<Unit> { launch(CoroutineName("Coroutine1")) { val newJob = Job() launch(CoroutineName("Coroutine2") + newJob) { delay(100L) println("[${Thread.currentThread().name}] 코루틴 실행") } } }
-
미해결KotlinConf 2025 발표 세션
오류) Kotlin과 Spring: 모던 서버 사이드 스택
초반에 소리가 안 나옵니다.
-
미해결코틀린 고급편
SuperTypeSafeCage에 대해 질문드립니다
val superTypeToken = object:SuperTypeToken<List<GoldFish>>(){} val superTypeSafeCage = SuperTypeSafeCage(); superTypeSafeCage.putOne(superTypeToken,listOf(GoldFish("금붕어1"),Carp("새"))) superTypeSafeCage.getOne(superTypeToken).forEach(::println)superTypeToken은 List<GoldFish> 전용토큰인데 실제 Carp를 putOne 하여도 데이터가 삽입이 됩니다. 또한 superTypeSafeCage.getOne(superTypeToken) 입력 시 Carp까지 조회되네요.해당 부분에 대한 유효성 검사를 각각 진행해야 되는건가요?
-
미해결KotlinConf 2025 발표 세션
강의 자료 받을 수 있을까요?
강의 자료 받을 수 있을까요?
-
해결됨프로덕션 레벨 실시간 채팅 서버 구축: 분산 처리부터 성능 최적화까지 (Kotlin & Spring)
api모듈에대해 문의드립니다.
안녕하세요, 선생님! 좋은 강의 감사합니다.사이드 프로젝트를 진행하기 위해 이 강의를 신청해서 열심히 듣고 있습니다.강의를 들으면서 궁금한 점이 생겨서 질문 드립니다.제가 예매 시스템을 개발하려고 하는데, 다음과 같은 여러 기능들을 구현해야 합니다:채팅 기능 (강의에서 다루신 Chat API)AI 추천 기능 (Spring AI에서 제공하는 API)데이터 수집 기능 (크롤링 API)기타 예매 관련 API들이런 상황에서 모듈 구조 설계에 대해 고민이 됩니다.방법 1: 모든 API 기능들을 하나의 API 모듈에서 관리 방법 2: 기능별로 모듈을 나누고, 각 모듈 내에서 해당 기능의 API들을 그룹화어떤 방식이 더 적절한 설계일까요?혹시 이런 다중 기능을 가진 시스템에서의 모듈 설계에 대한 조언을 해주실 수 있을까요?감사합니다!
-
미해결예제로 뿌수는 코틀린 Kotlin 76제
Null 안정성 관련 질문
Null 을 다루는 방법에 대해서 말씀하신 예제에서는 자바에서도 동일하게 실행할 수 있는데 이 코드가 왜 코틀린에서 우아하게 대처할 수 있는 기능이라고 말씀하셨는지가 궁금합니다.
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
널 아님 단언 관련 질문
태현님! 안녕하세요, 먼저 이런 좋은 강의를 만들어 주셔서 감사드립니다 🙂다만, 듣다가 또 하나의 질문이 있어서 말씀드리고 싶습니다! 바로 널 아님 단언 관련입니다!예제 코드에서는 아래와 같이 작성을 해주셨는데요!fun startsWith(str: String?): Boolean { return str!!.startsWith("A") }이런 경우 str 파라미터가 null이 들어올 가능성이 있지만 해당 코드를 실행할때 null이 절대 아니야라고 명시적으로 표현하기 위하여 !!를 붙여준다고 이해했습니다!다만, 이런 경우는 굳이 널 아님 단언을 사용하는게 아니라 파라미터의 String?타입을 String으로 두면 어떨까 싶은 생각이 들어서요! 이렇게 된다면 굳이 널 아님 단언을 사용할 필요가 없어 보이는데 다른 곳에서 사용하는 예시가 따로 있는지 궁금하여 질문을 드리게 되었습니다!
-
해결됨Claude + IntelliJ로 TodoList 개발하기 - MCP 완전 정복
MCP가 제 로컬 디렉토리와 파일을 어떻게 알 수 있나요?
안녕하세요 강의 수강 중 궁금한 것이 생겨서 질문 드립니다.강의에서 Claude에게 우리 로컬에 있는 스프링(인텔리제이) 파일 구조를 묻고 Claude는 권한을 물은 뒤 구조를 분석해줬는데 여기에서 Claude에도 제트브레인 관련 플러그인(JSON 파일)을 설정해주어서 Claude에게 질문을 했을 때 Claude MCP 서버가 제트브레인 MCP로 요청을 해서 내용을 받은 것이라고 이해했고 제트브레인 MCP 서버는 강의에서 인텔리제이에 MCP 서버 플러그인을 설치해서 내 로컬의 파일 구조를 상호작용을 통해 알 수 있을 거라고 추측하고 있는데(맞게 이해했는 지는 잘 모르겠네요ㅎ..) 그러면 제트브레인의 MCP는 Claude MCP 서버가 주는 요청이 내 로컬의 인텔리제이 IDE의 내용이라는 것을 어떻게 알 수 있는 걸까요?강의 내용과는 무관할 수 있는데 궁금해서 질문 남깁니다. 감사합니다!
-
미해결코틀린 고급편
좋은 코드 예시
안녕하세요 코틀린 강의 초급, 고급 다 잘 들었습니다. 저는 웹 백앤드 개발자인데요.MVC 패턴 등으로 여러 코드들을 공부 & 회사에 적용시키고 싶은데, 좋은 코드 예시들은 어디서, 어떻게 찾아볼 수 있을까요!? github 에서 검색한다면 키워드는 보통 어떤식으로 찾아볼 수 있을까요? 등등 팁 같은 것 알려주시면 감사하겠습니다.감사합니다!
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
강의 중 질문
태현님 안녕하세요. 강의 잘 수강하고 있습니다. 다만, 궁금한 점이 존재하여 질문을 드리게 되었습니다! 연산자 오버로딩에 operator 키워드를 이용하여 연산자 오버로딩을 하여 객체끼리 연산자 +를 이용하여 해당 메서드가 호출되었는데 이런 연산자 오버로딩은 메서드명으로 추론을 하는걸까요? 메서드 명을 다르게 변경하니 아예 operator 키워드에서 컴파일 에러가 발생하더라구요! 갑자기 이런 부분이 궁금해져서 질문드립니다!
-
미해결윤재성의 Kotlin(코틀린) 안드로이드 15 앱개발 Part2 - 메뉴와 4대 구성요소
파일공유
예제들 프로젝트 파일은 공유가 안되어 있을까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
activity_main 화면 다름
처음 최신버전 다운로드 법을 똑같이 따라헸는데 화면이 다릅니다. split layout을 해도 화면과 동시에 코드가 보이지도 않습니다.
-
미해결코틀린 고급편
val 키워드도 setValue가 있나요?
by lazy 위임 프로퍼티 강의에서 by 키워드를 사용하려면 getValue 함수와 setValue 함수가 필요하다고 하셨는데 val 키워드로 변수 선언 시 setValue가 존재할수 없지 않나요? var 키워드 -> getValue(),setValue()val 키워드 -> getValue()로 by 키워드를 사용할 수 있는것같아 질문드립니다.
-
미해결코틀린 고급편
반공변성 질문드립니다.
Cage4 클래스로 반공변성 설명해주시는 부분에 실제 사용 예제가 없는 것 같습니다.혹시 다른 곳처럼 예시코드 부탁드려도 될까요?
-
해결됨은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스
redisConfig 질문입니다
package org.example.config import org.redisson.Redisson import org.redisson.api.RedissonClient import org.redisson.config.Config import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Primary import org.springframework.data.redis.connection.RedisConnectionFactory import org.springframework.data.redis.connection.RedisStandaloneConfiguration import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory import org.springframework.data.redis.core.RedisTemplate import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer import org.springframework.data.redis.serializer.StringRedisSerializer import java.time.Duration @Configuration class RedisConfig { @Bean fun redisConnectionFactory( @Value("\${database.redis.host}") host: String, @Value("\${database.redis.port}") port: Int, @Value("\${database.redis.password:${null}}") password: String?, @Value("\${database.redis.database:${0}}") database: Int, @Value("\${database.redis.timeout:${10000}}") timeout: Long, ) : LettuceConnectionFactory { val config = RedisStandaloneConfiguration(host, port).apply { password?.let { setPassword(it) } setDatabase(database) } val clientConfig = LettuceClientConfiguration.builder() .commandTimeout(Duration.ofSeconds(timeout)) .build() return LettuceConnectionFactory(config,clientConfig) } @Bean @Primary fun redisTemplate(connectionFactory : RedisConnectionFactory): RedisTemplate<String, String> { val template = RedisTemplate<String, String>() template.connectionFactory = connectionFactory template.keySerializer = StringRedisSerializer() template.valueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.hashKeySerializer = StringRedisSerializer() template.hashValueSerializer = Jackson2JsonRedisSerializer(String::class.java) template.afterPropertiesSet() return template } @Bean fun redissonClient( @Value("\${database.redisson.host}") host: String, @Value("\${database.redisson.timeout}") timeout: Int, @Value("\${database.redisson.password:${null}}") password: String?, ) : RedissonClient { val config = Config() val singleServerConfig = config.useSingleServer() .setAddress(host) .setTimeout(timeout) if (!password.isNullOrBlank()) { singleServerConfig.setPassword(password) } return Redisson.create(config).also { println("redisson create success") } } }An annotation argument must be a compile-time constant와 같은 에러가 나는데 강의 파일 코드로도 같은 에러가 납니다
-
미해결2시간으로 끝내는 코루틴
코루틴과 가상 스레드의 차이가 궁금합니다.
안녕하세요. 좋은 강의 감사드립니다.코루틴에 대한 설명을 듣고 보니,자바 21에 등장한 Virtual Thread와 그 개념이 매우 비슷하다고 생각이 들었습니다.코루틴을 실행시키는 스레드는 어찌보면 Virtual Thread 의 carrier thread로 생각할 수 있고,코루틴 자체를 virtual thread 라고 생각해보면,결국 두 개념이 용어만 다를 뿐 결과적으로는 동일한 기능(?)을 수행하는 것으로 보입니다.제가 궁금한 것은 자바에서 Virtual Thread로 작성된 코드가 100퍼센트 코틀린 - 코루틴으로 변환 가능한지,그리고 그 역도 성립하는 것인지 궁금합니다.감사합니다.