(๐Ÿ˜จ ์˜ค๋ฅ˜ ์ •์ •) ๐Ÿค” 2025๋…„๋„์—๋„ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋ฃจํ‹ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ์— ๋ฐค์ƒ˜๊ฐ? ๐Ÿ˜จ (2025ํ•™๋…„๋„ ์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ์˜์—ญ ๋ฌธ์ œํ’€์ด)

(๐Ÿ˜จ ์˜ค๋ฅ˜ ์ •์ •) ๐Ÿค” 2025๋…„๋„์—๋„ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋ฃจํ‹ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ์— ๋ฐค์ƒ˜๊ฐ? ๐Ÿ˜จ (2025ํ•™๋…„๋„ ์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ์˜์—ญ ๋ฌธ์ œํ’€์ด)

๋ณธ๋ฌธ

์ด ๊ธ€์€ 2025 ์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ ์˜์—ญ์— ๋‚˜์˜จ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ธ€์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ์ „์ฒด๋ฅผ ๋‹ด์ง€ ์•Š๊ณ , ์ค‘์š”ํ•œ ํ•ด์„ค์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ •์ •

24.12.11 ํ•ด์„์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ ๊ฒ€์ฆ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ์‹  Larry, ์†ก์ค€์˜๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ ์˜์—ญ ํ›„๊ธฐ ๊ธ€

์–ด๋–ค ๋ฌธ์ œ์ผ๊นŒ?

์ฝ”๋ฃจํ‹ด Exception ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ๋ฒ”์œ„๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ด์„์„ ๋‹ด๋Š” ๊ธ€์ด๋‹ค.

๋Œ€๋žต ์ ์–ด๋ณด๋ฉด

- ์ตœ์ƒ์œ„ Job A๋Š” viewModelScope.launch๋กœ ์ƒ์„ฑ๋˜๊ณ  ๋‚ด๋ถ€์—์„œ B, C๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
- B์—์„œ๋Š” coroutineScope ๋‚ด์—์„œ D, E๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
- C์—์„œ๋Š” withContext(Dispatchers.IO) ๋‚ด์—์„œ F๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๋ชจ๋“  Job์ด Finish ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •

A-F๊นŒ์ง€ ๋ชจ๋‘ Job์ด ๋ฆฌํ„ด๋œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ๋ชจ๋“  Job์ด ๋™์ž‘ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค.

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ธ€์€ ์ด๋ฏธ ๊ณผ๊ฑฐ์—๋„ ์ž‘์„ฑํ–ˆ์–ด์„œ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด๋‘๊ฒ ๋‹ค.

์ด ๋‘ ๊ฐœ์˜ ๊ธ€์„ ์ดํ•ดํ•œ๋‹ค๋ฉด ์‚ฌ์‹ค ํ•ด์„ํ•  ํ•„์š”๋„ ์—†์ง€๋งŒ, ์ƒˆ๋กœ์šด ๋งˆ์Œ์œผ๋กœ ๊ธ€์„ ์ ์–ด๋ณธ๋‹ค.

์ด ๊ธ€์—์„œ๋Š”

  • 2025 ์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ ์˜์—ญ์— ๋‚˜์˜จ ๋ฌธ์ œ ์ผ๋ถ€๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.
  • Job์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฌธ์ œ์˜ ํ•ด์„

๋ชจ๋“  ์‹คํ–‰์—์„œ Job์„ ๊ฐ€์ง€๋ ค๋ฉด launch {}๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

async๋Š” DeffDeferred T๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ์— ์ ์ ˆํ•˜์ง€ ์•Š์€ ์‹คํ–‰์— ํ•ด๋‹นํ•˜๊ธฐ์— ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// A์˜ ์‹คํ–‰
viewModelScope.launch {
    // B์˜ ์‹คํ–‰
    launch {
        coroutineScope {
            // D์˜ ์‹คํ–‰
            launch { }
            // E์˜ ์‹คํ–‰
            launch { }
        }
    }
    // C์˜ ์‹คํ–‰
    launch {
        withContext(Dispatchers.IO) {
            // F์˜ ์‹คํ–‰
            launch { }
        }
    }
}

์ด ๋ฌธ์ œ๋ฅผ ํ•ด์„ํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

