๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค2024 ์•ˆ๋“œ๋กœ์ด๋“œ/Filmo ์˜ํ™” ํ”„๋กœ์ ํŠธ

launch๋Š” ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค. (async, await , first etc)

by hyeonha 2024. 10. 11.

๋ชฉ์ฐจ

    ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

    ๐Ÿฅ์˜ค๋Š˜ ๋ง‰ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

    launch ์˜ ์“ฐ์ž„์ƒˆ

    ์šฐ์„  ๊ฐœ๋ฐœ ์ค‘์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด launch๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

    viewModelScope.launch { ``` }
    
    lifecycleScope.launch { ``` }

     

    ์œ„ ์ฝ”๋“œ๋Š” ๊ฐ๊ฐ ๋ทฐ๋ชจ๋ธ๊ณผ ์•กํ‹ฐ๋น„ํ‹ฐ ๋˜๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ๊ฐ™์€ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ์— ์—ฐ๊ฒฐ๋œ ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

     

    ๋‚˜๋„ ๋”ฑ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์•Œ๊ณ  launch๋ฅผ ์‚ฌ์šฉํ•ด์™”๋‹ค...

     

    ์šฐ์„  ์˜ค๋Š˜ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ์˜ํ™”๋ช…์„ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค.

    ์ด ๋•Œ api๋ฅผ ์ด 3๊ฐœ ํ˜ธ์ถœํ•ด์ฃผ์–ด์•ผํ–ˆ๋‹ค.
    ์•„๋ž˜์™€ ๊ฐ™์ด A api ํ˜ธ์ถœ ๊ฒฐ๊ณผ ๋ฐ›์€ ๊ฐ์ƒ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฐ์ƒ๋ฌธ์˜ id๋ฅผ ์–ป๊ณ , ๊ทธ id๋ฅผ ํ†ตํ•ด B api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜ํ™” ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค.

    ์˜ํ™” ์ •๋ณด์—์„œ ์˜ํ™” id ๊ฐ’์„ ํ†ตํ•ด C api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ์•ผ ์˜ํ™” ๋ช…์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜€๋‹ค.

     

    ๊ทธ๋ ‡๊ฒŒ ์–ป์€ ์˜ํ™”๋ช…์€ ๊ฐ๊ฐ์˜ ๊ฐ์ƒ๋ฌธ์—์„œ ๋ณด์—ฌ์•ผํ•œ๋‹ค.

    ๊ทธ๋ž˜์„œ ๋‚˜๋Š” aunch๋ฅผ ํ†ตํ•ด ๋ทฐ๋ชจ๋ธ์—์„œ ์ฝ”๋ฃจํ‹ด ์Šค์ฝ”ํ”„๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ์„œ ์–ป์€ movieName์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๊ฐ์ƒ๋ฌธ ๋ฐ์ดํ„ฐ์— add ํ•ด์ฃผ์—ˆ๋‹ค. 

     

    ๊ฒฐ๊ณผ, ์˜ํ™”๋ช…์ด ํ™”๋ฉด์— ํ•˜๋‚˜๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋‹ค.

     

    ๋ฐ”๋กœ launch๋ฅผ ์‚ฌ์šฉํ•ด์คŒ์œผ๋กœ์จ ๋‚˜ํƒ€๋‚œ ๋ฌธ์ œ์˜€๋Š”๋ฐ ,, 

     

    launch ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์ง€๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ ค์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๊ฐ์ƒ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ํ™”๋ช…์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

     

    launch waits for no one...

     

    ๋”ฐ๋ผ์„œ ์ง€๊ธˆ ํ•„์š”ํ•œ ๊ฒƒ์€ ?!

    ์˜ํ™”๋ช… ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ฐ์ƒ๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋‹ค๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

    ์ด๋ฅผ ์œ„ํ•ด async์™€ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋‚ด๊ฐ€ ๊ธฐ๋‹ค๋ ค์ค„๊ฒŒ !!! async & await

    async๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋ฃจํ‹ด์„ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜
    await๋Š” ๊ทธ ์ฝ”ํˆฌ๋ฆฐ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

     

    ์ด ๋‘๊ฐ€์ง€๋ฅผ ํ†ตํ•ด ์˜ํ™”๋ช… ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋œ ํ›„ ๊ฐ์ƒ๋ฌธ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์–ด ์˜ํ™” ์ด๋ฆ„์„ ์ œ๋Œ€๋กœ ํ‘œ์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

    ์ฆ‰ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

     

    ๋‚˜๋Š” ๊ฐ ๊ฐ์ƒ๋ฌธ ์•„์ดํ…œ ๋งˆ๋‹ค ์˜ํ™” ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…ใ…‡๋ฅด async๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ awaitAll() ๋กœ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๊ฐ์ƒ๋ฌธ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋„๋ก ํ–ˆ๋‹ค.

     

    val reports =
                  reportList?.map { reportItem ->
                                async {
                                    ReportItem(
                                        reportItem.reportId,
                                        reportItem.title,
                                        reportItem.content,
                                        reportItem.createDate,
                                        reportItem.imageUrl,
                                        reportItem.nickname,
                                        reportItem.likeCount,
                                        reportItem.replyCount,
                                        reportItem.bookmarkCount,
                                        bookmarkList.any {
                                            it.reportId == reportItem.reportId
                                        },
                                        checkLikeStateUseCase(reportItem.reportId).first(),
                                         // ์˜ํ™”๋ช…์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜ 
                                        getName(reportItem.reportId),
                                    )
                                }
                            }?.awaitAll() // ๊ธฐ๋‹ค๋ฆฐ๋‹ค

     

    ๊ทธ๋ฆฌ๊ณ  ์˜ํ™”๋ช…์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

     private suspend fun getName(reportId: String): String {
                return withContext(Dispatchers.IO) {
                    val report = getReportUseCase(reportId).firstOrNull()
                    report?.let {
                        getMovieNameUseCase(DetailMovieRequest(it?.movieId.toString())).firstOrNull() ?: ""
                    } ?: ""
                }
            }

     

    ์—ฌ๊ธฐ์„œ๋„ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์› ๋Š”๋ฐ flow ๋ณ€์ˆ˜์—์„œ ๊ฐ’์„ ๋ฐ›์„ ๋•Œ collect๋งŒ ์‚ฌ์šฉํ•ด์™”์—ˆ๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ first๋ฅผ ํ†ตํ•ด์„œ๋Š” ๋‹จ ํ•œ๋ฒˆ์˜ ๊ฐ’์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

     

     firstOrNull()

    - ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ๊ฐ’์„ ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ฐ’์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๋‹ค.

    - ํ๋ฆ„์ด ๋‹จ ํ•œ๋ฒˆ์˜ ๊ฐ’์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     collect

    -  flow์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜

    - ์—ฐ์†์ ์ธ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค

     

    ์ฆ‰ collect๋Š” ํ๋ฆ„์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ณ  firstOrNull์€ ์ฒซ๋ฒˆ์งธ ๊ฐ’๋งŒ์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

     

    ๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ๋œ ํ™”๋ฉด์ด๋‹น

    ์˜ํ™”๋ช…์ด ์ž˜ ๋œจ๊ณ  ์žˆ๋‹ค ใ…Žใ…Ž

    728x90