<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How-To Guide on Advanced Beginner</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/</link><description>Recent content in How-To Guide on Advanced Beginner</description><generator>Hugo</generator><language>ko-KR</language><managingEditor>d8lzz1gpw@mozmail.com (kimbenji)</managingEditor><webMaster>d8lzz1gpw@mozmail.com (kimbenji)</webMaster><lastBuildDate>Wed, 13 May 2026 06:54:24 +0000</lastBuildDate><atom:link href="https://advanced-beginner.github.io/ko/docs/kotlin/howto/index.xml" rel="self" type="application/rss+xml"/><item><title>코루틴 디버깅</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/coroutine-debugging/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kotlin/howto/coroutine-debugging/</guid><description>&lt;p&gt;비동기 코루틴 코드에서 예외가 어디서 왔는지, 어떤 코루틴이 멈춰 있는지 추적하는 절차를 단계별로 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15~20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;JVM 옵션 &lt;code&gt;-Dkotlinx.coroutines.debug&lt;/code&gt;를 추가하면 스레드 이름에 코루틴 이름이 표시됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CoroutineName(&amp;quot;이름&amp;quot;)&lt;/code&gt;으로 코루틴에 이름을 부여해 로그에서 식별합니다.&lt;/li&gt;
&lt;li&gt;IntelliJ의 Coroutines 탭에서 실행 중인 모든 코루틴 상태를 시각적으로 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kotlinx-coroutines-debug&lt;/code&gt;의 &lt;code&gt;DebugProbes&lt;/code&gt;로 스택 트레이스를 복원합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코루틴 예외의 스택 트레이스가 의미 없는 &lt;code&gt;kotlinx.coroutines&lt;/code&gt; 내부 프레임만 보일 때&lt;/li&gt;
&lt;li&gt;어느 코루틴이 어느 스레드에서 실행 중인지 알 수 없을 때&lt;/li&gt;
&lt;li&gt;코루틴이 완료되지 않고 무한 대기하거나 메모리 누수가 의심될 때&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CancellationException&lt;/code&gt;이 예상치 않게 발생할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 사항&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;kotlinx-coroutines-core&lt;/td&gt;
 &lt;td&gt;1.8.x&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;kotlinx-coroutines-debug&lt;/td&gt;
 &lt;td&gt;1.8.x (선택, 스택 트레이스 복원용)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IntelliJ IDEA&lt;/td&gt;
 &lt;td&gt;2023.1 이상 (Coroutines 탭 지원)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;JVM&lt;/td&gt;
 &lt;td&gt;11 이상&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;의존성 추가 (Gradle Kotlin DSL):&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Null Safety 마이그레이션</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/null-safety-migration/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kotlin/howto/null-safety-migration/</guid><description>&lt;p&gt;Java 코드를 Kotlin으로 이전할 때 null 관련 문제를 안전하게 처리하는 절차를 단계별로 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15~20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;Java에서 넘어온 타입은 Kotlin에서 &lt;strong&gt;플랫폼 타입&lt;/strong&gt;(예: &lt;code&gt;String!&lt;/code&gt;)으로 추론됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Nullable&lt;/code&gt;/&lt;code&gt;@NotNull&lt;/code&gt; 어노테이션을 Java 코드에 추가하면 Kotlin이 올바른 타입을 추론합니다.&lt;/li&gt;
&lt;li&gt;플랫폼 타입은 &lt;code&gt;!!&lt;/code&gt; 대신 &lt;code&gt;?.&lt;/code&gt; 또는 &lt;code&gt;?: 기본값&lt;/code&gt;으로 방어적으로 처리합니다.&lt;/li&gt;
&lt;li&gt;클래스 단위로 점진적으로 마이그레이션하고, 각 단계마다 테스트로 검증합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java 코드를 Kotlin으로 이전 중에 &lt;code&gt;NullPointerException&lt;/code&gt;이 발생할 때&lt;/li&gt;
&lt;li&gt;Kotlin에서 Java 메서드를 호출할 때 반환 타입이 nullable인지 알 수 없을 때&lt;/li&gt;
&lt;li&gt;&lt;code&gt;!!&lt;/code&gt; 연산자를 남발하게 되어 null 안전성의 의미가 없어질 때&lt;/li&gt;
&lt;li&gt;Java 라이브러리를 Kotlin 코드에서 안전하게 사용하는 방법이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에"&gt;시작하기 전에&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;항목&lt;/th&gt;
 &lt;th&gt;요구 사항&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kotlin&lt;/td&gt;
 &lt;td&gt;1.9.x 이상&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;기존 Java 코드&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;@Nullable&lt;/code&gt;/&lt;code&gt;@NotNull&lt;/code&gt; 어노테이션 권장&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IntelliJ IDEA&lt;/td&gt;
 &lt;td&gt;Java to Kotlin 변환 지원&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;어노테이션 의존성:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Gradle Kotlin DSL 팁</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/gradle-kotlin-dsl-tips/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kotlin/howto/gradle-kotlin-dsl-tips/</guid><description>&lt;p&gt;Gradle Kotlin DSL을 실무에서 효율적으로 사용하는 노하우와 자주 쓰는 패턴을 정리합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 10~15분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;libs.versions.toml&lt;/code&gt;(Version Catalog)으로 모든 의존성 버전을 한 곳에서 관리합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buildSrc&lt;/code&gt;나 composite build로 빌드 로직을 재사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plugins { }&lt;/code&gt; 블록은 &lt;code&gt;apply(plugin = &amp;quot;...&amp;quot;)&lt;/code&gt; 대신 사용하는 최신 방식입니다.&lt;/li&gt;