Coroutine builder๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ์˜ CoroutineContext๋Š” ํ•˜์œ„(์ž์‹) ๋ชจ๋‘ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๋ฉด fold๋ฅผ ํ†ตํ•ด ํ•ฉ์‚ฐํ•œ๋‹ค.

๋‹จ, Job์€ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ œ๋ฏธ๋‚˜์ด์˜ ์„ค๋ช…์ด๋‹ค.

๋งŒ์•ฝ Job์ด ์ƒ์†๋œ๋‹ค๋ฉด, ๋ถ€๋ชจ ์ฝ”๋ฃจํ‹ด์˜ Job์ด ์ทจ์†Œ๋  ๋•Œ ์ž์‹ ์ฝ”๋ฃจํ‹ด๋„ ํ•จ๊ป˜ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ์ฝ”๋ฃจํ‹ด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ์ฝ”๋ฃจํ‹ด์ด ๋…๋ฆฝ์ ์ธ Job์„ ๊ฐ€์ง€๋„๋ก ํ•จ์œผ๋กœ์จ, ์ฝ”๋ฃจํ‹ด์˜ ์ทจ์†Œ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํ•ฉ์‚ฐํ•˜๊ณ  ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Job์€ ์˜ˆ์™ธ๋กœ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š”๋‹ค.


ํ•จ์ •๋„ ์ฐพ์•„๋ณด์ž.

์ด ๋ฌธ์ œ์—๋Š” 2๊ฐ€์ง€ ํ•จ์ •์ด ์žˆ๋‹ค. ๋ฐ”๋กœ coroutineScope๊ณผ withContext(Dispatchers.IO)์ด๋‹ค.

์ด ์ฝ”๋“œ์—์„œ๋Š” ์‚ฌ์‹ค ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ์–ด์ฐจํ”ผ launch {}๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— blocking์„ ๋งŒ๋“œ๋Š” coroutineScope๊ณผ withContext(Dispatchers.IO) ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์€ ์˜๋ฏธ๊ฐ€ ์—†๊ณ  ํ•จ์ •์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ์„ค๋ช…์ด๋ผ๋Š” ์ ์ด๋‹ค.


Job?

Job์—๋Š” ํฌ๊ฒŒ 2๊ฐœ ์žˆ๋‹ค.

๊ทธ๋ƒฅ Job - link๊ณผ SupervisorJob - link์„ ๊ฐ€์ง„๋‹ค.

์ด ๋‘˜์€ ๋”ฑ ํ•˜๋‚˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜์œ„ Job์—์„œ ๋ฐœ์ƒํ•˜๋Š” Exception ์ผ€์ด์Šค๋กœ ์ธํ•ด ๋ถ€๋ชจ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๊ฐ€ ์•„๋‹Œ๊ฐ€์ด๋‹ค.

์ด์ „ ๊ธ€์—์„œ๋„ ์ž‘์„ฑํ–ˆ์ง€๋งŒ Kotlin Coroutines Exception ์˜ํ–ฅ๋„ ์•Œ์•„๋ณด๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” SupervisorJob์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค.

๋‹คํ–‰ํžˆ android viewModelScope์€ SupervisorJob์„ ๊ธฐ๋ณธ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

Job์€ ๋ผ์ดํ”„ ์‚ฌ์ดํด๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

sample_01

์ด ๋ถ€๋ถ„์„ ๊ผญ ๊ธฐ์–ตํ•  ์ด์œ ๋Š” ์—†์ง€๋งŒ cancel/fail ์ฒ˜๋ฆฌ ์‹œ Cancelled ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

์ด๊ฑธ ์•Œ์ง€ ์•Š๋”๋ผ๋„ ์ฝ”๋ฃจํ‹ด์—์„œ๋Š” exception ๋ฐœ์ƒ ์‹œ runCatch๋งŒ ์ž˜ ๊ฑธ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์žฌ์‹œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•œ ํฌ์ธํŠธ ์•„๋‹๊นŒ ์‹ถ๋‹ค.


๋ฌธ์ œ ํ•ด์„ ์ •์ •.

์œ„ ๋‚ด์šฉ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€ ๊ทธ๋ž˜์„œ ์˜ํ–ฅ๋„๊ฐ€ ์–ด๋””๊นŒ์ง€ ์ „ํŒŒ๋ ๊นŒ์ด๋‹ค.

// A์˜ ์‹คํ–‰
viewModelScope.launch {
    // B์˜ ์‹คํ–‰
    launch {
        coroutineScope {
            // D์˜ ์‹คํ–‰
            launch { }
            // E์˜ ์‹คํ–‰
            launch { }
        }
    }
    // C์˜ ์‹คํ–‰
    launch {
        withContext(Dispatchers.IO) {
            // F์˜ ์‹คํ–‰
            launch { }
        }
    }
}

์ด ์ฝ”๋“œ๋Š” ์–ด๋””์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋“  viewModelScope.launch {}์ธ A๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ฌธ์ œ์— ๋‚˜์˜จ ๋‹ต๋ณ€์€ ์ •๋‹ต์ด ์—†์„ ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ž˜๋„ ๊ถ๊ธˆํ•˜์ž–์•„

๊ทธ๋Ÿผ ์œ„ ์ฝ”๋“œ์—์„œ ์ผ๋ถ€์˜ ์ž‘์—…์„ Job()๋กœ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ํ–ฅ์€ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์งˆ๊นŒ?

์•ž์„œ ์ ์—ˆ๋˜ ์ฝ”๋“œ์— B์˜ ์ž‘์—…์— Job()์œผ๋กœ ์น˜ํ™˜ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ?

// A์˜ ์‹คํ–‰
CoroutinesScope(SupervisorJob()).launch {
    // B์˜ ์‹คํ–‰
    launch(Job()) { // Job์œผ๋กœ ๋ณ€๊ฒฝ
        // D์˜ ์‹คํ–‰
        launch { throw Exception("exception") }
        // E์˜ ์‹คํ–‰
        launch { }
    }
    // C์˜ ์‹คํ–‰
    launch {
        // F์˜ ์‹คํ–‰
        launch { }
    }
}

๊ฐ„๋‹จํ•˜๋‹ค.

  • A๋Š” ๊ตฌ์กฐํ™”๊ฐ€ ๊นจ์ง„ B์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, C ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์—ญ์‹œ ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • B๋Š” ์ƒˆ๋กœ์šด Job์„ ์ƒ์„ฑํ•˜์˜€๊ธฐ์— A์™€ ๋ฌด๊ด€ํ•˜๋ฉฐ D/E์˜ ์ž‘์—… ์‹คํŒจ์— ๋Œ€ํ•œ ์˜ํ–ฅ ๋ฐ›๋Š”๋‹ค.
  • C๋Š” F์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์— ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • C๋Š” ์ƒˆ๋กœ์šด Job์„ ์ƒ์„ฑํ•œ B์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ด๋Ÿฐ ์ด์œ ๋Š” ์ œ๋ฏธ๋‚˜์ด์—์„œ ์„ค๋ช…ํ•œ Job์˜ ์˜ˆ์™ธ ์„ค๋ช…์—์„œ ์ถฉ๋ถ„ํžˆ ์ž˜ ๋‚˜์˜จ๋‹ค.

Job ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€

supervisorScope์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹œ๊ธธ

// A์˜ ์‹คํ–‰
CoroutinesScope(SupervisorJob()).launch {
    // B์˜ ์‹คํ–‰
    supervisorScope {
        launch { // Job์œผ๋กœ ๋ณ€๊ฒฝ
            // D์˜ ์‹คํ–‰
            launch { throw Exception("exception") }
            // E์˜ ์‹คํ–‰
            launch { }
        }
    }
    // C์˜ ์‹คํ–‰
    launch {
        // F์˜ ์‹คํ–‰
        launch { }
    }
}


๊ฐ„๋‹จํ•œ ์›๋ฆฌ ์ •์ • ํฌํ•จ

๋‚ด๋ถ€ ์ฝ”๋“œ๋ž‘ ๋ฌด๊ด€ํ•˜๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

val a = viewModelScope.launch {
    // ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฑฐ๋‚˜
}

val b = viewModelScope.launch {
    // ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฑฐ๋‚˜
}