&lt;li&gt;멀티모듈 컨벤션 플러그인으로 반복되는 설정을 DRY하게 유지합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 모듈에서 동일한 Gradle 설정을 복사-붙여넣기하고 있을 때&lt;/li&gt;
&lt;li&gt;의존성 버전이 여러 파일에 흩어져 있어 업데이트가 번거로울 때&lt;/li&gt;
&lt;li&gt;Groovy DSL을 Kotlin DSL로 전환하려는데 문법이 헷갈릴 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1단계-version-catalog-설정-libsversionstoml"&gt;1단계: Version Catalog 설정 (libs.versions.toml)&lt;a class="anchor" href="#1%eb%8b%a8%ea%b3%84-version-catalog-%ec%84%a4%ec%a0%95-libsversionstoml"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;gradle/libs.versions.toml&lt;/code&gt;은 Gradle 7.4부터 지원하는 의존성 버전 중앙화 파일입니다.&lt;/p&gt;</description></item><item><title>Kotest vs JUnit</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/kotest-vs-junit/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kotlin/howto/kotest-vs-junit/</guid><description>&lt;p&gt;Kotest와 JUnit 5 스택을 비교하고, 프로젝트에 맞는 선택과 마이그레이션 절차를 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 15~20분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;JUnit 5 + AssertJ + MockK: 기존 Java 팀의 마이그레이션에 유리, Spring Boot 통합 성숙&lt;/li&gt;
&lt;li&gt;Kotest: Kotlin 네이티브 스타일, BDD 스펙, Property-based Testing 내장&lt;/li&gt;
&lt;li&gt;둘 다 Spring Boot에서 사용 가능하며, 동시에 혼용할 수도 있습니다.&lt;/li&gt;
&lt;li&gt;신규 순수 Kotlin 프로젝트라면 Kotest, Java 혼용 또는 팀 전환 중이라면 JUnit 5를 권장합니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;</description></item><item><title>성능 프로파일링</title><link>https://advanced-beginner.github.io/ko/docs/kotlin/howto/performance-profiling/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><author>d8lzz1gpw@mozmail.com (kimbenji)</author><guid>https://advanced-beginner.github.io/ko/docs/kotlin/howto/performance-profiling/</guid><description>&lt;p&gt;Kotlin/JVM 애플리케이션의 성능 병목을 찾고 최적화하는 절차를 단계별로 안내합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;소요 시간&lt;/strong&gt;: 약 20~25분&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;&lt;ul&gt;
&lt;li&gt;추측하지 말고 &lt;strong&gt;측정 먼저&lt;/strong&gt;. Async Profiler 또는 JFR로 실제 핫스팟을 찾습니다.&lt;/li&gt;
&lt;li&gt;코루틴의 Dispatcher 선택이 성능에 가장 큰 영향을 줍니다. I/O는 &lt;code&gt;Dispatchers.IO&lt;/code&gt;, CPU는 &lt;code&gt;Dispatchers.Default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;람다 캡처와 boxing 비용을 줄이려면 &lt;code&gt;inline&lt;/code&gt; 함수와 원시 타입을 활용합니다.&lt;/li&gt;
&lt;li&gt;JIT 워밍업 전에 측정한 결과는 실제 프로덕션 성능을 반영하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;hr&gt;
&lt;h2 id="이-가이드가-해결하는-문제"&gt;이 가이드가 해결하는 문제&lt;a class="anchor" href="#%ec%9d%b4-%ea%b0%80%ec%9d%b4%eb%93%9c%ea%b0%80-%ed%95%b4%ea%b2%b0%ed%95%98%eb%8a%94-%eb%ac%b8%ec%a0%9c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 상황에서 이 가이드를 사용하세요:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API 응답 시간이 기대보다 느릴 때 어디서 병목이 발생하는지 찾고 싶을 때&lt;/li&gt;
&lt;li&gt;코루틴 전환 후 오히려 성능이 나빠진 것 같을 때&lt;/li&gt;
&lt;li&gt;GC(가비지 컬렉션) 압력이 높아 지연이 발생할 때&lt;/li&gt;
&lt;li&gt;람다와 고차 함수를 많이 쓰는 코드의 오버헤드를 줄이고 싶을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="시작하기-전에-측정-원칙"&gt;시작하기 전에: 측정 원칙&lt;a class="anchor" href="#%ec%8b%9c%ec%9e%91%ed%95%98%ea%b8%b0-%ec%a0%84%ec%97%90-%ec%b8%a1%ec%a0%95-%ec%9b%90%ec%b9%99"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class="book-hint warning"&gt;&lt;strong&gt;추측보다 측정&lt;/strong&gt;&lt;br&gt;성능 최적화는 항상 &lt;strong&gt;측정 → 분석 → 최적화 → 재측정&lt;/strong&gt; 순서로 진행합니다. 코드를 보고 &amp;ldquo;이 부분이 느릴 것 같다&amp;quot;는 직관보다 프로파일러 데이터를 신뢰합니다.
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;측정 지표:&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>