์œ„์™€ ๊ฐ™์ด a/b์˜ ์ตœ์ƒ์œ„ viewModelScope์— ๋Œ€ํ•œ launch {}๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” a/b ์ค‘ ์–ด๋А ๊ณณ์—์„œ exception์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์„œ๋กœ ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ด์ „์— ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•œ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹น์—ฐํ•˜๊ฒŒ๋„ launch์˜ ์ƒ์œ„ viewModelScope.launch {}๋ฅผ ๋ถ€๋ชจ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์„๊ฑฐ๋ผ๊ณ  ์ฐฉ๊ฐํ•œ ๋ถ€๋ถ„์ด๋‹ค.

private class SupervisorJobImpl(parent: Job?) : JobImpl(parent) {
    override fun childCancelled(cause: Throwable): Boolean = false
}

์ง€๊ธˆ ํ˜„์žฌ์˜ Job๊ณผ Parent Job์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์†Œํ†ตํ•œ๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

private val _parentHandle = atomic<ChildHandle?>(null)
internal var parentHandle: ChildHandle?
    get() = _parentHandle.value
    set(value) { _parentHandle.value = value }

override val parent: Job?
    get() = parentHandle?.parent


๋งˆ๋ฌด๋ฆฌ

๊ฐ„๋‹จํ•˜๊ฒŒ 2025 ์•ˆ๋“œ๋กœ์ด๋“œ ํƒ๊ตฌ์˜์—ญ์˜ Exception ์ „ํŒŒ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€

  • Job์€ cancel/fail ๋ฐœ์ƒ ์‹œ ํ˜„์žฌ ์ƒํƒœ๋ฅผ Cancelled ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • Job์€ ํ•˜์œ„ context์— ์ „๋‹ฌ๋˜์ง€ ์•Š์ง€๋งŒ Parent.job์€ ํ•˜์œ„ Job์—์„œ๋„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
  • SupervisorJob๊ณผ Job์„ ์ค‘๊ฐ„์— ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Job ๋ถ€๋ถ„์€ ๋ชจ๋‘ ์ข…๋ฃŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • launch๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ return ๊ฒฐ๊ณผ๋Š” Job์ด ๋œ๋‹ค.

Job๊ณผ SupervisorJob์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.


์ •์ •ํ•˜๋ฉด์„œ

AI์—๊ฒŒ ์งˆ๋ฌธ์„ ๋‹ค ๋‚จ๊ฒจ๋ณด์•˜๋Š”๋ฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹ต๋ณ€์„ ์ค€๋‹ค.

AI์˜ ์‘๋‹ต์ด 100% ๋‹ต์€ ์•„๋‹ˆ๊ฒ ์ง€๋งŒ ์ผ๋ถ€ ๋งž๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด์•ผ๊ธฐํ–ˆ๊ณ , ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ์„ ์ „๋‹ฌํ•˜๋ฉด์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค. ์ ๋‹นํžˆ ์•Œ๋œฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•œ ๋„๊ตฌ์ž„์€ ๋งž๋‹ค.

๊ฒฐ๊ตญ ์ฝ”๋“œ ๊ฒ€์ฆ์„ ํ†ตํ•ด ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฑธ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋‚˜์„œ ์ˆ˜์ •์€ ํ–ˆ์ง€๋งŒ ์žฌ๋ฏธ์žˆ๋Š” ๋ฌธ์ œ์ž„์€ ๋งž๋‹ค.

์‹ค์ œ ๊ฐœ๋ฐœํ• ๋•Œ๋Š” ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ runCatch๋ฅผ ํ•ญ์ƒ ๋‹ฌ๊ณ  ์‚ฌ์šฉํ•˜๋‹ˆ ํฌ๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋А๋ผ์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค.


์ฝ”๋ฃจํ‹ด ์˜ˆ์™ธ ์ „ํŒŒ์— ๋Œ€ํ•œ ์˜์ƒ ์ถ”๊ฐ€

์šฐํ…Œ์ฝ” ํฌ๋ฃจ ์˜ค๋‘ฅ์ด๋‹˜์˜ ์ฝ”๋ฃจํ‹ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์˜์ƒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.



About Taehwan

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ 12๋…„์ฐจ, ๋ชจ๋ฐ”์ผ์•ฑ ๊ฐœ๋ฐœ์ž ๊ถŒํƒœํ™˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์™€ ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ ๋ฌธํ™”์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. GDG Korea Android์™€ DroidKnights์—์„œ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Comments